10

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-idleetc. 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.)

+1

Cũng thấy điều này, đó là 99,9% Android 8.0 cho tôi. –

+1

[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_ –

+1

Giống với tôi, có lẽ 100% Android 8.0 có ANR – ARLabs

Trả lời

1

Dùng thử phiên bản mới nhất của FirebasePlay Services SDKs (v. 11.4.2). Đồng thời thay đổi targetSDKVersion thành 26 và BuildToolsVersion thành 26.0.2.

Tôi cũng nhận được lỗi tương tự cho thiết bị Google Pixel/Nexus chạy trên Android 8.0. Tôi chưa nhận được bất kỳ báo cáo mới nào sau khi cập nhật tất cả các thư viện.

Tại sao chúng tôi nhận ANR này và chúng tôi có thể làm gì để tránh điều này?

Không thực sự chắc chắn tại sao điều này xảy ra. Tôi cũng đã liên hệ với bộ phận hỗ trợ Firebase để biết lý do nhưng họ yêu cầu mcve và vì tôi không biết điều gì gây ra sự cố tôi không thể cung cấp mcve. Tôi chỉ đang sử dụng xác thực Firebase trong ứng dụng của mình, vì vậy tôi tin chắc rằng vấn đề có liên quan đến nó.

+0

Cảm ơn bạn đã chia sẻ những gì phù hợp với bạn. Chúng tôi có thể sẽ cố gắng cập nhật lên 'targetSdkVersion 26' và cho bạn biết nếu điều này cũng phù hợp với chúng tôi, nhưng có thể sẽ mất một thời gian cho chúng tôi bởi vì chúng tôi sẽ cần phải ví dụ: giới thiệu các kênh thông báo và thực hiện [các bước di chuyển] khác (https://developer.android.com/about/versions/oreo/android-8.0-migration.html). Tái bút: Chúng tôi không sử dụng xác thực Firebase, chỉ nhắn tin Firebase và phân tích Firebase. –

+1

Tôi đã thực hiện nó nhưng vẫn còn ANR. – meh

Các vấn đề liên quan