ANR错误:“Broadcast of Intent {act=com.google.firebase.INSTANCE_ID_EVENT} ...“FirebaseInstanceIdInternalReceiver”适用于Android 7.1和8.0

45

我们有一个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,我们该怎么做才能避免它?请注意,在早期的Android版本上,这个问题可以正常工作,这证明了我们没有犯造成ANR的新手错误。

我很难再现这个错误。由于只有在Android 7.1和8.0上出现,因此我认为可能与新的待机模式和节电功能有关,但即使在测试过程中使用adb shell dumpsys deviceidle force-idle也无法重现此问题,将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服务和Firebase版本11.2.0。我们的targetSdkVersion为25。

PS:上面的代码mAnalytics.init(...)给我们一个StrictMode警告,因为这个代码块初始化了Flurry。但这是磁盘访问,而不是网络流量。在这个位置放入SystemClock.sleep(20000);不会触发任何ANR。

为什么会出现ANR,我们该怎么避免?

--

编辑:根据Bob Snyder的建议,在测试了adb shell cmd appops set com.our.package.name RUN_IN_BACKGROUND ignore后。然而,这不会产生任何ANR,只会停止我们的广播接收器运行,如日志中所示:

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注册令牌在安装后会自动刷新。


3
看到这个,我觉得有99.9%的可能是Android 8.0。 - Learn OpenGL ES
1
这个adb命令可能有助于重现问题:adb shell cmd appops set <package_name> RUN_IN_BACKGROUND ignore。它可以模拟无法使用隐式广播和后台服务的情况。 - Bob Snyder
1
对我来说也一样,可能100%的Android 8.0都有这个ANR。 - ARLabs
我也是,而且我只使用分析。 - Dimezis
3个回答

9
这是一个在FCM SDK 9月18日发布中修复的错误:

修复了一个问题,该问题偶尔会导致应用程序在接收消息时崩溃并显示Android无响应(ANR)错误。

更新到com.google.firebase:firebase-messaging:17.3.2或更高版本应该可以解决此问题。如果不能,请联系支持部门

12
对我来说并不适用。 - fillobotto
@fillobotto请通过支持页面联系技术支持,提供您的具体错误信息。他们会帮助您解决问题。 - Jeff
他们只是说不要让FCM和Firebase一起工作。如果他们指的是Android项目,那么情况并非如此。然而,我正在使用旧版FCM从PHP后端发送通知。期待看到新的HTTP v1 API是否可以解决这个问题。 - fillobotto
我今天(2022年7月8日)遇到了这个错误。 - Sujith S Manjavana

2
尝试使用最新版本的Firebase和Play Services SDK(v.11.4.2)。同时将您的targetSDKVersion更改为26,BuildToolsVersion更改为26.0.2。
我在Google Pixel / Nexus设备上运行Android 8.0时也遇到了同样的错误。更新所有库后,我没有收到任何新报告。
“为什么会出现ANR,我们该如何避免?”并不确定为什么会发生这种情况。我也联系了Firebase支持团队以了解原因,但他们要求提供mcve,由于我不知道问题的原因,因此无法提供mcve。 我的应用程序中只使用Firebase身份验证,因此我坚信该问题与之有关。

感谢您分享有效的信息。我们可能会尝试更新到targetSdkVersion 26,并告诉您是否适用于我们,但这可能需要一些时间,因为我们需要引入通知渠道和执行其他迁移步骤等操作。PS:我们没有使用Firebase身份验证,只使用Firebase消息传递和Firebase分析。 - Eirik W
我在 Android O 设备上也遇到了 ANR,有人可以帮忙吗? - Cheerag

-1

应用程序内存泄漏可能是导致com.google.firebase.iid.firebaseinstanceidreceiver ANR的原因之一。

因此,您可以在Android Profiler上验证您的应用程序内存泄漏。如果内存泄漏问题得到解决,则此ANR会自动下降。

希望这对大家有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接