ANR错误"广播Intent {act = com.google.firebase.INSTANCE_ID_EVENT"..."FirebaseInstanceIdInternalReceiver"for Android 7.1和8.0

Eir*_*k W 39 android firebase firebase-cloud-messaging android-7.1-nougat android-8.0-oreo

我们有一个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的新手错误.

我很难再现这个bug.由于它仅适用于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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我们使用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,它只会阻止我们的Broadcast接收器运行,如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.
Run Code Online (Sandbox Code Playgroud)

我的结论是,这可能不是重现此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
Run Code Online (Sandbox Code Playgroud)

(实际上 - 最后一行与其并行运行多次,adb install以便我们确保它在安装和恢复(设置)完成之前生效,并在安装后自动刷新Firebase注册令牌.)

Jef*_*eff 9

这是在FCM SDK9月18日版本中修复的错误:

修复了在收到邮件时偶尔会导致应用程序因Android Not Responding(ANR)错误而崩溃的问题.

更新com.google.firebase:firebase-messaging:17.3.2或以后应该解决问题.如果没有,请联系支持.

  • 好吧,这不适合我 (3认同)

Ran*_*jan 2

尝试最新版本FirebasePlay Services SDKs(v. 11.4.2)。还将您的值更改targetSDKVersion为 26 和BuildToolsVersion26.0.2。

对于运行 Android 8.0 的 Google Pixel/Nexus 设备,我也收到相同的错误。更新所有库后我还没有收到任何新报告。

为什么我们会收到此 ANR?我们可以采取哪些措施来避免这种情况?

不太确定为什么会发生这种情况。我也联系了 Firebase 支持人员以了解原因,但他们要求提供mcve,并且由于我不知道是什么导致了问题,因此我无法提供 mcve。我在我的应用程序中仅使用 Firebase 身份验证,因此我坚信该问题与此有关。