第一研究所张长青2011-06-15Android开发二三事——源码工程下的开发方法简介前言本文介绍了在获得Android整个源码的工程中,如何进行编译和调试。其中涉及了一些常用的命令和工具,最核心的就是Linux的BashShell脚本和GNUMake工具。其中的原理很复杂,但是作为普通的应用开发者,并不需要了解那么多,只要会使用就可以了,而学会使用还是挺简单的。下面和跟着我一起学习吧。目录�一、如何编译工程�二、如何编译应用�三、如何调试应用�四、如何在Windows下调试一、如何编译工程1、如何编译工程编译工程是非常简单的:1)启动一个命令行终端;2)进入到工程根目录下;3)执行命令“make”就开始编译了;$make$make$make$make备注:make工具默认会找该目录下的Makefile文件去执行。本步骤可以准确编译的前提是已正确配置好编译环境,关于如何配置编译环境,见其他相关文档。编译成功后,会在out相应目录下生成system.img,userdata.img,ramdisk.img等文件。一、如何编译工程(续)2、如何配置编译选项默认情况下,编译的是供模拟器加载使用的Generic工程,如果要编译具体的产品型号,需要进行特别的配置。按以下步骤操作:1)启动命令行终端,并进入工程根目录;2)执行命令“sourcebuild/envsetup.sh”或“.build/envsetup.sh”命令加载环境变量。$.build/envsetup.sh$.build/envsetup.sh$.build/envsetup.sh$.build/envsetup.sh(备注:source和‘.’之后有一个空格)一、如何编译工程(续)3)输入命令“choosecombo”,然后根据出现的提示框逐一选择确认;4)确认完成后,再次输入“make”命令,就会按照刚才的配置进行编译。二、如何编译应用Android是一个智能平台,应用是独立的,可以进行单独的编译和安装。在平时的开发过程中,整个工程只需要编译一次就可以了,而应用则可能需要无数次的编译和调试。相对于编译整个工程的时间(大约几个小时),编译一个应用是非常快的(大约几十秒)。下面就介绍一下编译单个应用的方法。二、如何编译应用(续)1)打开命令行终端,进入工程根目录;2)执行“sourcebuild/envsetup.sh”或“.build/envsetup.sh”加载环境变量;$.build/envsetup.sh$.build/envsetup.sh$.build/envsetup.sh$.build/envsetup.sh$setpaths$setpaths$setpaths$setpaths3)以编译Email应用为例,有两种方法可以编译该应用。(1)使用mmm命令(2)使用mm命令二、如何编译应用(续)(1)使用mmm命令在工程根目录下,执行以下命令:$mmmpackages/apps/Email/$mmmpackages/apps/Email/$mmmpackages/apps/Email/$mmmpackages/apps/Email/(2)使用mm命令进入Email应用的文件夹下,执行以下命令:$mm$mm$mm$mm(备注:Email应用在packages/apps/Email/文件夹中)二、如何编译应用(续)说明:其实在命令行终端中加载了build/envsetup.sh脚本以后,我们就有了以下命令可以使用:(只在当前终端中有效,每次新开一个终端,需要重新加载)-croot:Changesdirectorytothetopofthetree.返回工程根目录-m:Makesfromthetopofthetree.从工程顶部开始编译-mm:Buildsallofthemodulesinthecurrentdirectory.编译所有子目录-mmm:Buildsallofthemodulesinthesupplieddirectories.编译指定目录-cgrep:GrepsonalllocalC/C++files.查找包含指定字符串的C/C++文件-jgrep:GrepsonalllocalJavafiles.查找包含指定字符串的Java文件-resgrep:Grepsonalllocalres/*.xmlfiles.查找包含指定字符串的资源文件-godir:Gotothedirectorycontainingafile.进入包含某个文件的目录三、如何调试应用前面介绍了如何编译整个工程,以编译可以在模拟器运行的Generic为例,编译成功后,会在工程根目录下的out/target/product/generic/文件夹中会生成最核心的三个文件:system.img–系统镜像文件userdata.img–用户数据镜像文件ramdisk.img–文件系统镜像文件三、如何调试应用(续)1、如何加载到模拟器运行?按以下步骤,可以将编译生成的img文件加载到模拟器运行(1)启动命令行终端,并进入工程根目录(2)顺序执行以下脚本,加载一些环境变量$.build/envsetup.sh$.build/envsetup.sh$.build/envsetup.sh$.build/envsetup.sh$setpaths$setpaths$setpaths$setpaths(3)输入以下命令将img加载到模拟运行$emulator$emulator$emulator$emulator备注:生成的img文件在out/target/product/generic/目录下。三、如何调试应用(续)2、如何加载到模拟器输出Log在上一节的第四个步骤中,加上一个-logcat参数,就可以输出log信息了。(Log信息输出在当前的命令行终端中)输入以下命令将img加载到模拟运行并输出log信息$emulator$emulator$emulator$emulator-logcatall-logcatall-logcatall-logcatall备注:有了Log输出,我们就可以通过这些Log信息来调试程序程序了。Android中提供了丰富的Log输出的方法,如Log.v,Log.w,Log.e等,还可以自定义Log的标签,进行过滤输出。三、如何调试应用(续)3、如何重新加载应用到模拟器大家都知道,在开发过程中,应用程序的源码和资源文件是需要经常改动的,改完了需要重新编译,那么编译完了必须要重新加载到模拟器上运行,才能看到修改的效果。下面就介绍两种常用的完成这些工作的方式。三、如何调试应用(续)3-1重新生成img文件并加载到模拟器运行修改完代码后,按以下步骤操作(以Email应用为例):(1)启动命令行终端,并进入工程根目录;(2)顺序执行以下命令,加载环境变量;$.build/envsetup.sh$.build/envsetup.sh$.build/envsetup.sh$.build/envsetup.sh$setpaths$setpaths$setpaths$setpaths(3)编译Email应用;$mmmpackages/apps/Email/$mmmpackages/apps/Email/$mmmpackages/apps/Email/$mmmpackages/apps/Email/(4)重新生成img文件$makesnod$makesnod$makesnod$makesnod(5)进入out/target/product/generic/文件夹中$cdout/target/product/generic/$cdout/target/product/generic/$cdout/target/product/generic/$cdout/target/product/generic/(6)加载到模拟器中运行$emulator-logcatall-systemsystem.img-datauserdata.img-ramdiskramdisk.img$emulator-logcatall-systemsystem.img-datauserdata.img-ramdiskramdisk.img$emulator-logcatall-systemsystem.img-datauserdata.img-ramdiskramdisk.img$emulator-logcatall-systemsystem.img-datauserdata.img-ramdiskramdisk.img备注:如果启动模拟器是提示partitionsize不足,请使用-partition-size命令参数,后面带上的数值要大于编译生成的system.img大小。三、如何调试应用(续)3-2单独编译应用并同步到模拟器上运行如果当前的模拟器已经在运行,我们不想重新编译生成img文件(因为比较耗费时间),只想单独编译应用,可以按以下步骤操作(以Email应用为例):(1)重新开启一个命令行终端,并进入工程根目录;(因为原来运行模拟器的命令行终端已经无法再输入命令了)(2)顺序执行以下命令,加载环境变量;$.build/envsetup.sh$.build/envsetup.sh$.build/envsetup.sh$.build/envsetup.sh$setpaths$setpaths$setpaths$setpaths(3)进入Email应用文件夹;$cdpackages/apps/Email/$cdpackages/apps/Email/$cdpackages/apps/Email/$cdpackages/apps/Email/(4)执行以下命令就可以将新编译的Email.apk重新加载到模拟器上了;$mm&&adbremount&&adbsync$mm&&adbremount&&adbsync$mm&&adbremount&&adbsync$mm&&adbremount&&adbsync备注:mm表示单独编译当前目录下的应用程序,“&&”表示并行执行,“adbremount”和“adbsync”是adb提供的重新加载和同步应用的命令。三、如何调试应用(续)两种方式的比较:1)第一种方式需要重新启动模拟器,整个系统需要重新启动,速度较慢。2)第二种方式速度较快,只是将新编译的应用重新加载到模拟器上运行,不会重新生成img文件。3)一般情况下,首次启动时只能使用第一种方式,以后单独调试应用时,就采用第二种方式。两种方式方式结合使用,效率较高。三、如何调试应用(续)Android模拟器Log输出开两个命令行终端,一个用于log输出,一个用于编译。三、如何调试应用(续)其实,以上的调试都是利用了android提供的emulator和adb两个工具,这两个工具提供了丰富的命令行参数,可以进行非常复杂的配置和操作。在加载完环境变量后,可以通过以下命令查看他们支持的丰富功能。有兴趣的同事可以自己去研究。$.build/envsetup.sh$.build/envsetup.sh$.build/envsetup.sh$.build/envsetup.sh$setpaths$setpaths$setpaths$setpaths$emulator$emulator$emulator$emulator––––helphelphelphelp------------查看查看查看查看androidemulatorandroidemulatorandroidemulatorandroidemulator提供的配置参数提供的配置参数提供的配置参数提供的配置参数$adb$adb$adb$adb------------查看查看查看查看adbadbadbadb提供的配置参数提供的配置参数提供的配置参数提供的配置参数四、如何在Windows下调试前面介绍的所有操作,都是在Linux环境下(本文都是以Ubuntu11.04系统为例)