`

(转)App调试的几个命令实践

 
阅读更多
转自: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的使用,以调整优化代码。

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笔记之:App调试的几个命令的实践与分析

    本文将介绍几个在Android中常用的App调试命令及其实践应用。 首先,`logcat`是Android开发者最熟悉的命令之一,用于查看设备或模拟器的日志输出。通过`adb logcat -v time`,我们可以获取带有时间戳的日志,这对于...

    企业运维APP应用开发实践.docx

    企业运维APP应用开发实践中,主要涉及以下几个核心知识点: 1. **准备工作**: 开发一个企业运维APP,首先需要进行环境搭建。这包括安装必要的开发工具,如 Ionic 框架,Sublime 编辑器等。对于示例中提到的,使用...

    蓝牙串口助手app.rar

    厂家提供的这个串口助手专为与HC-05模块配合使用而设计,它提供了更为专业的通信调试功能,如波特率设置、数据位、校验位和停止位的自定义,以及AT命令的支持。通过这款工具,开发者可以直接在电脑上进行数据收发,...

    xapp1171_vivado2017.4.zip

    在Vivado 2017.4中,XAPP1171的TCL脚本可能涉及到以下几个方面: 1. **设计流程自动化**:脚本可以帮助用户自动化执行一系列设计步骤,如IP核的集成、约束文件的处理、综合和实现等,减少人工操作的时间和出错概率...

    STM32F103微控制器在线升级IAP功能,文件夹包含了boot、APP和测试工具

    IAP功能的实现通常涉及到以下几个关键步骤: 1. 分区:将Flash内存分为两部分,一部分用于存放引导程序,另一部分用于存放应用程序。 2. 应用程序更新:通过串口或其他通信接口接收新的应用程序二进制文件,然后在...

    生活助手APP.rar

    在学习或使用这款APP的源代码时,以下几个关键知识点是需要注意的: 1. **项目结构**:打开压缩包后,首先会看到整个项目的文件结构。这通常包括了`AndroidManifest.xml`(应用配置文件)、`java`或`kotlin`源码...

    利用Flutter开发的漂亮天气App

    最后,通过flutter run命令进行调试和测试,确保应用在不同平台上运行稳定。 总的来说,这个"利用Flutter开发的漂亮天气App"项目涵盖了Flutter开发的核心技术,包括UI设计、网络请求、数据处理、响应式布局、状态...

    android 蓝牙遥控器app.zip

    在开发Android蓝牙遥控器时,我们需要掌握以下几个核心知识点: 1. **Android应用开发基础**:了解Java或Kotlin编程语言,熟悉Android Studio开发环境,以及Android SDK的基本用法。需要理解Android应用程序的四大...

    机智云APP控制战舰V3历程代码

    这些代码可能包括以下几个部分: 1. **初始化代码**:设置STM32的GPIO(通用输入/输出)引脚,以驱动LED1和LED2,并连接蜂鸣器。这通常涉及到配置GPIO模式、速度和推挽输出等参数。 2. **机智云SDK集成**:导入并...

    仿One(每日一文)的uni-app

    总的来说,"仿One(每日一文)的uni-app"项目是一个全面了解和实践uni-app开发的好例子,涵盖了前端开发的多种技术和最佳实践,对于想要提升跨平台开发能力的开发者来说极具价值。通过研究和运行这个项目,不仅可以...

    app aop code withbug

    在分析和修复这些问题时,我们需要考虑以下几个关键知识点: 1. **面向切面编程(AOP)概念**:理解AOP的基本原理,包括切面(Aspect)、通知(Advice)、连接点(Join Point)、切点(Pointcut)、织入(Weaving)...

    基于Flutter的计时器App

    一个Flutter项目通常包含以下几个主要部分:`lib`目录存放应用的源代码,`pubspec.yaml`文件用于定义项目的依赖和元数据,`android`和`ios`子目录分别对应于Android和iOS平台的特定配置。 创建计时器App的核心组件...

    APP只能家具

    该APP模块的核心功能可能包括以下几个方面: 1. 设备连接与管理:用户可以通过APP添加、删除或管理家中的智能设备,如智能灯泡、智能插座、智能门锁等。连接过程通常涉及蓝牙或Wi-Fi配对,确保设备与APP之间建立...

    android开发中常用的命令提示符

    本文将详细介绍这些工具中的几个关键命令及其用法,帮助开发者更好地理解和运用它们来提升开发效率。 #### 一、列出可用的目标设备(Targets) **命令:** ``` android list targets ``` **功能:** 该命令用于列...

    STM32单片机读写 蓝牙2.0(HC-05)手机APP控制开发板软件DEMO例程源码.zip

    STM32单片机是基于ARM Cortex-M内核的微控制器,被广泛应用于嵌入式系统设计中。在这个项目中,我们关注的是...同时,这个项目也是对STM32单片机学习者的一个很好实践,有助于提升其在嵌入式系统设计和编程上的能力。

    WeatherAppReactNative采用reactnative构建的天气预报iOSApp

    天气应用的源代码通常会分为以下几个部分: 1. `App.js`:项目的入口文件,定义了应用的主要组件和逻辑。 2. `components`目录:存放各个独立的UI组件,如Header、WeatherCard等。 3. `services`目录:负责与外部...

    Webpack消息的漂亮格式从CreateReactApp移植

    移植这个功能涉及到以下几个步骤: 1. **安装依赖**:首先,你需要找到 Create React App 中用于格式化 Webpack 消息的库。从文件名 "lukeed-webpack-format-messages-e8373b6" 可以推断,这可能是 Lukeed(一个...

    How to Create a Sencha Touch 2 App source code

    这通常包括以下几个步骤: 1. **设置开发环境**:确保你已经安装了最新版本的Sencha SDK Tools,这是一套用于构建和打包Sencha Touch应用的命令行工具。同时,还需要一个代码编辑器,如Visual Studio Code或Sublime...

    基于android的强行结束APP进程的方法

    要强制结束一个APP进程,有以下几种方法: 1. **通过Activity Manager**: Android提供了一个名为`ActivityManager`的系统服务,可以用来管理应用程序的活动和进程。通过调用`ActivityManager`的`forceStopPackage...

Global site tag (gtag.js) - Google Analytics