java.lang.ClassNotFoundException: android.os.AsyncTask causato da AdMob / Google Play Services?

Dal 21 novembre 2014 ricevo centinaia di rapporti sugli arresti anomali con lo stack qui sotto.

L’arresto anomalo si verifica solo su dispositivi API Level 10 (l’app supporta 9+)

La stessa versione dell’app funzionava bene diverse settimane prima che iniziassero gli arresti anomali. Questo mi fa pensare che il problema sia causato da un aggiornamento over-the-air che è stato recentemente inviato ai dispositivi Android 2.3.

Uso la mediazione AdMob (che ora fa parte della libreria di Google Play Services) e diversi altri SDK della rete pubblicitaria nella mia app.

Sospetto che la libreria dei servizi di Google Play stia causando l’arresto anomalo, in quanto è l’unica parte dell’app che, a quanto mi consta, è probabile che venga aggiornata over-the-air (e questa non sarebbe la prima volta che un aggiornamento buggato provoca arresti anomali).

È ansible, come indicato nella risposta ai PO qui , che un’eccezione non rilevata triggersta all’interno del thread creato da AdMob per visualizzare banner pubblicitari potrebbe mettere l’intero processo in uno stato in cui non è più in grado di creare nuove istanze di classi?

Qualcuno ha sofferto di un problema simile recentemente?

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 

OK, sembra che si tratti di un problema con una delle versioni di Google Play Services. Vedi https://code.google.com/p/android/issues/detail?id=81083

Sembra che una soluzione potrebbe essere quella di aggiungere quanto segue alla tua 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 non dimenticare di configurare la class Application nel tuo AndroidManifest.xml (se non l’hai già fatto).

  ...  

Per espandere la risposta sopra, poiché non sapevo cosa fosse l’Application # onCreate () e non ne avevo già implementato uno nella mia app. Quello che ho fatto è stato creare una nuova class nella mia app con il seguente:

 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(); } } 

Quindi ho aggiornato il file AndroidManifest.xml con android:name="acme.com.myAppName.myApplication" per utilizzare la class myApplication , in questo modo:

  ...  

Lo stesso problema qui, dal 23/11 ho avuto circa 1500 errori ClassNotFoundException su client 2.x, con una tendenza crescente. L’app non è stata aggiornata per mesi, quindi accetto le tue ipotesi sui servizi di google play ota update

Ho circondato il mio adview.loadAd(adrequest); con un blocco catch try e questo ha risolto il mio problema.

Ecco lo snippet di codice:

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