Приложения под Android использующие рекламу Admob начали массово падать

    B англоязычных странах, начиная с понедельника, приложения под Android использующие рекламу Admob начали массово вылетать. Больше всего жалоб идет из США.


    Разработчики отмечают, что репортится большое количество багов со следующим стеком

    java.lang.IndexOutOfBoundsException
    at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:156)
    at java.lang.StringBuilder.append(StringBuilder.java:311)
    at libcore.net.UriCodec.appendEncoded(UriCodec.java:114)
    at libcore.net.UriCodec.appendPartiallyEncoded(UriCodec.java:142)
    at java.net.URLStreamHandler.toExternalForm(URLStreamHandler.java:281)
    at java.net.URL.toURILenient(URL.java:510)
    at libcore.net.http.HttpEngine.(HttpEngine.java:192)
    at libcore.net.http.HttpURLConnectionImpl.newHttpEngine(HttpURLConnectionImpl.java:256)
    at libcore.net.http.HttpURLConnectionImpl.initHttpEngine(HttpURLConnectionImpl.java:243)
    at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:78)
    at w.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:856)

    Например, у меня таких багов уже больше 1000.

    Падения не зависят от того, какую версию Admob SDK вы используете.

    В Admob предполагают, что причиной послужила какая-то реклама. Но какая именно пока не знают.
    Метки:
    Поделиться публикацией
    Комментарии 21
    • +1
      У меня норм (55 тыс. показов с понедельника)
      • 0
        Это ж какой URL надо пытаться загрузить, чтобы получить IndexOutOfBoundsException в StringBuilder.append? Больше на баг стандартной библиотеки похоже…
        • +2
          Это похоже на кудрявые руки разработчиков Admob, документация Java явно описывает такое поведение append

          append(CharSequence s, int start, int end);

          Throws: IndexOutOfBoundsException - if start or end are negative, or start is greater than end or end is greater than s.length()
          • 0
            Да, но обратите внимание на то, что вызов идет из UriCodec.appendEncoded. Насколько я помню libcore является частью внутренних библиотек Android.
            • –1
              Но непосредственно-то со StringBuilder Admob не работает! Со StringBuilder работает что-то из libcore, что не выглядит как часть Admob.

              Так или иначе, падает HTTP-клиент, причем на этапе парсинга URL. Вот я и спрашиваю, что же это за URL такой, что вместо стандартного URISyntaxException прилетает IndexOutOfBoundsException.

              PS если бы это был С++ — было бы переполнение буфера со всеми вытекающими последствиями
              • +2
                >> PS если бы это был С++ — было бы переполнение буфера со всеми вытекающими последствиями
                Отвечу коротко: Не всегда.
            • +4
              UPD:
              Судя по исходному коду, такая ошибка возникает, если ссылка заканчивается неполной urlencode-последовательностью, например example.org/page?q=%3.

              Так что проблема все-таки в стандартной библиотеке, поскольку согласно спецификации интерфейса, исключение должно быть выкинуто немного другое.

              Другое дело, что во вспомогательных потоках, не влияющих на основную программу, надо ловить все-таки все исключения, независимо от степени их ожидаемости, тут разработчики Admob действительно прокололись.
            • +1
              А можно увидеть пару ссылок? Например, хотелось бы почитать как именно Admob предполагает и увидеть жалобы из США.
              • 0
                У меня в понедельник было одно письмо, вчера еще одно, а сегодня уже 15. Вот одно из них:

                I am soooooooo incredibly frustrated!!! My problems all started on Monday.....I started getting kicked out of my game 250+ Solitaire Collection.....it was here and there I'd get kicked out. Then Tues it got worse, more frequent, but I could at tines play it for up to a half hour at a time, now its Wed and I can't even move 1 card b4 it kicks me out!!! I even uninstalled it and re-installed it, that didn't help at all. It'll kick me out either when it first loads or usually it waits fir me to pick my game....it doesn't matter which game I pick, once the cards load it kicks me out…
                PLEASE HELP ME FIX THIS!!! This is the ONLY game I play EVERY SINGLE morning.

                А по поводу ссылок забейте в гугл строчку «java.lang.IndexOutOfBoundsException
                at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:156)»
              • 0
                Чувствую народ побежить вставлять try-catch на все вызовы неосновных сторонних библиотек.
                • 0
                  Разрабочики игр почти все делают… Ну по крайней мере крупные…

                  И еще — кроме этого, возможность включать и отключать со стороны сервера.

                  А то сторонние библиотеки они такие — если не падают, то могут в какой нибудь init-е блокирующем весеть долго… И не все позволяют их в отдельную нитку запихнуть… Или любят по 50 http запросов вызвать — каждый в отдельной нитке. Или резко памяти 20 мегабайт занять, хотя до этого 500кб обходились.

                  А вообще — это забота отдельного человека, который как раз занимается вопросом интеграции сторонних SDK в приложение.
                  • 0
                    > А вообще — это забота отдельного человека,

                    Вы буржуй :) Не у всех есть отдельный человек для введения int переменных, а отдельный для String. Фирмы бывают разного размера
                  • 0
                    По стеку это внутренный поток библиотеки Admob и try-catch здесь не помогут
                    • 0
                      Но ведь библиотеку сначала надо вызвать, верно?
                      Я так понял что код спотыкается на вызове «loadAd» (предполагаю, в стеке это предпоследняя строка), которую как раз можно заткнуть.
                      • 0
                        Нет. Это не кусок стека, это весь стек. loadAd без ошибок запускает поток, который через некоторое время крэшит
                  • –7
                    Отличная новость! Надеюсь, сгниют все приложения, авторы которых добавляют в них говно! А то куда не плюнь — везде эта гадость.
                    • 0
                      Вам не стоило писать этого в топике для разработчиков.
                      Почувствуйте себя непонятым :)
                      И искренне желаю Вам большую зарплату, чтобы вы могли покупать наши программы без гумна.
                      • 0
                        я сам вынужден писать софт, который бы не содержал оного
                  • 0
                    Остаётся только порекомендовать людям сделать права Root и установить что-нибудь вроде AdAway :) И рекламы не будет, в том числе и этой проблемы.
                    • 0
                      А тем временем заканчивался 2014… 12 декабря, Android 4.2.2
                      Crashlytics:
                      java.lang.IndexOutOfBoundsException
                             at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:156)
                             at java.lang.StringBuilder.append(StringBuilder.java:311)
                             at libcore.net.UriCodec.appendEncoded(UriCodec.java:114)
                             at libcore.net.UriCodec.appendPartiallyEncoded(UriCodec.java:142)
                             at java.net.URLStreamHandler.toExternalForm(URLStreamHandler.java:281)
                             at java.net.URL.toURILenient(URL.java:510)
                             at libcore.net.http.HttpEngine.(HttpEngine.java:195)
                             at libcore.net.http.HttpURLConnectionImpl.newHttpEngine(HttpURLConnectionImpl.java:265)
                             at libcore.net.http.HttpURLConnectionImpl.initHttpEngine(HttpURLConnectionImpl.java:252)
                             at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:274)
                             at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:495)
                             at com.google.android.gms.internal.cy.aB()
                             at com.google.android.gms.internal.ct$1.run()
                             at com.google.android.gms.internal.cu$1.run()
                             at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
                             at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
                             at java.lang.Thread.run(Thread.java:856)
                      

                      Старые грабли?

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.