1. Android上的调试技术
在Android系统上,开发者可以使用两种不同的语言来开发应用程序,一种是Java语言,开发者使用的是Android SDK来配置和编译这些代码,生成Java语言的class文件,也就是Java虚拟机运行的二进制代码。Android系统使用.dex文件将一系列的class文件压缩在一起。另外一种是C/C++语言,使用Android NDK来配置和编译这些代码。这些代码经过NDK编译后就是汇编码并合成动态链接库,也就是.so文件。调试Java代码和C/C++代码需要不同的技术和方法,下面分别来介绍它们。
1.1 前提条件
因为Android是基于Java语言的,所以任何应用程序都离开不开Java代码。而对于一个Android应用程序,开发者是否使用C++代码来编写部分逻辑则是可选的。所以,对于很多Android应用程序来说,仅仅Java语言就已经足够了。但是对于Chromium来说,调试C++代码是必需的。
想要调试Android的Java代码,首先需要的是Oracle JDK(现在也可以使用OpenJDK了)和Android SDK,它们分别是Java的运行和调试工具,Android开发和调试的各种工具。事实上,为了开发和调试上的方便,开发者通常也需要下载Eclipse。Android团队为了方便开发者,将这些工具都打包在一起,详情见这里:http://developer.android.com/tools/index.html。
因为Android设备是小型设备,不适合用来作为开发者的开发和调试机器,所以调试Android应用程序通常是使用PC来完成的,笔者偏向使用我的Linux开发机器来调试Android应用程序。所以,调试Android应用程序实际上需要调试机器和被调试的Android设备。上面说到的那些JDK和SDK工具都是安装在开发机器上的。开发者可以使用实际的设备来调试应用程序,同时,也可以通过创建一个虚拟设备来模拟Android设备运行应用程序。读者可以通过下面的链接来获取创建虚拟设备的相关方法:http://developer.android.com/tools/devices/index.html
从上面可以看出,调试Android应用程序实际上涉及两个硬件设备(或者虚拟)。不同于调试Linux上的应用程序,因为开发者通常就是使用本地调试器来调试当前机器上运行的程序。在调试Android环境中的应用,开发者通常需要使用到“远程调试”的技术。远程调试需要涉及到两个不同的设备或者机器,而调试工具和被调试程序两者可以通过其它辅助设施和套接字来通信,以完成调试功能。
1.2 开启/关闭调试功能
想要调试某个Android设备上的应用程序,必须首先要打开该设备上的“开发者选项”。在一些设备中,该选项是缺省不显示的,需要用户在“设置”中的“关于手机”中的Android信息上连续点击多次之后才会出现“开发者选项”。通常,“开发者选项”会出现“USB调试”选项,开发者需要打开该选项才能够通过开发机器调试该设备上的应用程序。
在“开发者选项”中还有很多对开发者非常有用的子选项,例如“不锁定屏幕”。笔者很喜欢这一功能,它有助于开发者调试程序而不会出现设备总是锁屏等烦人的情况。
当设置完Android设备之后,后面面临的问题就是被调试程序,这个对于调试Java代码来说也要细细的说一下。