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