6月25日から、広告を使用している2つの無関係なアプリがこのNPEを開始しました
Java.lang.NullPointerException
at zo.a(SourceFile:172)
at aeh.a(SourceFile:120)
at afw.run(SourceFile:14)
at afy.run(SourceFile:30)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1076)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:569)
at Java.lang.Thread.run(Thread.Java:856)
これはグーグルプレイサービスのアップデートに関連していると思います。誰かがこの問題を手伝ってくれる?
問題がPlay開発者サービスに関連していることを確認するために、AdWorkerというスレッドのcrashlyticsからこれを取得することができました。
thread
at Java.lang.Object.wait(Object.Java)
at Java.lang.Thread.parkFor(Thread.Java:1231)
at Sun.misc.Unsafe.park(Unsafe.Java:323)
at Java.util.concurrent.locks.LockSupport.park(LockSupport.Java:157)
at Java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.Java:813)
at Java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.Java:973)
at Java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.Java:1282)
at Java.util.concurrent.CountDownLatch.await(CountDownLatch.Java:207)
at zo.a(SourceFile:147)
at zo.a(SourceFile:170)
at aeh.a(SourceFile:120)
at afw.run(SourceFile:14)
at afy.run(SourceFile:30)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1076)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:569)
at Java.lang.Thread.run(Thread.Java:856)
それは適切な場所ではありません...しかし、それらを報告する場所はまったくありません
例外の数は7月1日から2倍になり、現在は6月27日の約3倍になっています。
Android google code project の問題
グーグルからの最後の返信「私たちはこれらのクラッシュを認識しており、修正に取り組んでいます。来週か2週間でこれらの修正をプッシュすることを望んでいます。」 (7月7日)
https://groups.google.com/forum/#!topic/google-admob-ads-sdk/DkjtCx_Zvn8 でMateusz Matelaによってこのソリューションが見つかりました。
このバグでクラッシュしたMotorolaDEFY +を3回のうち2回試しました。このバグに関連する警告がログに表示されても機能するようです。 「AdWorkerスレッドが例外をスローしました」とも表示されます。アプリを使い続けると、広告が再び表示されました。
final UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
if (thread.getName().startsWith("AdWorker")) {
Log.w("ADMOB", "AdWorker thread thrown an exception.", ex);
} else if (defaultHandler != null) {
defaultHandler.uncaughtException(thread, ex);
} else {
throw new RuntimeException("No default uncaught exception handler.", ex);
}
}
});
今日、Googleはこれを投稿します: http://Android-developers.blogspot.fr/2014/07/google-play-services-5.html
そして今それは私のために働きます。携帯電話でGooglePlayServiceを更新し、ADTを更新してみてください。
編集:
GPSバージョンを確認するコード:
// Check if GooglePlay Service is good;
resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this.getActivity());
if (resultCode != ConnectionResult.SUCCESS) {
if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
GooglePlayServicesUtil.getErrorDialog(resultCode, this.getActivity(), 1).show();
rootView = inflater.inflate(R.layout.fragment_googleplayerror, container, false);
return rootView;
} else {
Log.i(Tag, "This device is not supported.");
getActivity().finish();
}
}
AdmobをGooglePlay開発者サービスに更新した後、異なるAndroidバージョンでまったく同じエラーが発生しました。ユーザー側では解決できないと思います。
これはPlay開発者サービスの更新に関連しています。以下のクラッシュログのサンプルを参照してください。 onCreateでクラッシュするため、ユーザーが広告または特定のタイプの広告をクリックしたときに発生する可能性があります
USER_COMMENT=
Android_VERSION=4.1.2
APP_VERSION_NAME=8.9
BRAND=samsung
PHONE_MODEL=GT-I9100
CUSTOM_DATA=
STACK_TRACE=Java.lang.RuntimeException: Unable to start activity ComponentInfo{xxxxx/com.google.Android.gms.ads.AdActivity}: Java.lang.NullPointerException
at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2110)
at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2135)
at Android.app.ActivityThread.access$700(ActivityThread.Java:140)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1237)
at Android.os.Handler.dispatchMessage(Handler.Java:99)
at Android.os.Looper.loop(Looper.Java:137)
at Android.app.ActivityThread.main(ActivityThread.Java:4921)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:511)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1027)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:794)
at dalvik.system.NativeStart.main(Native Method)
Caused by: Java.lang.NullPointerException
at acm.a(SourceFile:215)
at acz.onTransact(SourceFile:58)
at Android.os.Binder.transact(Binder.Java:326)
at com.google.Android.gms.internal.ck$a$a.onCreate(Unknown Source)
at com.google.Android.gms.ads.AdActivity.onCreate(Unknown Source)
at Android.app.Activity.performCreate(Activity.Java:5206)
at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1094)
at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2074)
... 11 more
Java.lang.NullPointerException
at acm.a(SourceFile:215)
at acz.onTransact(SourceFile:58)
at Android.os.Binder.transact(Binder.Java:326)
at com.google.Android.gms.internal.ck$a$a.onCreate(Unknown Source)
at com.google.Android.gms.ads.AdActivity.onCreate(Unknown Source)
at Android.app.Activity.performCreate(Activity.Java:5206)
at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1094)
at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2074)
at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2135)
at Android.app.ActivityThread.access$700(ActivityThread.Java:140)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1237)
at Android.os.Handler.dispatchMessage(Handler.Java:99)
at Android.os.Looper.loop(Looper.Java:137)
at Android.app.ActivityThread.main(ActivityThread.Java:4921)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:511)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1027)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:794)
at dalvik.system.NativeStart.main(Native Method)
回避策を発見しました。
私の場合、カスタムプロセスで実行されているサービス内から広告を表示していました。例えば:
<service
Android:name="com.example.MyService"
Android:exported="false"
Android:process=":svc"
/>
次に、AndroidManifest.xmlで、宣言されたAdActivityに同じAndroid:process属性を設定すると、問題は解決しました。
<activity
Android:name="com.google.Android.gms.ads.AdActivity"
Android:process=":svc"
Android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
/>
私のアプリケーションの場合、広告アクティビティがどのプロセスで実行されるかは特に気にしないので、この回避策で十分です。うまくいけば、これは他の人にとってある程度役立つでしょう。
6月25日以降、自分のアプリの1つでもまったく同じ問題が発生していました。これはGoogleの問題です。Androidサポートライブラリをバージョン20(Android-support-v4.jarを使用していた)とGoogleを更新することで解決できたと思いますPlay開発者サービスをバージョン17に。
2つのリビジョンのどちらがこれを解決したかはわかりませんが、24時間経ち、クラッシュレポートが停止しました。
編集:申し訳ありませんが、これはまだ解決されていません。しかし、私は彼らがそれを調査しているというAdMod SDKチームからの応答を得ました。 https://groups.google.com/forum/#!topic/google-admob-ads-sdk/DkjtCx_Zvn8
これは部分的な解決策であり、(これまでのところ)クラッシュを100%修正しているようです。このクラッシュを回避するには、広告リクエストを数ミリ秒延期する必要があります。
簡略化した例:
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
AdRequest adRequest = new AdRequest.Builder().build();
adView.loadAd(adRequest);
super.handleMessage(msg);
}
};
if (handler != null) {
handler.sendEmptyMessageDelayed(0, 200);
}
によると: https://groups.google.com/forum/#!topic/google-admob-ads-sdk/DkjtCx_Zvn8
マニフェストのアクティビティAndroid:name = "com.google.Android.gms.ads.AdActivity"にAndroid:theme = "@ Android:style/Theme.Translucent"を追加することで、成功したものもあります。
現在、その修正を含む新しいバージョンを公開しています。それが役立つかどうか数日で表示されます。
他の広告SDKの使用に移動します。私は言及されたもののほとんどを試しましたが、エラーはまだ残っています。そして、私は個人的にそのようなハックをコードに適用するのが嫌いです。そこで、クラッシュやバグのあるgoogle adsdkを使用するのではなく切り替えることにしました。
一時的な半解決策を見つけました。上記のthiagolrアドバイスを使用して、広告リクエストを遅らせます。
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
AdRequest adRequest = new AdRequest.Builder().build();
adView.loadAd(adRequest);
super.handleMessage(msg);
}
};
if (handler != null) {
handler.sendEmptyMessageDelayed(0, 200);
}
また、onResumeメソッドとonPauseメソッドを削除したので、どちらのソリューションが役立つかわかりませんが、この回避策の前は、zo.a(SourceFile:172)で1日あたり100〜130のJava.lang.NullPointerExceptionが発生していました。この回避策の後、1日あたり6〜10個のNullPointerExceptionが発生しました。必要に応じて、このソリューションを個別に試して、どれが役立つかを定義できます。
アクティビティで削除したメソッド:
// @Override
// public void onPause() {
// adView.pause();
// super.onPause();
// }
//
// @Override
// public void onResume() {
// super.onResume();
// adView.resume();
// }