一、 前言
对于调试方法,在代码适当的位置打印log是很重要的部分,这个大家都知道,这里就不讲如何在自己的代码中打印log了。
这里主要对平时调试时用到的一些命令和调查方法做个分享。
二、 Android 官方调式方法文档
查看地址:developer.android.google.cn/studio/debu…
三、 一些重要log关键字
1、“System now ready”
说明系统已经准备好,接下来会启动SystemUI,Launcher等系统应用。
2、“Starting SystemUI services for user”
说明正在启动SystemUI中的子Services
3、“ActivityManager: START”
能看到当前启动的是界面是哪个应用的,以及当前界面属于哪个Activity
4、“AndroidRuntime”
有程序crash掉的时候,用这个关键字可以搜出报错信息。
5、“Lowmemorykiller”
因内存不足杀死进程的log
四、 一些常用的命令
1、adb shell dumpsys window:
在dump出来的信息中,mCurrentFocus字段后面就是当前界面的一些信息,如Activity的名称等。
2、adb shell dumpsys window displays |head -n 3
查看屏幕分辨率(Linux),屏幕密度(dpi),输出如下内容:
3、adb shell dumpsys meminfo:
查看当前系统内存使用情况,后面跟包名可以查看指定进程的内存占用,输出如下内容:
通过这里统计的Activity数量,也可以简单的判断是否存在Activity泄漏。
4、adb shell am broadcast -a --ei <EXTRA_KEY> <EXTRA_INT_VALUE>
手动发送广播,在调试广播接收器的时候很方便。详细的选项配置请通过命令adb shell am 进行查看。
5、adb shell getevent:
输出触摸信息。其中的0035和0036分别对应触摸点的x和y坐标 。输出如下内容:
其中0035和0036后面的一串数字是16进制数,转化为十进制后,说明这次触摸的点的坐标为(224,228)
6、adb shell dumpsys activity broadcasts
列出最近系统处理过哪些广播(有对应的接收器,才会被列出),输出内容中可以找到广播的详细信息,如下面这段内容:
这段内容说明系统中最近一次处理的前台广播是“com.chinatsp.test3.TESTDEMO”,这是个有序广播,只有一个接收器在接受这个广播,该接收器位于进程com.chinatsp.test3中
7、adb shell dumpsys activity activities
列出当前所有activity信息,其中可以看到堆栈信息,例如下面这段输出内容:
其中列出了其中一个堆栈(stack)中,当前一共有3个task,其中id为39的task中有两个Activity,其中最顶端的Activity是com.chinatsp.test3/.ShuxingActivity
8、adb shell dumpsys power | grep -i wake
可查看当前wake_lock信息,如:
可以看出,当前是有进程“cn.kuwo.service.MainService”持有wake lock,并且wake lock的类型是PARTIAL_WAKE_LOCK。
9、adb shell dumpsys –l
列出所有service。
10、adb shell am stack list
列出当前stack列表信息
11、模拟硬按键
返回键 :adb shell input keyevent BACK
Home键 :adb shell input keyevent HOME
其它硬按键可参考KeyEvent.java中的定义。
五、 利用系统设置中的“开发者选项”
1、显示点按操作反馈
开启后,屏幕被点击的位置会显示一个小圆圈。可调查当前屏幕的触摸响应是否有误。
2、指针位置
开启后,显示触摸轨迹、坐标。
3、显示布局边界、显示surface更新、调试GPU过度绘制
4、启用视图属性检查功能
开启后,可以在AS的Layout Inspector中查看到更多视图信息。
当“启用视图属性检查功能”开关没有打开时,是没有如上图所示的“attributes”一项的。
六、 AndroidStudio 断点调试
这里只需要注意,做系统开发,只能通过“Attach debugger to Android process”按钮(如下图所示),来对对应的进程进行断点调试。这里不再赘述断点调试的具体操作。
注:不同版本的AndroidStudio,这个按钮的位置和形状可能会不同。
七、 ANR 调式
1、从log分析
出现ANR时,会有如下log:
从log可以看到发生ANR的进程包名是com.chinatsp.test3,进程号是16275,发生ANR的原因是处理广播的的intent超时
2、从ANR文件分析
如果从log无法定位ANR的位置,那么从ANR文件中可以获得更详细的信息,ANR的文件保存在设备中的位置,如下图所示:
从其中的anr_2020-05-08-02-02-24-980中可以找到com.chinatsp.test3的ANR信息,如下:
一个ANR文件中有多个ANR信息,每个ANR信息都是以如下格式作为开头和结尾的:
由截图所示的ANR信息,可以看到发生ANR的进程号、包名,以及发生ANR的代码的具体位置。