科大訊飛應(yīng)用卡頓分析

背景

收到用戶(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/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、Monkey簡(jiǎn)介: Monkey是Android中的一個(gè)命令行工具,可以運(yùn)行在模擬器里或者現(xiàn)實(shí)設(shè)備中,向系統(tǒng)發(fā)...
    DINGCHAO_閱讀 8,901評(píng)論 3 8
  • 如何定義發(fā)生了卡頓現(xiàn)象: 線(xiàn)下很難復(fù)現(xiàn),與發(fā)生場(chǎng)景強(qiáng)相關(guān)(所以需要我們?nèi)プ隹D監(jiān)控,收集現(xiàn)場(chǎng)信息) CPU相關(guān)知識(shí)...
    今陽(yáng)說(shuō)閱讀 1,042評(píng)論 0 2
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 14,128評(píng)論 2 59
  • 關(guān)于異常 異常? 異常就是一種程序中沒(méi)有預(yù)料到的問(wèn)題,既然是沒(méi)有預(yù)料到的,就可能不在原有邏輯處理范圍內(nèi),脫離了代碼...
    Winterfell_Z閱讀 4,359評(píng)論 1 10
  • 一、Monkey簡(jiǎn)介 Monkey:Android中的一命令行工具,壓力測(cè)試軟件穩(wěn)定性和健壯性 特點(diǎn):1.測(cè)試對(duì)象...
    7i昂閱讀 1,033評(píng)論 0 0

友情鏈接更多精彩內(nèi)容