web-dev-qa-db-ja.com

ANRエラー「Broadcast of Intent {act = com.google.firebase.INSTANCE_ID_EVENT」...「FirebaseInstanceIdInternalReceiver」Android 7.1および8.0

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登録トークンがインストール後に自動的に更新される前に有効になります。)

38
Eirik W

これは FCM SDKの9月18日リリース で修正されたバグです。

メッセージを受信すると、アプリがときどきクラッシュするAndroid Not Responding(ANR)エラーが発生する問題を修正しました。

com.google.firebase:firebase-messaging:17.3.2以降に更新すると、問題が修正されます。そうでない場合は、 サポートにお問い合わせください をご覧ください。

9
Jeff

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認証のみを使用しているため、この問題は何らかの原因があると確信しています。

2
Ranjan