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注册令牌.)
尝试最新版本Firebase
和Play Services SDKs
(v. 11.4.2)。还将您的值更改targetSDKVersion
为 26 和BuildToolsVersion
26.0.2。
对于运行 Android 8.0 的 Google Pixel/Nexus 设备,我也收到相同的错误。更新所有库后我还没有收到任何新报告。
为什么我们会收到此 ANR?我们可以采取哪些措施来避免这种情况?
不太确定为什么会发生这种情况。我也联系了 Firebase 支持人员以了解原因,但他们要求提供mcve,并且由于我不知道是什么导致了问题,因此我无法提供 mcve。我在我的应用程序中仅使用 Firebase 身份验证,因此我坚信该问题与此有关。
归档时间: |
|
查看次数: |
5211 次 |
最近记录: |