科大讯飞应用卡顿分析
背景
收到用户反馈,我们的app在科大讯飞的定制系统上,运行卡顿。
1、表现为点击进入应用后,用户点击无响应,系统提示ANR。
2、Debug 运行无卡顿, Release 运行卡顿
分析
获取ANR 的traces文件
方法: /data/anr/ 目录下,查找traces.txt文件
结果:/data/anr/ 目录没有traces.txt的堆栈文件方法:通过 bugreport获取系统错误报
$ adb bugreport查看 bugreport 文件:
grep(查找) ANR in (没有结果)
grep(查找) am_anr 找到发生anr的时间
没有其他堆栈信息,无法定位到具体位置
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.)]
时间: 09-22 10:48:01.699
输入响应超时, 进程号: 5214
进程名称: ******
ANR类型: Input dispatching timed out
分析Release/Debug构建区别
尝试了如下方法:
1、./gradlew assembleRelease 构建本地Release包 // 存在ANR,排除持续集成环境问题
2、build.gradle 文件设置Rlease 的config配置 和 Debug配置对齐 // 定位具体的config配置导致的ANR错误。
引起错误的原因是,Release开启了反调试检测, 反调试组件检测到异常,终止了进程
反调试组件为什么导致ANR?
1、使用Demo 程序加载了 反调试的plugin插件,Demo app直接退出。
2、我们的app 加载反调试的plugin插件, APP一直卡在启动页面,点击出现ANR(app 进程没有被退出)。
查看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 中 发现这样一条日志 Forked child process 22007
。
app 在被kill的时候,又被Forked
了一个新的进程出来,导致app进程一直没有被杀死,出现了ANR
调试过程中使用的命令
adb关闭应用
$ adb shell am force-stop 包名
获取系统信息
$ adb shell getprop ro.build.version.release
9
获取cpu信息
$ adb shell cat /proc/cpuinfo
获取内存信息
$ adb shell cat /proc/meminfo
MemTotal: 1870388 kB = 1826M = 1.78G // 总内存
MemFree: 210684 kB = 205M = 0.2G // 系统可用内存
MemAvailable: 829500 kB = 810M = 0.79G // 应用可用内存 约等于 MemFree + Buffers + Cached
Buffers: 24616 kB = 24M
Cached: 645764 kB = 630M
结论
1、APP发布的Release包,开启了 反调试 验证
2、科大讯飞ROM模式为userdebug,在反调试检测下无法运行(表现是APP出现ANR)
3、反调试kil掉app进程后, 系统又自动fork了一个新的进程启动,启动后检测又失败,如此进入了循环,出现APP卡顿。
参考
获取手机系统的构建模式
https://likfe.com/2017/10/09/android-usermode/