Androidアプリは最近多くのANRエラーが報告されています。これはAndroid 7.1および8.0(4.4、5.0、6.0などではありません)でのみ発生します。 ANRは次のとおりです。
Broadcast of Intent { act=com.google.firebase.INSTANCE_ID_EVENT flg=0x14 cmp=com.our.package.name/com.google.firebase.iid.FirebaseInstanceIdInternalReceiver (has extras) }
質問は次のとおりです:このANRを取得する理由と、これを回避するためにできることは何ですか?私の意見では、ANRの原因となる新人ミスを一切行っていないことを証明しています。
このバグを再現するのは本当に大変です。 Android 7.1および8.0のみであるため、新しい居眠りモードとバッテリー節約に関係しているかもしれませんが、_adb Shell dumpsys deviceidle force-idle
_ etc。 =テストではこの問題は再現されませんが、SystemClock.sleep(20000);
を複数の場所に配置することもありません。
InstanceIdService
のコードは次のとおりです。
_public class InstanceIdService extends FirebaseInstanceIdService {
private Analytics mAnalytics;
@Override
public void onCreate() {
super.onCreate();
mAnalytics = new AnalyticsImpl();
boolean isFullVersion = getApplicationContext().getPackageName().endsWith("full");
mAnalytics.init(getApplicationContext(), isFullVersion);
}
@Override
public void onTokenRefresh() {
boolean initialLoginSucceeded = OurAppNameApplication.getInstance().getSettings().getInitialLoginSucceeded();
mAnalytics.logEvent("FCM_Token_Refresh_Triggered", "initialLoginSucceeded", String.valueOf(initialLoginSucceeded));
if (initialLoginSucceeded) { // We only report the FCM token to our server if the user has logged in at least once
OurAppNameApplication.getInstance().getOurAppNameService().registerDeviceWithRetry();
}
}
}
_
Google Play ServicesとFirebaseバージョン11.2.0を使用します。 targetSdkVersionは25です。
PS:上記のコードmAnalytics.init(...)
は、この Flurryを初期化 のように、StrictMode警告を与えます。しかし、これはネットワークアクセスではなくディスクアクセスです。そして、この場所にSystemClock.sleep(20000);
を入れると、ANRがnotトリガーされます。
ANRを取得する理由と、これを回避するにはどうすればよいですか?
-
Edit:Bob Snyderからのコメントの提案に従って、私は_adb Shell cmd appops set com.our.package.name RUN_IN_BACKGROUND ignore
_でテストしようとしました。ただし、これはANRを生成せず、logcatに示すように、ブロードキャストレシーバーの実行を停止するだけです。
_09-21 10:39:25.314 943-6730/? W/ActivityManager: Background start not allowed: service Intent { act=com.google.firebase.INSTANCE_ID_EVENT pkg=com.our.package.name cmp=com.our.package.name/com.our.package.service.notifications.InstanceIdService (has extras) } to com.our.package.name/com.our.package.service.notifications.InstanceIdService from pid=4062 uid=10139 pkg=com.our.package.name
09-21 10:39:25.314 4062-4062/com.our.package.name E/FirebaseInstanceId: Error while delivering the message: ServiceIntent not found.
_
私の結論は、これはこのANRエラーを再現する正しい方法ではないかもしれないということです。
完全を期すために:テスト時に使用されるすべてのADBコマンドは次のとおりです。
_adb Shell dumpsys deviceidle force-idle
adb Shell dumpsys battery unplug
adb Shell am set-inactive com.our.package.name true
adb install -r our-app.apk
adb Shell cmd appops set com.our.package.name RUN_IN_BACKGROUND ignore
_
(実際には-最後の行は_adb install
_と並行して何度も実行されるため、インストールと復元(設定)が行われ、Firebase登録トークンがインストール後に自動的に更新される前に有効になります。)
これは FCM SDKの9月18日リリース で修正されたバグです。
メッセージを受信すると、アプリがときどきクラッシュするAndroid Not Responding(ANR)エラーが発生する問題を修正しました。
com.google.firebase:firebase-messaging:17.3.2
以降に更新すると、問題が修正されます。そうでない場合は、 サポートにお問い合わせください をご覧ください。
Firebase
およびPlay Services SDKs
の最新バージョンを試してください(v。11.4.2)。また、targetSDKVersion
を26に、BuildToolsVersion
を26.0.2に変更します。
Android 8.0で実行されているGoogle Pixel/Nexusデバイスでも同じエラーが発生しました。すべてのライブラリを更新した後、新しいレポートを受信していません。
このANRを取得する理由と、これを回避するにはどうすればよいですか?
なぜこれが起こっているのか本当に分かりません。 Firebaseサポートにも連絡して理由を知りましたが、彼らは mcve を求めましたが、問題の原因がわからないのでmcveを提供できませんでした。私はアプリでFirebase認証のみを使用しているため、この問題は何らかの原因があると確信しています。