29、常见升级兼容性故障排查:logcat分析,systrace与bugreport实战
做系统升级兼容性开发,说白了就是跟各种奇奇怪怪的崩溃、卡顿、黑屏打交道。我刚开始带项目那会儿,遇到问题第一反应就是“重启试试”,后来被领导骂了一顿——你连日志都不看,怎么定位问题?
今天咱们就聊聊三个最趁手的兵器:logcat、systrace、bugreport。这三样东西用好了,90%的兼容性问题都能在半小时内找到根因。
29.1 logcat:第一道防线
logcat是Android日志系统的核心。每次升级后,我第一件事就是打开logcat,过滤关键信息。
29.1.1 常用过滤技巧
别傻乎乎地看全部日志。我习惯用这几个命令:
# 只看错误级别
adb logcat *:E
# 过滤特定标签(比如SystemUI崩溃)
adb logcat -s SystemUI:E
# 同时看多个标签
adb logcat -s ActivityManager:I WindowManager:E
我个人习惯把日志重定向到文件,方便回头翻:
adb logcat -v threadtime > upgrade_log.txt
为什么要加-v threadtime?因为能看到线程ID和时间戳。我在项目中遇到过一个问题:两个线程同时写同一个文件,光看日志内容根本看不出先后顺序,加上时间戳就一目了然了。
29.1.2 关键标签速查表
| 标签 | 含义 | 常见问题 |
|---|---|---|
| ActivityManager | Activity生命周期 | 启动超时、ANR |
| WindowManager | 窗口管理 | 黑屏、布局异常 |
| SystemUI | 系统UI | 状态栏消失、通知不显示 |
| PackageManager | 包管理 | 安装失败、权限拒绝 |
| SurfaceFlinger | 图形合成 | 花屏、掉帧 |
ClassNotFoundException或NoSuchMethodError。这通常意味着新系统删掉了某些API,或者App用了隐藏接口。
29.2 systrace:性能问题的照妖镜
logcat能告诉你“发生了什么”,但systrace能告诉你“为什么这么慢”。
有一次用户反馈:升级后打开相机要等5秒。logcat里没有任何错误,CPU和内存也正常。我抓了一份systrace,一看就发现问题了——相机启动时,有个后台服务在疯狂写数据库,把IO带宽占满了。
29.2.1 抓取systrace的正确姿势
# 抓取10秒,重点关注图形和输入
python systrace.py -t 10 -o trace.html gfx input view wm am
# 如果系统版本较新,用Perfetto
adb shell perfetto -o /data/misc/perfetto-traces/trace.perfetto-trace -t 10s sched freq gfx view
嗯,这里要注意:systrace不要抓太久,10-15秒就够了。抓太久文件太大,打开都费劲。
29.2.2 怎么看systrace
打开生成的trace.html,你会看到一堆彩色条。我一般按这个顺序排查:
- 看FPS曲线——如果掉到30以下,说明有卡顿
- 看SurfaceFlinger——这里显示每一帧的合成耗时
- 看主线程——有没有长时间阻塞(超过16ms就要警惕)
- 看Binder调用——跨进程通信太频繁也会拖慢速度
核心原则:升级后性能问题,90%是这三个原因——主线程干了不该干的活、IO太慢、或者某个服务死循环了。systrace一眼就能看出来。
29.3 bugreport:全量信息快照
bugreport是Android的“体检报告”。它把logcat、dmesg、系统属性、进程列表、网络状态……所有信息打包成一个文件。
我一般在两种情况下用bugreport:
- 问题复现后,需要保留现场
- 问题比较诡异,logcat和systrace都看不出头绪
29.3.1 抓取与解析
# 抓取bugreport
adb bugreport bugreport.zip
# 解压后,主要看这几个文件
bugreport-xxx.txt # 主报告,文本格式
dumpstate_log.txt # 系统状态日志
dmesg.txt # 内核日志
打开bugreport.txt,我一般直接搜这几个关键词:
FATAL EXCEPTION——崩溃信息ANR in——应用无响应lowmemorykiller——内存不足杀进程watchdog——系统看门狗超时
29.4 实战:一次典型的升级兼容性排查
讲个真实案例。某次Android 12升级后,用户反馈“手机待机一晚上,早上起来电量掉了30%”。
排查步骤:
- 先看logcat——发现有个叫
com.xxx.weather的App每隔5分钟就唤醒一次CPU - 再看systrace——确认这个App的定时器触发了频繁的AlarmManager调用
- 最后看bugreport——在
dumpsys alarm部分,看到这个App注册了100多个定时器
根因:这个天气App在Android 12上没适配新的省电策略,定时器没被合并。解决方案:要么让App开发者适配,要么在系统层做限制。
我曾经遇到过更坑的——某个App在升级后疯狂请求位置权限,导致GPS一直开着。logcat里只看到LocationManager的日志,但systrace里能看到GPS芯片一直没休眠。嗯,这种问题光看logcat是不够的。
29.5 三件兵器的配合使用
我画了张图,帮你理清思路:
说白了,这三样东西各有侧重:
- logcat是侦察兵,快速告诉你问题出在哪个模块
- systrace是显微镜,帮你看到每一帧的细节
- bugreport是CT机,把整个系统的状态扫一遍
我个人的排查习惯是:先开logcat复现问题,如果看到明显的异常(比如崩溃堆栈),直接定位。如果问题跟性能有关(卡顿、掉帧),立刻抓systrace。如果问题很诡异(比如待机耗电、随机重启),那就抓bugreport,慢慢翻。
好了,这一章的内容就到这里。记住:工具是死的,思路是活的。多练几次,你也能成为排查高手。
公众号:蓝海资料掘金营,微信deep3321