studio oreo notification notificaciones example app android firebase firebase-cloud-messaging android-7.1-nougat android-8.0-oreo

notificaciones - notification android oreo



Error de ANR "Difusión de Intención{act=com.google.firebase.INSTANCE_ID_EVENT"... "FirebaseInstanceIdInternalReceiver" para Android 7.1 y 8.0 (2)

Tenemos una aplicación para Android que ha reportado muchos errores de ANR últimamente. Esto solo ocurre en Android 7.1 y 8.0 (no en, por ejemplo, 4.4, 5.0 o 6.0). El ANR es:

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 pregunta es: ¿Por qué obtenemos este ANR y qué podemos hacer para evitarlo? Tenga en cuenta que esto funciona bien en versiones anteriores de Android, lo que en mi opinión demuestra que no cometemos ninguno de los errores de novatos que causan el ANR.

Me está costando mucho reproducir este error. Dado que solo está en Android 7.1 y 8.0, creo que puede tener que ver con el nuevo modo adb shell dumpsys deviceidle force-idle y el ahorro de batería, pero incluso con el uso de adb shell dumpsys deviceidle force-idle etc. mientras que las pruebas no reproducen este problema, tampoco lo hace el SystemClock.sleep(20000); varios lugares.

Nuestro código para InstanceIdService es:

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

Usamos Google Play Services y Firebase versión 11.2.0. Nuestro targetSdkVersion es de 25.

PD: El código mAnalytics.init(...) anterior nos da una advertencia de StrictMode, ya que esto inicializa Flurry . Pero este es el acceso al disco, no el tráfico de red. Y poniendo en SystemClock.sleep(20000); En esta ubicación no se activa ningún ANR.

¿Por qué obtenemos un ANR y qué podemos hacer para evitar esto?

-

Edición: De acuerdo con la sugerencia en el comentario de Bob Snyder, he intentado probar con adb shell cmd appops set com.our.package.name RUN_IN_BACKGROUND ignore . Sin embargo, esto no produce ningún ANR, solo detiene la ejecución de nuestro receptor de difusión, como se muestra en 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.

Mi conclusión es que esta puede no ser una forma correcta de reproducir este error ANR.

En aras de la integridad: todos los comandos de ADB que se usan cuando se realizan pruebas son:

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

(De hecho, la última línea se ejecuta muchas veces en paralelo con la adb install modo que estamos seguros de que tendrá efecto antes de que se realice la instalación y restauración (de la configuración) y que el token de registro de Firebase se actualice automáticamente después de la instalación).


Este es un error que se corrigió en la versión del 18 de septiembre del FCM SDK :

Se solucionó un problema que ocasionalmente hacía que las aplicaciones fallaran con los errores de Android Not Responding (ANR) al recibir un mensaje.

La actualización a com.google.firebase:firebase-messaging:17.3.2 o posterior debería solucionar el problema. Si no es así, póngase en contacto con el soporte .


Pruebe la última versión de los Play Services SDKs de Firebase y Play Services SDKs (v. 11.4.2). También cambie su targetSDKVersion a 26 y BuildToolsVersion a 26.0.2.

También recibía el mismo error para los dispositivos Google Pixel / Nexus que se ejecutan en Android 8.0. No he recibido ningún informe nuevo después de actualizar todas las bibliotecas.

¿Por qué obtenemos este ANR y qué podemos hacer para evitarlo?

No estoy realmente seguro de por qué sucede esto. También me puse en contacto con el soporte de Firebase para conocer los motivos, pero me preguntaron por mcve y, como no sé qué está causando el problema, no pude proporcionar mcve. Estoy usando solo la autenticación Firebase en mi aplicación, por lo que creo firmemente que el problema tiene algo que ver con eso.