分类目录归档:程序调试

程序调试 第4节 Wifi代替数据线调试

更新时间 修改意见
2016-08-02 陈敏

第4节 Wifi代替数据线调试

我们通常都是使用USB线连接设备和电脑进行的程序调试。
有的程序本身就要使用USB口,例如一个文件浏览器,它可以列出通过USB接口接入的U盘。
在调试这样的应用的时候,USB接口被占用了,但设备也只有一个USB接口,就可以考虑使用WiFi来进行ADB调试了。

通过WiFi代替数据线进行程序调试,利用了ADB工具的adb tcpipadb connect命令。

  1. 使用USB数据线连接设备和电脑,输入如下命令

  2. 断开USB线,将通过设备的IP地址连接上被调试设备

    设备当前的IP地址,通常可以在设备上,启动设置->关于手机->状态信息看到具体的内容。

这样通过命令行就完成了Wifi调试的设置。


不过这里还有一个更简单的方案,使用Android Studio的第三方插件ADB WIFI

  1. Preferences->Plugins->Browse repositories...;
  2. 在搜索栏中输入ADB WIFI
  3. 选择安装plugin
  4. 重启Android Studio就可以了;

以后在要使用Wifi调试的时候,

  1. 使用USB数据线连接设备和电脑;
  2. Tools->Android->ADB WIFI->ADB USB to WIFI
  3. 拔出USB连接线;

此时,就可以像之前使用USB数据线调试那样,通过Wifi对程序进行调试了。


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

程序调试 第3节 ADB工具

更新时间 修改意见
2016-08-02 陈敏

第3节 ADB工具

ADB-Android Debug Bridge,是安卓系统调试的核心。它将设备与调试用的电脑在软件层次上连接在了一起。第二章介绍的ADM中很多获取设备上信息的功能,其实就是通过ADB得到的。

ADB工具位于SDK目录\platform-tools\adb。如果在安装的时候你采用默认目录安装,那么它应该是c:\Users\用户名\AppData\Local\Android\sdk\platform-tools\adb

3.1 为ADB添加环境变量

为了方便的使用ADB工具,我们最好为它添加一个环境变量。这样,我们只要打开cmd命令行终端,就能马上使用它了。

  1. 我的电脑点击右键->属性->高级系统设置->环境变量,选中Path这一项,进行编辑;

  2. 在编辑栏最后输入ADB所在的路径c:\Users\用户名\AppData\Local\Android\sdk\platform-tools\;如果该项之前还有别的路径,请用;分隔开;

  3. 重启电脑->连接上手机->启动cmd命令行终端,输入adb version,如果得到类似下面的结果,说明ADB已经设置好了;

cmd命令行终端的启动方法:

  1. 通过Win+R启动Windows操作系统的运行面板;
  2. 在面板中输入cmd,启动命令行窗口;

3.2 ADB常用命令

ADB提供了很多使用的命令,这里列出最为常用的几个命令的用法。

3.2.1 adb devices

列出当前连接到电脑上的所有安卓设备

3.2.2 adb logcat

输出安卓设备上的log信息。功能和Android Device Manager中的logcat完全一样。后者实际上就是利用了ADB工具。

清除设备上已有的log,

开始输出log,

logcat的-v的输出选项,可以控制输出数据的显示格式。它提供brief process tag raw time threadtime long等参数。大多数情况下,我们使用-v time这个参数项就好了。

获取帮助,

其实adb logcat并没有h命令选项,不过当logcat没有找到正确的命令时,就会输出logcat的帮助信息,供使用者参考。

3.2.3 adb start-server

启动ADB工具,

3.2.4 adb kill-server

停止ADB工具,

3.2.5 adb shell

从电脑登录到安卓设备上,

登录到设备上后,就可以直接操作设备了。

3.2.6 adb shell dumpsys

输出设备上所有系统模块的状态信息,这个输出会非常的长,

为了让我们关注我们需要的模块,可以进一步设置要dump的模块名称,例如:

甚至更进一步:

这些模块的名称和更进一步的关键字(window windows等等),可以从adb shell dumpsys返回的结果中找到,它们的表现形式大概如下:

括号中的就是可以使用的dump形式。

3.2.7 adb install

安装应用,

-r选项表示强制安装-如果这个应用以前安装过,就把它更新安装,可以不使用;后面跟的是安装文件在电脑上的位置。

3.2.8 adb uninstall

卸载应用,

uninstall后面跟的是要卸载的程序的包名字。

3.2.9 adb help

ADB工具还有很多别的功能,可以通过这个命令查询它们的深入的详细的用法。


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

程序调试 第2节 Android Device Monitor

更新时间 修改意见
2016-08-02 陈敏

第2节 Android Device Monitor

Android Studio的Android Device Monitor(简称ADM)是我们动态调试安卓程序时重要的帮手。它提供了很多动态调试的工具和调试方法。上一章介绍的log调试,就需要通过ADM的logcat显示调试内容;它还可以查看系统内存的占用情况,可以看到系统CPU的运行情况。

ADM可以在两个地方工作:

  1. 在Android Studio集成窗口:在Android Studio下方的窗口中,点击Android Monitor,就能在Android Studio中显示;

    在第一个框中,选中我们要调试的设备,第二个框中选中我们要调试的应用,

  2. ADM单独运行:通过Android Studio的菜单栏启动;

    独立运行后,就像这样,

2.1 Logcat功能

Logcat用来查看程序输出的log。我们可以选择log的类型(verbose debug info warning error)来过滤log。

开发者官网1

当选择verbose时,logcat会输出所有类型的log;
当选择debug时,logcat会输出debug info warning error等类型的log;
当选择info时,logcat会输出info warning error等类型的log;
当选择warning时,logcat会输出warning error等类型的log;
当选择error时,logcat会输出error等类型的log;

有时候log太多,会影响我们的判断,可以自定义过滤器。

  1. 选择编辑过滤器,

    开发者官网1
  2. 指定过滤器的名字,输入log中包含关键字的内容,

    开发者官网1

    以后logcat获取的log,就只有匹配过滤器中关键字的log了。

还有一个非常有用的功能是重启ADB。ADB有时候会因为种种原因而无法与设备相连,这时候通过下图的按钮重启ADB就能解决问题。

开发者官网1

2.2 Android Studio中的ADM

在Android Studio集成界面,ADM还提供了方便的设备截屏、设备录像带功能。

设备截屏能将设备上正在显示的内容以截取图片或视频的形式保存到电脑上。

开发者官网1
  • memory能够实时监测当前被调试的应用内存使用大小,

  • CPU能够实时监测当前被调试的应用CPU占用大小,

  • Network能够实时监测当前被调试的应用网络使用情况,

2.3 独立运行的ADM

除了logcat,独立运行的ADM提供了更多的调试工具。点击菜单栏的添加视图图标,可以为ADM添加上DDMSHierarchy ViewDebugPixel Perfect等高级的调试窗口。

DDMS是谷歌提供的一个非常全面的调试工具,它能和安卓虚拟机通信,获取最原始的调试数据。

  1. 选择要调试的设备和应用;
  2. 点击DDMS的菜单栏,启动不同的高级调试功能;

DDMS有很多高级的调试功能:

  • Debug功能:连接到debug版本的应用,可以使用打断点、逐步跟踪的静态调试方式;

  • heap功能:监测当前内存的使用,手动发起内存回收,保存内存分配的所有状态到电脑上,用其他高级工具做进一步分析,查找内存泄漏;

  • thread功能:查看应用所有的线程,获取线程当前的运行信息;

  • UI元素分析功能:分析显示界面指定窗口的UI元素布局信息,帮助开发者进行界面布局的调试;

  • OpenGL trace功能:记录应用中OpenGL调用的信息;

以上这些功能都是高级的调试功能,每一个都可以开设单独的专题进行深入的讲解。因为本文针对的同学是刚开始接触调试的新手,所以这里就不详细的介绍用法了。我们将在调试的高级篇章中逐个详细介绍。


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/

程序调试 第1节 动态调试与静态调试

更新时间 修改意见
2016-08-02 陈敏

前言

安卓开发的过程中,需要对开发的程序进行调试。谷歌官方和非官方,提供了很多帮助我们调试代码的工具和方法。有的使用起来很简单,有的则功能强大,很少有机会接触。因此,我们打算由浅入深的向同学们介绍,知道针对不同的场景,使用合适的工具。

本文针对的读者是:

  1. 对安卓程序调试需要指导的新手;
  2. 对程序调试没有太多经验的开发者;

在开始以前,假设各位已经做好了如下准备:

  • 已经搭建好了安卓软件开发平台
  • 一部安卓系统设备(手机或平板电脑);
  • 一根连接电脑和安卓设备的数据线(通常是micro usb数据线);
  • 半天时间。
  • 耐心与求知欲。

本文将介绍到:

  1. 断点调试;
  2. 输出log调试;
  3. Android Device Monitor初步使用
  4. ADB工具
  5. wifi连接设备调试;

第1节 动态调试与静态调试

安卓系统上调试程序,主要通过两种形式:
1. 静态调试:程序在运行到某一个状态的时候,让它暂停,用工具查看程序此时的运行信息,比如某个变量的数值;查看完成后,让程序继续运行,恢复到正常的工作。
2. 动态调试:在程序中,添加日志信息(log),在程序运行的时候,将log指定的信息输出到调试的电脑上。整个过程不会打断程序的运行。

不管哪种调试方式,都需要手机与调试的电脑通过数据线相连,借此传递调试信息。

1.1 设备与电脑的连接

要在设备上进行调试,首先要打开设备的开发者选项,不同品牌的安卓设备界面虽然不尽相同,但使用方式都大同小异:

  1. 启动安卓设备上的“设置”应用,进入“关于手机”选项卡;
  2. 连续点击“版本号”,直到出现您现在处于开发者模式!的提示信息;

  3. 返回上级菜单,进入“开发者选项”,开启调试模式,钩上USB调试;


将手机和电脑用USB数据线连接起来。

在Windows系统,需要为连接上的设备安装ADB驱动:

  1. 安豆网资源下载下载ADB的Windows驱动到电脑本地;
  2. 在“我的电脑”上点鼠标右键,选择“管理”,打开“设备管理器”,可以看到没有安装驱动的设备;
  3. 为它更新驱动,选择“浏览计算机查找”,

  4. 指定下载的ADB驱动目录位置,点击确定后,驱动很快就安装成功了。

  5. 点击Android Studio的Android Monitor窗口,就能看到这个连接上的设备了,这个窗口还输出了手机端打印的运行信息。

1.2 部署应用

将应用程序通过Android Studio运行到设备上有两个方式:run appdebug app

debug app模式下,程序运行起来之后可以直接进入断点调试模式,对代码进行静态调试;而run app只能通过attach的方式进入断点调试模式。这两种方式可以通过菜单项启动,也可以通过快捷键开始。

  1. 点击菜单栏中的绿色的小三角,就是run app

    或者使用debug app的快捷按键shift+F10

  2. 在选定的设备上双击,

    此时就可以在设备上看到,我们的程序运行起来了。

1.3 静态调试方法

静态调试就是冻结应用运行的状态,仿佛时间停止了一般,然后我们逐一观察此时程序的各个参数是否符合我们的预期。这种调试方法适用于对时间不敏感的程序。也就是说被调试的程序线程不需要依赖别的线程,即使暂时停止工作也不会影响别的工作线程或者受别的工作线程影响。

  1. 在希望代码暂停运行的地方打断点——在代码前点击一下,出现一个红色的圆点,如果想取消,再点击一次即可。

  2. debug run的方式部署程序。当程序运行到这段代码的这个位置时,程序将停止下来,切换到Debug窗口。这时,我们就可以观察各个参数了。例如下图右半区域就列出了停止时,各个变量的值;左边区域展示了当时函数到调用栈(谁调用的这个函数)情况。我们可以逐一分析,详细观察,看这些值是否符合我们的预期。

  3. 下面的功能,将指定程序暂停后,执行下一步的走向。这些都是断点调试经常使用到的、由我们控制程序运行步骤的功能,所以尽量记住它们对应的快捷方式;

    Step Over:执行完成当前断点停留处的代码,然后停在下一行待执行的代码处。

    Step Into:如果当前断点执行处是一个函数,那么执行Step Into后,进入到该函数。

    Step Out:在当前断点执行处执行Step Out后,返回到调用该函数的地方等待执行。

    Resume Program:程序继续往下执行,直到遇到下一个断点。

有的调试功能带有force,例如force step over,它们可以在这种场景下使用:当你想进入不是你写的源代码查看调用过程,但是使用不带force的功能,却没有起作用。简单来说就是不带force的用来跟踪自己写的代码,带force的用来跟踪SDK里的源码。

1.4 动态调试方法

对于那些和时间相关的程序(不能让程序暂停,等你慢慢观察),我们就不能使用静态调试方法了,得采用动态调试,添加log的方式。

Log的中文名字叫做日志,在编程界表示程序运行过程中打印出的信息。根据log我们就知道现在程序运行到什么地方了,log还可以携带程序中某些变量的信息输出,让我们更精准的知道程序当前运行的状态。

1.4.1 代码中添加log

在代码中添加一段函数,就能通过特别的工具输出这些log。
在Android代码中添加log的方式如下:

这里面使用了Android提供的Log库。

1.4.2 log的查看

添加了log信息后,将程序通过debug app部署到设备上,就能在Android Monitor工具的logcat窗口中看到对应的信息了。

输出的调试信息如下:
03-22 03:22:39.778 8357-8357/com.anddle.calculator D/TAG: debug info: function=onCreate()

03-22 03:22:39.778:log产生的时间;
8357-8357:设备上运行这段代码的进程ID(PID)和线程ID(TID);
com.anddle.calculator:设备上运行这段代码的包名;
D:这条log的类型。我们输出这条log使用的是Log.d(),所以就显示D;如果使用Log.i()就显示I,以此类推;
TAG:就是Log.d()函数的第一个参数;
debug info: function=onCreate():就是Log.d()函数的第二个参数;

Android应用开发的Log库提供了几种不同等级的log:Verbose Debug Info Warning Error,我们可以根据自己log的需要加不同等级的log,使用的形式为:

我们在应用中调试程序,通常使用d。

1.4.3 log的添加规则

在应用的开发当中,我们对log的添加有一些不成文的技巧,可以提高程序的开发效率。

  1. 在调试应用的同一个功能时,为它定义同一个TAG。例如,一个应用有网络通信和本地文件读取两个大功能。那我们就可以为网络通信定义一个TAG叫做Network,为另一个本地文件读取定义一个TAG叫做FileAccess。这样当我们查看对应的log信息时,就很容易通过关键字把它们从log的海洋里区分开。将TAG定义成一个字符串常量,便于对log输出信息的修改。

  2. 使用Debug开关控制log信息是否输出。在调试应用的时候要添加很多log,当应用发布的时候,又要去掉这些log信息。添加或者删除这些log,会增加很多工作。所以我们需要使用Debug开关

  3. 输出函数的调用栈。有的时候,我们不仅关注程序执行到当前时各个变量的值是什么,还关心这个函数是怎么被调用到的。那么我们可以在代码中,添加输出调用栈的信息:

  4. Log.d()在调试代码时使用,用Debug开关控制;Log.e()在出现意外而重要的错误情况时使用,不用Debug开关控制;Log.v() Log.i()Log.w()在需要输出运行状态并且不涉及暴露应用实现信息的情况时使用,不必用Debug开关控制;当然,开发者想怎么用这些log类型就可以怎么用,并没有特别的约束。


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/