【问题标题】:ANR error "Broadcast of Intent { act=com.google.firebase.INSTANCE_ID_EVENT" ... "FirebaseInstanceIdInternalReceiver" for Android 7.1 and 8.0ANR 错误“意图广播 { act=com.google.firebase.INSTANCE_ID_EVENT”... Android 7.1 和 8.0 的“FirebaseInstanceIdInternalReceiver”
【发布时间】:2018-03-01 05:54:38
【问题描述】:

我们有一个 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 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 服务和 Firebase 版本 11.2.0。我们的 targetSdkVersion 是 25。

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

为什么我们会收到 ANR,我们可以做些什么来避免这种情况?

--

编辑:根据 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 注册令牌。 )

【问题讨论】:

  • 我也看到了,99.9% Android 8.0。
  • This adb command 可能有助于重现问题:adb shell cmd appops set <package_name> RUN_IN_BACKGROUND ignore模拟隐式广播和后台服务不可用的情况
  • 对我来说也是这样,可能 100% 的 Android 8.0 都有这个 ANR
  • 这里也一样,我只使用分析

标签: android firebase firebase-cloud-messaging android-7.1-nougat android-8.0-oreo


【解决方案1】:

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

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

希望对大家有所帮助。

【讨论】:

    【解决方案2】:

    这是在September 18 release of the FCM SDK 中修复的错误:

    修复了在接收消息时偶尔会导致应用因 Android 无响应 (ANR) 错误而崩溃的问题。

    更新到com.google.firebase:firebase-messaging:17.3.2 或更高版本应该可以解决此问题。如果没有,请contact support

    【讨论】:

    • 好吧,它不适合我
    • @fillobotto 请contact support 提供您的具体错误消息。他们可以帮助你。
    • 他们只是说不要让 FCM 和 Firebase 一起工作。如果他们指的是 Android 项目,情况并非如此。但是我从 PHP 后端发送带有旧 FCM 的通知。期待看看新的 HTTP v1 API 是否能解决这个问题。
    【解决方案3】:

    试用最新版本的FirebasePlay Services SDKs(v. 11.4.2)。 还将您的 targetSDKVersion 更改为 26,将 BuildToolsVersion 更改为 26.0.2。

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

    为什么我们会得到这个 ANR,我们可以做些什么来避免这种情况?

    不太清楚为什么会这样。我也联系了 Firebase 支持以了解原因,但他们要求 mcve 并且由于我不知道是什么导致了问题,所以我无法提供 mcve。我在我的应用中只使用 Firebase 身份验证,所以我坚信这个问题与它有关。

    【讨论】:

    • 感谢您分享适合您的方法。我们可能会尝试更新到 targetSdkVersion 26 并让您知道这是否也适用于我们,但这可能需要一些时间,因为我们需要例如引入通知渠道并做其他migration steps。 PS:我们没有使用 Firebase 身份验证,仅使用 Firebase 消息传递和 Firebase 分析。
    • 我在 android O 设备上也遇到了 ANR,有人可以帮忙吗?
    猜你喜欢
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多