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

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

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

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

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

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

Возможно ли, как упоминалось в ответах 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 

ОК, похоже, что это проблема с одной из версий Google Play Services. См. 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 не забудьте настроить класс Application в вашем AndroidManifest.xml (если вы еще этого не сделали).

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

Чтобы расширить ответ выше, поскольку я не знал, что 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> 

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

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

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

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