原始碼剖析Android ANR產生機制
阿新 • • 發佈:2021-11-11
原始碼剖析Android ANR產生機制
如下采用Android原始碼的android-11.0.0_r48分支進行,不同版本原始碼差異巨大。
ANR的捕獲起點為ProcessRecord.appNotResponding方法,本文由appNotResponding逆推ANR的產生機制。
原始碼:frameworks/base/services/core/java/com/android/server/am/ProcessRecord.java。
通過原始碼搜尋appNotResponding,發現系統提供了AnrHelper類,封裝了ProcessRecord.appNotResponding,所有ANR產生後,呼叫都會走到這裡。通過搜尋發現Activity、Broadcast、Service、ContentProvider都會呼叫AnrHelper.appNotResponding,也就是說Android四大元件都有可能產生ANR。
原始碼:frameworks/base/services/core/java/com/android/server/am/AnrHelper.java
Activity ANR
在開始Activity ANR之前,先問個問題:
建立一個Android Hello World工程,新增一個Button,在Button的onClick中回撥SystemClock.sleep(10 * 1000)。
執行App,點選一次按鈕,發現按鈕處於Pressed狀態,因為阻塞了UI執行緒,那麼一直等待,會不會產生ANR呢?結果是不會,10秒後,會看到Button狀態恢復正常,並沒有ANR框彈出,也沒有產生ANR。
執行App,連續點選兩次按鈕,一直等待會不會產生ANR呢?結果是會。