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

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

adb logcat -v time 

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

adb bugreport > xxx.log

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

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

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

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

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

效果图如下:

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

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

top -m 5 -t

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

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

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

log.tag.SQLiteStatements=VERBOSE log.tag.SQLiteTime=VERBOSE

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

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

    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        while(true) {            System.currentTimeMillis();        }    }

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

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在干嘛?

strace -p 644

输出如下:


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

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

# !/system/bin/sh#这个脚步比较粗糙,是这么个意思file=/sdcard/cpu/cpu_info.logrm $fileuntil [ 1 -gt 10000 ]doecho -e "\n\n\n\n\n---------------">>$filedate >> $filetop -m 5 -n 1 >> $filesleep 3done

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

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

# !/system/bin/sh#这个脚步比较粗糙,是这么个意思file=/sdcard/cpu/mem_info.logrm $fileuntil [ 1 -gt 10000 ]doecho -e "\n\n\n\n\n---------------">>$filedate >> $filedumpsys meminfo com.tianxia.test >> $filesleep 3done

使用方法也是一样。

9.小结
零零碎碎的一直没有时间整理,有常用的也有不常用的,算是一些小技巧,感觉网上这方面的分享比较少,有时和朋友们谈起这些调试方法,特别是龙哥,硬是要求我今天写出来与大家分享,只好献丑,说不定对于解决一些疑难杂症有奇效,呵呵,想到什么写什么吧,想到几个写几个,也是一个学习的记录。

更多相关文章

  1. 【转官方】Android(安卓)ADB调试命令、支持的命令、ADB文档
  2. webview中的javascript调用android命令实现android latex显示
  3. 五年之内,Android(安卓)或将被取代?
  4. 《转》给Android应用开发者的十个建议
  5. 一、Android体系及系统架构
  6. Android(安卓)平板电脑设计
  7. Android应用如何支持屏幕多尺寸多分辨率问题
  8. [转]暑期大学生博客分享大赛 - 2011 Android(安卓)成长篇
  9. Android(安卓)Zipalign工具优化Android(安卓)APK应用

随机推荐

  1. android ios vue 互调
  2. android复合控件
  3. EditeText标签字体大小设置 是否可编辑
  4. Android(安卓)各版本Gradle离线下载
  5. 去除启动edittext时候默认的焦点
  6. Android调用本机地图APP
  7. 2011.09.09 ——— android 2.2 修改安装
  8. android 之摄像头
  9. Android支付宝接口集成
  10. mac 下安装 android apk