2014-11-27 2 views
17

С 21 ноября 2014 года я получаю сотни отчетов о сбоях со стеком ниже.java.lang.ClassNotFoundException: android.os.AsyncTask вызвано AdMob/Google Play Services?

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

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

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

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

Можно, как уже упоминалось вуп ответ here, что перехватывается исключение вызвано внутри нити, созданной 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 
+0

Где вы создаете и начать com.myapp.MyClassExtendingAsyncTask от? – William

+0

@William Этот пользовательский AsyncTask создается и запускается из потока пользовательского интерфейса.Его цель довольно распространена: извлекать данные онлайн асинхронно. –

ответ

14

ОК, похоже, что это проблема с одной из версий Служб 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> 
+3

(Я тот, кто подал ошибку 81083). Я применил это обходное решение и, похоже, устранил проблему на всех устройствах 2.3.x. –

0

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

+0

Какие рекламные сети вы используете, если они есть? –

+0

Admob, DFP и Facebook Аудитория, как для баннера, так и для межстраничных объявлений. – P1x

5

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

Привет, Джеймс, это решена ваша авария? У меня также такая же проблема в приложении, как у меня нет класса Application. – Programmer

+0

@Programmer Кажется, это решило! Начиная с развертывания в прямом эфире, я больше не сбой с ошибкой AsyncTask. – James

+0

Хорошо, мой крах также разрешен с помощью обходного пути ур. Большое спасибо. – Programmer

0

I окружил мой adview.loadAd(adrequest); с помощью блока catch catch, и это решило мою проблему.

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

try 
    { 
    adview.loadAd(adRequest); 
    } 
    catch(java.lang.NoClassDefFoundError ncdfe) 
    { 
     ncdfe.printStackTrace(); 
     Log.d("AD ERROR", "ERROR LOADING AD"); 
    } 
Смежные вопросы