科大讯飞应用卡顿分析

2021-12-16 18:03:14 浏览数 (1)

背景

收到用户反馈,我们的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的时间 没有其他堆栈信息,无法定位到具体位置

代码语言:javascript复制
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 日志:

代码语言:javascript复制
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/

0 人点赞