背景
收到用戶(hù)反饋,我們的app在科大訊飛的定制系統(tǒng)上,運(yùn)行卡頓。
1、表現(xiàn)為點(diǎn)擊進(jìn)入應(yīng)用后,用戶(hù)點(diǎn)擊無(wú)響應(yīng),系統(tǒng)提示ANR。
2、Debug 運(yùn)行無(wú)卡頓, Release 運(yùn)行卡頓
分析
獲取ANR 的traces文件
方法: /data/anr/ 目錄下,查找traces.txt文件
結(jié)果:/data/anr/ 目錄沒(méi)有traces.txt的堆棧文件方法:通過(guò) bugreport獲取系統(tǒng)錯(cuò)誤報(bào)
$ adb bugreport查看 bugreport 文件:
grep(查找) ANR in (沒(méi)有結(jié)果)
grep(查找) am_anr 找到發(fā)生anr的時(shí)間
沒(méi)有其他堆棧信息,無(wú)法定位到具體位置
09-22 10:48:01.699 1000 949 985 I am_anr : [0,5214,包名******,953695812,Input dispatching timed out (Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago. Wait queue length: 8. Wait queue head age: 6920.6ms.)]
時(shí)間: 09-22 10:48:01.699
輸入響應(yīng)超時(shí), 進(jìn)程號(hào): 5214
進(jìn)程名稱(chēng): ******
ANR類(lèi)型: Input dispatching timed out
分析Release/Debug構(gòu)建區(qū)別
嘗試了如下方法:
1、./gradlew assembleRelease 構(gòu)建本地Release包 // 存在ANR,排除持續(xù)集成環(huán)境問(wèn)題
2、build.gradle 文件設(shè)置Rlease 的config配置 和 Debug配置對(duì)齊 // 定位具體的config配置導(dǎo)致的ANR錯(cuò)誤。
引起錯(cuò)誤的原因是,Release開(kāi)啟了反調(diào)試檢測(cè), 反調(diào)試組件檢測(cè)到異常,終止了進(jìn)程
反調(diào)試組件為什么導(dǎo)致ANR?
1、使用Demo 程序加載了 反調(diào)試的plugin插件,Demo app直接退出。
2、我們的app 加載反調(diào)試的plugin插件, APP一直卡在啟動(dòng)頁(yè)面,點(diǎn)擊出現(xiàn)ANR(app 進(jìn)程沒(méi)有被退出)。
查看logcat 日志:
2021-09-26 09:30:14.887 992-992/? I/Zygote: Process 21231 exited due to signal 9 (Killed)
2021-09-26 09:30:14.888 1546-4458/? I/ActivityManager: Process ****** (pid 21231) has died: fg TOP
2021-09-26 09:30:14.888 1546-4458/? W/ActivityManager: Canceling start item Intent { cmp=******/******.timer.calendar.CalendarSystemAlarmService } in service ******/******.timer.calendar.CalendarSystemAlarmService
2021-09-26 09:30:14.888 1546-4458/? W/ActivityManager: Scheduling restart of crashed service ******/******.timer.calendar.CalendarSystemAlarmService in 426112ms for start-requested
2021-09-26 09:30:14.890 1546-1608/? I/libprocessgroup: Successfully killed process cgroup uid 10271 pid 21231 in 0ms
2021-09-26 09:30:14.891 1546-1594/? D/CompatibilityChangeReporter: Compat change id reported: 135634846; UID 10271; state: DISABLED
2021-09-26 09:30:14.892 1546-1607/? D/CompatibilityChangeReporter: Compat change id reported: 143937733; UID 10271; state: DISABLED
2021-09-26 09:30:14.910 992-992/? D/Zygote: Forked child process 22007
2021-09-26 09:30:14.913 1546-1607/? I/ActivityManager: Start proc 22007:******/u0a271 for top-activity {******/******.WwMainActivity}
在logcat 中 發(fā)現(xiàn)這樣一條日志 Forked child process 22007 。
app 在被kill的時(shí)候,又被Forked了一個(gè)新的進(jìn)程出來(lái),導(dǎo)致app進(jìn)程一直沒(méi)有被殺死,出現(xiàn)了ANR
調(diào)試過(guò)程中使用的命令
adb關(guān)閉應(yīng)用
$ adb shell am force-stop 包名
獲取系統(tǒng)信息
$ adb shell getprop ro.build.version.release
9
獲取cpu信息
$ adb shell cat /proc/cpuinfo
獲取內(nèi)存信息
$ adb shell cat /proc/meminfo
MemTotal: 1870388 kB = 1826M = 1.78G // 總內(nèi)存
MemFree: 210684 kB = 205M = 0.2G // 系統(tǒng)可用內(nèi)存
MemAvailable: 829500 kB = 810M = 0.79G // 應(yīng)用可用內(nèi)存 約等于 MemFree + Buffers + Cached
Buffers: 24616 kB = 24M
Cached: 645764 kB = 630M
結(jié)論
1、APP發(fā)布的Release包,開(kāi)啟了 反調(diào)試 驗(yàn)證
2、科大訊飛ROM模式為userdebug,在反調(diào)試檢測(cè)下無(wú)法運(yùn)行(表現(xiàn)是APP出現(xiàn)ANR)
3、反調(diào)試kil掉app進(jìn)程后, 系統(tǒng)又自動(dòng)fork了一個(gè)新的進(jìn)程啟動(dòng),啟動(dòng)后檢測(cè)又失敗,如此進(jìn)入了循環(huán),出現(xiàn)APP卡頓。
參考
獲取手機(jī)系統(tǒng)的構(gòu)建模式
https://likfe.com/2017/10/09/android-usermode/