29、常见升级兼容性故障排查:logcat分析,systrace与bugreport实战

做系统升级兼容性开发,说白了就是跟各种奇奇怪怪的崩溃、卡顿、黑屏打交道。我刚开始带项目那会儿,遇到问题第一反应就是“重启试试”,后来被领导骂了一顿——你连日志都不看,怎么定位问题?

今天咱们就聊聊三个最趁手的兵器:logcatsystracebugreport。这三样东西用好了,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 图形合成 花屏、掉帧
小技巧:升级后如果发现某个App闪退,先看logcat里有没有ClassNotFoundExceptionNoSuchMethodError。这通常意味着新系统删掉了某些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,你会看到一堆彩色条。我一般按这个顺序排查:

  1. 看FPS曲线——如果掉到30以下,说明有卡顿
  2. 看SurfaceFlinger——这里显示每一帧的合成耗时
  3. 看主线程——有没有长时间阻塞(超过16ms就要警惕)
  4. 看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——系统看门狗超时
注意:bugreport文件很大,动辄几十MB。别在手机上直接打开,传到电脑上用文本编辑器看。我习惯用VS Code,配合正则搜索效率很高。

29.4 实战:一次典型的升级兼容性排查

讲个真实案例。某次Android 12升级后,用户反馈“手机待机一晚上,早上起来电量掉了30%”。

排查步骤:

  1. 先看logcat——发现有个叫com.xxx.weather的App每隔5分钟就唤醒一次CPU
  2. 再看systrace——确认这个App的定时器触发了频繁的AlarmManager调用
  3. 最后看bugreport——在dumpsys alarm部分,看到这个App注册了100多个定时器

根因:这个天气App在Android 12上没适配新的省电策略,定时器没被合并。解决方案:要么让App开发者适配,要么在系统层做限制。

我曾经遇到过更坑的——某个App在升级后疯狂请求位置权限,导致GPS一直开着。logcat里只看到LocationManager的日志,但systrace里能看到GPS芯片一直没休眠。嗯,这种问题光看logcat是不够的。

29.5 三件兵器的配合使用

我画了张图,帮你理清思路:

升级兼容性故障排查流程 logcat 发生了什么? systrace 为什么慢? bugreport 全量信息快照 典型问题定位 崩溃/闪退 → logcat搜FATAL EXCEPTION ClassNotFoundException, NoSuchMethodError 卡顿/掉帧 → systrace看主线程 SurfaceFlinger合成耗时 > 16ms 耗电/发热 → bugreport搜wakeup AlarmManager, Wakelock, GPS 黑屏/花屏 → logcat + systrace SurfaceFlinger, HWC, GPU 先logcat快速定位 → 再systrace深入分析 → bugreport兜底

说白了,这三样东西各有侧重:

  • logcat是侦察兵,快速告诉你问题出在哪个模块
  • systrace是显微镜,帮你看到每一帧的细节
  • bugreport是CT机,把整个系统的状态扫一遍

我个人的排查习惯是:先开logcat复现问题,如果看到明显的异常(比如崩溃堆栈),直接定位。如果问题跟性能有关(卡顿、掉帧),立刻抓systrace。如果问题很诡异(比如待机耗电、随机重启),那就抓bugreport,慢慢翻。

避坑指南:我曾经犯过一个错误——升级后遇到问题,直接抓bugreport,结果文件太大,打开花了10分钟,还没找到关键信息。后来学乖了:先看logcat缩小范围,再针对性抓systrace或bugreport。别一上来就开大招。

好了,这一章的内容就到这里。记住:工具是死的,思路是活的。多练几次,你也能成为排查高手。


公众号:蓝海资料掘金营,微信deep3321