Java.lang.ClassNotFoundException: android.os.AsyncTask, вызванное службами AdMob/Google Play?

С 21 ноября 2014 года я получаю сотни отчетов о сбоях со стеком ниже.

Сбой происходит только на устройствах уровня API 10 (приложение поддерживает 9 +)

Сама же версия приложения работала отлично за несколько недель до начала сбоев. Это заставляет меня думать, что проблема вызвана некоторым обновлением, которое было перенесено на устройства Android 2.3 в последнее время.

Я использую посредничество AdMob (которое теперь входит в библиотеку Служб Google Play) и несколько других SDK для рекламных сетей в моем приложении.

Я подозреваю, что библиотека Google Play Services вызвала крах, так как это единственная часть приложения, которая, насколько мне известно, скорее всего, будет обновлена ​​по эфиру (и это будет не первый раз ошибка при сбое вызывает сбои).

Возможно ли, как упоминалось в OPs ответить здесь, что невостребованное исключение, вызванное внутри потока, созданного AdMob для показа рекламных объявлений , может весь процесс в состоянии, когда он больше не может создавать новые экземпляры классов?

В последнее время кто-то страдал от подобной проблемы?

java.lang.NoClassDefFoundError: com.myapp.MyClassExtendingAsyncTask
at com.myapp.x.run(SourceFile:417)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3859)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:647)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: com.myapp.MyClassExtendingAsyncTask in loader dalvik.system.PathClassLoader[/data/app/com.myapp-1.apk]
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
... 10 more

Ответы

Ответ 1

ОК, похоже, что это проблема с одной из версий Служб Google Play. См. https://code.google.com/p/android/issues/detail?id=81083

Похоже, что работа может заключаться в добавлении следующего к вашему Application#onCreate():

package acme.com.myAppName;

import android.app.Application;

public class MyApplication extends Application
{
    @Override
    public void onCreate()
    {
        // begin add
        try {
            Class.forName("android.os.AsyncTask");
        } catch(Throwable ignore) {
        }
        // end add

        super.onCreate();
    }
}

NB не забудьте настроить свой класс приложения в AndroidManifest.xml (если вы еще этого не сделали).

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:name="acme.com.myAppName.MyApplication" >
...
</application>

Ответ 2

Чтобы развернуть ответ выше, поскольку я не знал, что Application # onCreate() было и еще не реализовало его в моем приложении. То, что я сделал, это создать новый класс в моем приложении со следующим:

package acme.com.myAppName;

import android.app.Application;

public class myApplication extends Application
{
    @Override
    public void onCreate()
    {
        try
        {
            Class.forName("android.os.AsyncTask");
        }
        catch(Throwable ignore){}

        super.onCreate();
    }
}

Затем я обновил свой файл AndroidManifest.xml с помощью android:name="acme.com.myAppName.myApplication", чтобы использовать класс myApplication, например:

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:name="acme.com.myAppName.myApplication" >
...
</application>

Ответ 3

Такая же проблема здесь, с 23/11 я получил около 1500 ошибок ClassNotFoundException на клиентах 2.x с растущей тенденцией. Приложение не обновлялось в течение нескольких месяцев, поэтому я соглашаюсь с вашей гипотезой о сервисе google play ota update

Ответ 4

Я окружил мой adview.loadAd(adrequest); блоком try catch, и это решило мою проблему.

Вот фрагмент кода:

    try
    {
    adview.loadAd(adRequest);
    }
    catch(java.lang.NoClassDefFoundError ncdfe)
    {
        ncdfe.printStackTrace();
        Log.d("AD ERROR", "ERROR LOADING AD");
    }