web-dev-qa-db-fra.com

Erreur ANR "Diffusion de l'intention {act = com.google.firebase.INSTANCE_ID_EVENT" ... "FirebaseInstanceIdInternalReceiver" pour Android 7.1 et 8.0

Nous avons une Android qui a signalé de nombreuses erreurs ANR récemment. Cela ne se produit que sur Android 7.1 et 8.0 (pas par exemple sur 4.4, 5.0 ou 6.0). L'ANR c'est:

Broadcast of Intent { act=com.google.firebase.INSTANCE_ID_EVENT flg=0x14 cmp=com.our.package.name/com.google.firebase.iid.FirebaseInstanceIdInternalReceiver (has extras) }

La question est: Pourquoi obtenons-nous cet ANR, et que pouvons-nous faire pour éviter cela? Notez que cela fonctionne très bien sur les versions antérieures d'Android, qui à mon avis prouve que nous ne faisons aucune des erreurs de recrue causant l'ANR.

J'ai beaucoup de mal à reproduire ce bogue. Puisqu'il est uniquement sur Android 7.1 et 8.0, je pense que cela peut avoir à voir avec le nouveau mode somnolence et l'économie de batterie, mais même en utilisant adb Shell dumpsys deviceidle force-idleetc. alors que le test ne reproduit pas ce problème, ni mettre SystemClock.sleep(20000); à plusieurs endroits.

Notre code pour InstanceIdService est:

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

Nous utilisons les services Google Play et la version 11.2.0 de Firebase. Notre targetSdkVersion est de 25.

PS: Le code mAnalytics.init(...) ci-dessus nous donne un avertissement StrictMode, car cela initialise Flurry . Mais c'est l'accès au disque, pas le trafic réseau. Et mettre SystemClock.sleep(20000); à cet emplacement ne pas déclenche tout ANR.

Pourquoi obtenons-nous un ANR et que pouvons-nous faire pour éviter cela?

-

Edit: Selon la suggestion dans le commentaire de Bob Snyder, j'ai essayé de tester avec adb Shell cmd appops set com.our.package.name RUN_IN_BACKGROUND ignore. Cependant, cela ne produit aucun ANR, cela empêche seulement notre récepteur de diffusion de fonctionner, comme indiqué dans 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.

Ma conclusion est que ce n'est peut-être pas une façon correcte de reproduire cette erreur ANR.

Par souci d'exhaustivité: toutes les commandes ADB utilisées lors des tests sont:

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

(En fait - la dernière ligne est exécutée plusieurs fois en parallèle avec le adb install Afin que nous soyons sûrs qu'elle prend effet avant l'installation et la restauration (des paramètres) et que le jeton d'enregistrement Firebase est automatiquement actualisé après l'installation. )

38
Eirik W

Il s'agit d'un bug qui a été corrigé dans la version du 18 septembre du SDK FCM :

Correction d'un problème qui provoquait parfois le blocage des applications avec des erreurs Android Ne pas répondre (ANR) lors de la réception d'un message.

Mise à jour vers com.google.firebase:firebase-messaging:17.3.2 ou une version ultérieure devrait résoudre le problème. Si ce n'est pas le cas, veuillez contacter le support .

9
Jeff

Essayez la dernière version de Firebase et Play Services SDKs (v. 11.4.2). Modifiez également votre targetSDKVersion en 26 et BuildToolsVersion en 26.0.2.

Je recevais également la même erreur pour les appareils Google Pixel/Nexus fonctionnant sur Android 8.0. Je n'ai reçu aucun nouveau rapport après la mise à jour de toutes les bibliothèques.

Pourquoi obtenons-nous cet ANR et que pouvons-nous faire pour éviter cela?

Je ne sais pas vraiment pourquoi cela se produit. J'ai également contacté le support Firebase pour en connaître les raisons, mais ils ont demandé mcve et comme je ne sais pas ce qui cause le problème, je n'ai pas pu fournir mcve. J'utilise uniquement l'authentification Firebase dans mon application, donc je crois fermement que le problème a quelque chose à voir avec cela.

2
Ranjan