【调试篇3】Android 问题分析思路闲谈

900 阅读7分钟

“携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

每日正能量:当你足够努力,幸运总会与你不期而遇

本篇是自己总结的处理问题的一些思路,如果你是一位新人,正面临处理问题没有思路,那么该篇文章就是你的入门利器;如果你是一位大佬,那么可以绕道而过了。

该文将一直持续更新,希望可以将方法分享给更多的小伙伴,当然,如果你有更多更好的处理思路,欢迎一起交流,一起学习进步……

1 Log 工具使用

1.1 查看 Log

  1. 查看android log
adb logcat -v time 
  1. 查看radio log
adb logcat -b radio  
  1. 查看event log
adb logcat -b events -v threadtime 
adb logcat -b events -v time > log_events.txt

抓取 event log 信息: 打印系统事件的日志、比如触屏事件、进程的创建和销毁、Activity的创建、暂停和销毁

  1. 串口log

有串口就用串口抓取,输入logcat,没有的话就用adb logcat > log.txt

  1. 查看kernel log
adb shell dmesg

1.2 Log 过滤

  1. TAG过滤
adb logcat -s TAGA TAGB
  1. 关键字过滤
logcat |grep TAG
  1. 进程过滤
logcat | grep "pid"

2 adb 调试手段

2.1 dumpsys 查看服务的状态信息

1. adb shell dumpsys input 查看窗口接收事件顺序
2. adb shell dumpsys SufraceFlinger 查看窗口的层次和大小
3. dumpsys 扩展 Log 功能
4. dumpsys | grep DUMP 或 dumpsys | grep "DUMP OF SERVICE" 查看支持的所有命令
5. dumpsys window
6. adb shell dumpsys window |findStr mCurrentFocus  查看当前window
7. adb shell am broadcast -a   模拟广播
8. adb shell dumpsys activity activities 打印activity栈

2.2 属性操作

adb shell setprop *** false  设置属性
adb shell getprop ***  获取属性
adb shell settings put system *** 1    settings值设置
adb shell setting get system ***   settings值获取
adb shell dumpsys settings > settings.txt

2.3 打印状态

1. adb shell dumpsys -t 40 meminfo   打印内存
2. adb shell dumpsys activity broadcast  打印广播
3. adb shell ls -la  列出目录
4. adb shell "pm list packages -f |grep com.android.settings"  查看应用的分区
5. adb shell pmp clear com.android.settings 清理数据
6. adb shell pm disable com.android.setting  停掉应用
7. adb shell dumpsys package permission 查看权限
8. adb shell pm path package 查看安装路径

2.4 查看是否配置到common_path名单

1. adb shell cat data/enginneermode/common_path.txt |findStr launcher 显示com.android.launcher
2. adb shell ls /system/etc/common_path 查看common_path目录内容

2.5 在文件中搜索字符串

adb shell grep "volte.default.off" /system/etc/ -r -n >fes.txt

2.6 扩展功能

adb shell dumpsys 扩展功能,例如:adb shell dumpsys alarm

上面为常用的功能,如果你想了解更多,直接点击 adb 可以查看官方更多文档

3 Android SDK 工具

3.1 aapt2

aapt2 dump strings output.apk 输出apk的资源表字符串池的内容
aapt2 dump resources output.apk 输出apk的资源表的内容
aapt2 list -v -a   查看apkinfo

3.2 apkanalyzer

这里就不作过多了介绍了,建议将官方的命令行工具都可以了解一下

4 停止运行分析思路

  1. 分析AssertLog
  2. 查看 main log
  3. 分析解决 try-catch 正面解决

由于篇幅问题,详细Crash、ANR问题这里不过多展开,后续有空再补上

5 资源NotFoundException问题分析思路

【举例】 Caused by: android.content.res.Resources$NotFoundException:Unable to find resource ID#0x7f020110

  1. 根据报错堆栈在代码中找到资源名或根据资源ID在R.java或者aapt dump中找到资源名,确定资源类型、名字(命令为:aapt dump resources ****.apk | findstr "0x7f020130"),直接找到资源名
  2. 从机器中pull出apk直接查看就行,查看各分辨率是否定义

6 进程被杀分析思路

  1. 进入应用任意界面,执行adb shell dumpsys activity top查看应用的包名
  2. 执行adb shell ps |grep 包名中关键字,查看应用对应的进程,以了解应用拉起的进程数
  3. 在main log中搜索包名、died等关键字,通过pid查看是什么原因导致进程被杀掉。
  4. 杀进程一般是用forcestop,main log里面会有force stopping ... from pid ***  或是 killing ... ,通过pid查看是谁发起的
  5. 在event log中搜索am_kill等关键字,查找是什么原因导致被杀掉
  6. 在kernel log中看lowmemorykiller有没有生效

7 显示问题分析思路

7.1 响应异常

按键或者触摸屏幕,手机没有响应或者响应异常
问题分类

  1. 硬件问题
  2. 框架服务
  3. 事件未传给应用
  4. 应用逻辑错误

分析思路
是否应用问题>>>是否硬件和框架问题>>>确定事件传给哪个窗口>>>

  1. 加 log 打印确认事件是否响应(Event),应用是否有 log 输出
  2. 硬件问题一般多个地方都有问题
  3. 打开"开发者选项"中的“指针位置”,看是否有指针操作显示,屏幕上是否有操作
  4. dumpsys input确定窗口接受事件的顺序,查看 Input Dispatcher State,判断 Windows 接受事件的顺序
Input Dispatcher State:
DispatchEnabled: true
DispatchFrozen: false
InputFilterEnabled: false
FocusedDisplayId: 0
FocusedApplications:
displayId=0, name='ActivityRecord{6ff861b u0 com.android.contacts/.activities.ContactEditorActivity t697}', dispatchingTimeout=5000ms
FocusedWindows:
displayId=0, name='Window{160df03 u0 com.android.contacts/com.android.contacts.activities.ContactEditorActivity}' ---当前窗口
TouchStates: <no displays touched>
Display: 0
  1. dumpsys SurfaceFlinger 查看窗口层级 Display 19260339585306497 HWC layers:

7.2 显示异常

问题分类

  1. 花屏(无规则,诡异)
  2. 黑屏
  3. 闪屏
  4. 定屏
  5. 其他(拉伸,不完整等)

分析思路

  1. 花屏分析思路

    • 花屏>>>截图显示>>>截图正常>>>打开停用 HW 叠加层>>>无此问题(HW 叠加问题) --------------------->>>截图不正常>>>关闭硬件加速>>>无此问题,硬件加速问题,(多媒体) --------------------------------------->>>应用分析
      查看截屏图片,图片是否正常

    • 打开“停用HW叠加层”进行对比(停用HW叠加层,始终使用 GPU 进行屏幕合成)

    • 强制关闭硬件加速,进行对比

    • 多媒体内存泄漏可能导致花屏

  2. 黑屏、闪屏分析思路

    • 黑屏、闪屏>>>关闭动画>>>正常>>>窗口切换动画问题>>>查看动画设置、dump图形layer层数据 ----------------------------->>>不正常>>>dump图形layer层数据>>>是否是starting窗口的问题>>>

    • 关闭动画

    • dumpsys layer 层

    • 查看SurfaceView的生命周期与页面的销毁的时机

  3. 定屏问题分析思路

    • 首先判断当前的焦点的原因,分析无刷新的原因

8 数据库问题分析

adb shell content query --uri content://com.android.contacts/raw_contacts > D:\raw_contacts.txt
这章待补充完整

9 CTS 相关问题分析思路

关于CTS问题,之前已经总结过,这里就不再赘述了,有兴趣的话可见【兼容篇1】Android CTS问题分析思路(CTS、GTS、BTS、GSI)

10 性能问题分析思路

内存、卡顿、功耗、稳定性等问题,也是常遇见的基本问题,这类问题严重影响用户体验,也是衡量一个APP质量的关键,这类问题的思路前面写过一个分析策略,详细可见【性能篇5】Android性能优化策略

11 进程运行在32位、64位分析思路

11.1 当前运行在32位、64位核查

ps -A 
查看zogyte 父进程 跑在32位, zogyte64 跑在64位

判断当前是32还是64的方法:

dumpsys package
看下各应用的primaryCpuAbi和SecondaryCpuAbi

  1. 如果primaryCpuAbi和SecondaryCpuAbi都是null,则是64位;
  2. 如果SecondaryCpuAbi是null,那么看primaryCpuAbi
    1. 如果primaryCpuAbi是armeabi-va7或者armeabi,则是32位
    2. 如果primaryCpuAbi是arm64-v8a,则是64位
  3. 如果primaryCpuAbi和SecondaryCpuAbi都不是null,则32位、64位都有可能

11.2 能否运行在32位、64位核查

分析思路:解压APK,查看lib库下面的arm中so库是否32位、64位都有