Gần đây, chúng tôi có một ứng dụng Android có nhiều lỗi ANR được báo cáo gần đây. Điều này chỉ xảy ra trên Android 7.1 và 8.0 (không phải trên 4.4, 5.0 hoặc 6.0). Các ANR là:Lỗi ANR "Phát sóng mục đích {act = com.google.firebase.INSTANCE_ID_EVENT" ... "FirebaseInstanceIdInternalReceiver" cho Android 7.1 và 8.0
Broadcast of Intent { act=com.google.firebase.INSTANCE_ID_EVENT flg=0x14 cmp=com.our.package.name/com.google.firebase.iid.FirebaseInstanceIdInternalReceiver (has extras) }
Câu hỏi đặt ra là: Tại sao chúng ta có được ANR này, và những gì chúng ta có thể làm gì để tránh tình trạng này? Lưu ý rằng điều này hoạt động tốt trên các phiên bản Android trước đó, theo ý kiến của tôi chứng minh rằng chúng tôi không làm bất kỳ lỗi nào của tân binh gây ra ANR.
Tôi đang gặp khó khăn trong việc tái tạo lỗi này. Vì nó chỉ chạy trên Android 7.1 và 8.0, tôi nghĩ rằng nó có thể phải làm với chế độ ngủ gật mới và tiết kiệm pin, nhưng thậm chí sử dụng adb shell dumpsys deviceidle force-idle
etc. trong khi thử nghiệm không tái tạo vấn đề này, cũng không đặt SystemClock.sleep(20000);
một số địa điểm.
Mã của chúng tôi cho InstanceIdService
là:
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();
}
}
}
Chúng tôi sử dụng dịch vụ và căn cứ hỏa lực phiên bản 11.2.0 Google Play. TargetSdkVersion của chúng tôi là 25.
PS: Mã số mAnalytics.init(...)
ở trên cung cấp cho chúng tôi cảnh báo StrictMode, vì điều này initializes Flurry. Nhưng đây là truy cập đĩa, không phải lưu lượng mạng. Và đặt trong SystemClock.sleep(20000);
tại vị trí này không không kích hoạt bất kỳ ANR nào.
Tại sao chúng tôi nhận ANR và chúng tôi có thể làm gì để tránh điều này?
-
Edit: Theo đề nghị trong các bình luận từ Bob Snyder, tôi đã cố gắng thử nghiệm với adb shell cmd appops set com.our.package.name RUN_IN_BACKGROUND ignore
. Tuy nhiên, điều này không tạo ra bất kỳ ANR, nó chỉ dừng thu phát sóng của chúng tôi từ chạy, như thể hiện trong 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.
Kết luận của tôi là điều này có thể không phải là một cách chính xác để tái sản xuất lỗi ANR này.
Đối với đầy đủ lợi ích: Tất cả các lệnh ADB sử dụng khi kiểm tra là:
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
(Trên thực tế - dòng cuối cùng là chạy nhiều lần song song với adb install
để chúng tôi chắc chắn nó có hiệu lực trước khi quá trình cài đặt và khôi phục (của cài đặt) được thực hiện và mã thông báo đăng ký Firebase được tự động làm mới sau khi cài đặt.)
Cũng thấy điều này, đó là 99,9% Android 8.0 cho tôi. –
[Lệnh adb này] (https://developer.android.com/topic/performance/background-optimization.html#further-optimization) có thể hữu ích để tái tạo sự cố: 'adb shell cmd appops set RUN_IN_BACKGROUND bỏ qua '. _simulates điều kiện mà các chương trình phát sóng ngầm và dịch vụ nền không khả dụng_ –
Giống với tôi, có lẽ 100% Android 8.0 có ANR – ARLabs