Android系统中Debug的一些小技巧(一)

记得刚参加工作的时候,看log信息看得头昏眼花却依旧不知所云,但是老大和资深同事们总是可以很快就定位到问题,真是无限崇拜。随着工作年限越来越长,也积累一些debug的小技巧来快速定位问题。

以前是做Android TV,现在做Android Tablets,由于面对的是整个Android系统,debug的时候可能会遇到一些小麻烦。如在Settings中打开的界面,在Settings源码中找了半天才发现原来已经调用到Telephony中去了;有时候看着界面根本就不清楚它到底是属于哪个Activity;如何在一堆log信息中找到自己想要的信息;想打开一个界面可视又不想进行很复杂的操作等等。

1.获得当前界面Activity的名称

 已经执行过adb shell,即在模拟器或是真机的shell模式下,使用:dumpsys window|grep mFocusedWindow

没有执行过adb shell,使用:adb shell dumpsys window|grep mFocusedWindow

可以在终端看到输出:mFocusedWindow=Window{eb005d5 u0 com.android.settings/com.android.settings.Settings}

2.打印自己的log信息

adb logcat |grep "zhangmq" 

在代码中加入一些打印消息如: Log.d("zhangmq", "log info");

扫描二维码关注公众号,回复: 13613575 查看本文章

然后使用adb logcat |grep "zhangmq" ,就会过滤出自己想要的log信息。

我使用的频率比较高,特别是对于边操作边输出log信息。

3.在系统中查找文件

find -name 文件名.后缀

可以在整个系统中或是某个模块中查找

find . -name *.cpp|xargs wc -l

4.系统中找字符串

grep -R -n -w "需要找到的字符串" *

这也是定位问题的一个办法,比如出现问题的字符串一时找不到在哪个apk或是属于frameworks中(系统中经常出现这种问题),通过查找到字符串在哪些地方使用来定位问题出现在哪里。

grep -R -n "VideoEditor" --include "*.mk" ./

5.查看apk的包名

aapt dump badging xxx.apk

以前经常使用到,因为有些客户需要把他们指定的一些apk预安装到系统,这样就需要我们自己获取apk的包名以及apk中最先启动的Activity。

6.运行Activity

am start -n packageName/className

如 am start -n com.android.music/com.android.music.MusicBrowserActivity

这个命令很好用,特别是对开机向导之类的Activity或是需要比较复杂才能运行到的Activity。有段时间做开机向导,发现需要复位然后再开机才会运行到相应的Activity,这样不仅麻烦还很耗时间,因为复位后开机的时间真是无比无比长。但是有了这条命令,一切都轻松解决啦。

7.查看SystemProperties的值

getprop wlan.driver

getprop ro.xx.xx.xx

当然也可以设置相应的SystemProperties的值

setprop net.wfd.enable 1

用的相对比较少,但是在代码中遇到流程走向涉及到SystemProperties值的时候,可以查看下。

8.ANR : Application No Response

在log文件中直接搜索"ANR"关键字。

一般产生ANR的原因:

(1)界面操作,例如按钮点击等,等待响应时间超过5S。

(2)HandleMessage回调函数中执行超过10S。

故耗时较长的操作或是处理需要新开一个线程处理。

9.Force Close,即xx stopped

在log文件中搜索"FATAL"关键字。

一般Force Close 产生原因

(1)空指针

(2)资源找不到

(3)类找不到

10.findbugs工具

静态分析工具,检查代码中存在的缺陷和潜在的bugs,例如空指针,字符串判断是否正确,没有用到的条件等等。

11.LeakCanary

用来检测内存泄漏的开源类库

具体的使用和说明:http://www.liaohuqiu.net/cn/posts/leak-canary/

猜你喜欢

转载自blog.csdn.net/hanhan1016/article/details/51605092