android调试的几个命令

来源:互联网 发布:软件开发岗位说明书 编辑:程序博客网 时间:2024/05/21 17:00

http://www.cnblogs.com/qianxudetianxia/archive/2012/05/14/2497073.html

在Android的应用开发中,我们会用到各种代码调试;其实在Android的开发之后,我们可能会碰到一些随机的问题,如cpu过高,内存泄露等,我们无法简单的进行代码调试,我们需要一个系统日志等等,下面我把握工作中碰到的几个常用命令和方法给大家演示实践一下。

1.logcat命令
这个命令最简单常用,可查看帮助,我不多说,如果需要打印时间,加参数-v time

1
adb logcat -v time

2.bugreport命令
这个命令也非常简单,但是在实际应用中非常有用,会有从开机之后详细的dumpsys,dumpstate和logcat信息,是一份完整的日志记录。对分析用户行为,异常信息,系统状态有很大的参考作用。一般我们会把bugreport导出到电脑上分析。

1
adb bugreport > xxx.log

我再次强调,bugreport里面包含丰富的系统和用户信息,它是其他很多命令输出的结果的记录,非常有用。

3.dumpsys命令
这个查看系统信息,用的还是比较多的.

1
2
3
4
5
6
7
dumpsys [options]
               meminfo 显示内存信息
               cpuinfo 显示CPU信息
               account 显示accounts信息
               activity 显示所有的activities的信息
               window 显示键盘,窗口和它们的关系
               wifi 显示wifi信息

例如查看某个程序内存信息:

1
2
#查看应用com.tianxia.test的内存使用情况
adb shell dumpsys meminfo com.tianxia.test

效果图如下:

里面的信息很有价值,尤其对于分析内存泄露,内存溢出都有极大的作用。

4.top命令
这个查看cpu信息太方便了。

1
top -m 5 -t

我们看看效果图,其中按cpu大小列出5个进程列表。

com.tianxia.test的cpu过高,会导致手机发烫。同时利用这个信息,可以监控应用cpu的使用,以调整优化代码。

top命令详细说明如下:
  1. adb shell 
  2. top -h 
  3. top -h 
  4. Usage: top [-m max_procs] [-n iterations] [-d delay] [-s sort_column] [-t] [-h] 
  5.   -m num  Maximum number of processes to display. // 最多显示多少个进程 
  6.   -n num  Updates to show before exiting. // 刷新次数 
  7.   -d num  Seconds to wait between updates. // 刷新间隔时间(默认5秒) 
  8.   -s col  Column to sort by <cpu,vss,rss,thr> // 按哪列排序 
  9.   -t      Show threads instead of processes. // 显示线程信息而不是进程 
  10.   -h      Display this help screen. // 显示帮助文档 
  11. top -n 1 
  12. top -n 1 
 
         就不把执行效果放上来了,总之结果表述如下:
  1. User 35%, System 13%, IOW 0%, IRQ 0% // CPU占用率 
  2. User 109 + Nice 0 + Sys 40 + Idle 156 + IOW 0 + IRQ 0 + SIRQ 1 = 306 // CPU使用情况 
  3.  
  4. PID CPU% S #THR VSS RSS PCY UID Name // 进程属性 
  5. xx  xx% x   xx  xx  xx  xx  xx   xx 
  6.  
  7. CPU占用率: 
  8. User    用户进程 
  9. System  系统进程 
  10. IOW IO等待时间 
  11. IRQ 硬中断时间 
  12.  
  13. CPU使用情况(指一个最小时间片内所占时间,单位jiffies。或者指所占进程数): 
  14. User    处于用户态的运行时间,不包含优先值为负进程 
  15. Nice    优先值为负的进程所占用的CPU时间 
  16. Sys 处于核心态的运行时间 
  17. Idle    除IO等待时间以外的其它等待时间 
  18. IOW IO等待时间 
  19. IRQ 硬中断时间 
  20. SIRQ    软中断时间 
  21.  
  22. 进程属性: 
  23. PID 进程在系统中的ID 
  24. CPU%    当前瞬时所以使用CPU占用率 
  25. S   进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数。 
  26. #THR    程序当前所用的线程数 
  27. VSS Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) 
  28. RSS Resident Set Size 实际使用物理内存(包含共享库占用的内存) 
  29. PCY OOXX,不知道什么东东 
  30. UID 运行当前进程的用户id 
  31. Name    程序名称android.process.media 
  32.  
  33. // ps:内存占用大小有如下规律:VSS >= RSS >= PSS >= USS 
  34. // PSS  Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存) 
  35. // USS  Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存) 

5.配置文件local.prop
目前网上没有查到local.prop的配置使用,工作中本人只使用过如下:

1
log.tag.SQLiteStatements=VERBOSElog.tag.SQLiteTime=VERBOSE

把上述文本加到/data/local.prop中,如果没有这个文件自行创建。然后重启手机,就能看到每个应用详细的查询数据库的sql语句信息,对于调试数据库,分析和优化数据库sql异常非常有用。

6.分析手机发烫
下面我们来实践一个例子,手机发烫太厉害,怎么找出问题?
首先我们写一个程序com.tianxia.test,死循环,核心代码如下:

1
2
3
4
5
6
7
8
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    while(true) {
        System.currentTimeMillis();
    }
}

这个应用打开后会一直获取系统时间,因为在主线程,肯定导致应用ANR,也会一直浪费系统cpu,手机发热,我们运行它。
假设我们不知道上述代码,我们来找到这个问题:
(1).找到发烫的应用。
使用top命令:

1
top -m 5 -t

一看是com.tianxia.test占用85%的cpu,原来是这家伙在捣鬼。进程ID是644,这个后面我们有用。
(2).分析发烫的应用进程在干嘛
需要用到linux下的strace命令,但是android是没有集成这个命令的,android版本的下载地址:
http://benno.id.au/android/strace
下载完成后,上传到手机中:
我们adb push strace /system/bin,在模拟器上是上传到/system/bin会报out of memory错误,我们也可以上传到/data目录下,如果没有执行权限,还需要chmod 777 strace.
strace命令有很多参数,直接执行strace会显示使用说明:


其中-p参数输入的就是进程号,第一步中我们找到com.tianxia.test的进程ID是644,我们看看这个应用占用这么高的cpu在干嘛?

1
strace -p 644

输出如下:


它的系统调用一直是gettimeofday,一直输出这个,显然哪里一定进入死循环了,而且是获取时间的死循环,然后结合logcat和代码,定位这段代码(就是前面我们给出的那段代码了)解决这个bug。

7.采集手机的cpu运行情况.
有时使用日志我们很难针对性的获取我们想要的信息,我们可能需要写一些最简单的脚步放在手机里面执行。
如监控cpu占用的记录cpu_log.sh:

1
2
3
4
5
6
7
8
9
10
11
# !/system/bin/sh
#这个脚步比较粗糙,是这么个意思
file=/sdcard/cpu/cpu_info.log
rm$file
until [ 1 -gt 10000 ]
do
echo -e "\n\n\n\n\n---------------">>$file
date >> $file
top -m 5 -n 1 >> $file
sleep 3
done

每隔3s中就会把手机的cpu的信息写到sdcard的cpu目录下的cpu_info.log文件中,方便我们后续分析。
 ps:使用方法是 push到data目录下,赋予可执行权限,在shell下执行即可。

8.采集某个应用的内存数据
这个实践和上面的脚本类似,只是命令不一样我另外单独列出来,因为这个有时候很有用。
比如,我们要采集com.tianxia.test的内存使用情况,分析它是不是会内存泄露,脚步类似:

1
2
3
4
5
6
7
8
9
10
11
# !/system/bin/sh
#这个脚步比较粗糙,是这么个意思
file=/sdcard/cpu/mem_info.log
rm$file
until [ 1 -gt 10000 ]
do
echo -e "\n\n\n\n\n---------------">>$file
date >> $file
dumpsys meminfo com.tianxia.test >> $file
sleep 3
done

使用方法也是一样。



0 0