在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的使用,以调整优化代码。

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

1
log.tag.SQLiteStatements=VERBOSE log.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

使用方法也是一样。

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

[转] Android学习系列(29)--App调试的几个命令实践的更多相关文章

  1. Android学习系列(37)--App调试内存泄露之Context篇(下)

    接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...

  2. Android学习系列(36)--App调试内存泄露之Context篇(上)

    Context作为最基本的上下文,承载着Activity,Service等最基本组件.当有对象引用到Activity,并不能被回收释放,必将造成大范围的对象无法被回收释放,进而造成内存泄漏. 下面针对 ...

  3. Android学习系列(7)--App轮询服务器消息

    这篇文章是android开发人员的必备知识. 1.轮询服务器     一般的应用,定时通知消息可以采用轮询的方法从服务器拿取消息,当然实时消息通知的话,建议采用推送服务.    其中需要注意轮询的频率 ...

  4. Android学习系列(15)--App列表之游标ListView(索引ListView)

    游标ListView,提供索引标签,使用户能够快速定位列表项.      也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧.      一看图啥都懂了: 1. ...

  5. Android学习系列(23)--App主界面实现

    在上篇文章<Android学习系列(22)--App主界面比较>中我们浅略的分析了几个主界面布局,选了一个最大众化的经典布局.今天我们就这个经典布局,用代码具体的实现它. 1.预览图先看下 ...

  6. Android学习系列(17)--App列表之圆角ListView(续)

    http://www.cnblogs.com/qianxudetianxia/archive/2011/09/19/2068760.html   本来这篇文章想并到上篇Android学习系列(16)- ...

  7. Android学习系列(18)--App工程结构搭建

     本文算是一篇漫谈,谈一谈关于Android开发中工程初始化的时候如何在初期我们就能搭建一个好的架构.      关于android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的 ...

  8. Android学习系列(11)--App列表之拖拽ListView(下)

    接着上篇Android学习系列(10)--App列表之拖拽ListView(上)我们继续实现ListView的拖拽效果. 7.重写onTouchEvent()方法.     在这个方法中我们主要是处理 ...

  9. Android学习系列(10)--App列表之拖拽ListView(上)

     研究了很久的拖拽ListView的实现,受益良多,特此与尔共飨.      鉴于这部分内容网上的资料少而简陋,而具体的实现过程或许对大家才有帮助,为了详尽而不失真,我们一步一步分析,分成两篇文章. ...

随机推荐

  1. sqlplus 打印很乱,而且很短就换行

    set linesize 可以解决 设置行打印的字符长度,set linesize 400解决

  2. 提升网站用户体验—WebP 图片的高效使用

    一.WebP 的由来 现代图像压缩技术对我们的生活方式影响很大.数码相机能将上千张高质量图片存储到一张内存卡里.智能手机可以与邻近设备快速分享高分辨率的图片.网站与手机等移动设备能快速展示各种富媒体. ...

  3. 使用Python实现Hadoop MapReduce程序

    转自:使用Python实现Hadoop MapReduce程序 英文原文:Writing an Hadoop MapReduce Program in Python 根据上面两篇文章,下面是我在自己的 ...

  4. OOD/DDP 中的 SRP 原则

    单一职责原则 SRP(The Single Responsibility Principle):一个类应该只有一个发生变化的原因.这里的变化指职责的变化. SRP 很好理解,它的要求是 让一个类只做一 ...

  5. 从 mian 函数开始一步一步分析 nginx 执行流程(四)

    如不做特殊说明,本博客所使用的 nginx 源码版本是 1.0.14,[] 中是代码所在的文件! 这一节我们分析ngx_worker_process_cycle(),该函数代码比较少,因为它通过调用函 ...

  6. Robotium 不能同时跑多个case

    最近在用robotium做android自动化测试,遇到单个case可以run成功.多个case run就会卡死到第二个case. 原因是在teardown的时候没有将打开的activity全部fin ...

  7. 【转】MFC下拉列表框的用法

    原文网址:http://blog.csdn.net/kinglimy/article/details/6452239 Combo Box (组合框)控件很简单,可以节省空间.从用户角度来看,这个控件是 ...

  8. (转载)linux中shell变量

    (转载)http://blog.csdn.net/zahuopuboss/article/details/8633891 为使shell编程更有效,系统提供了一些shell变量.shell变量可以保存 ...

  9. 全面理解Java异常的运行机制

    1. 引子 try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单.听话. ...

  10. hdu 1081 矩阵最大连续子序列

    问题描述:二位平面图,每一个坐标都有值,正值或负值,求任意矩形中和的最大值问题 解决方案:求解图中每一个坐标为起点,求任意长度宽度的矩形的和 #include<iostream> #inc ...