4、编译Android源码 编译模块 $ source build/envsetup.sh ,然后就会多出几个可用的命令: - croot: Changes directory to the top of the tree. - m: Makes from the top of the tree. - mm: Builds all of the modules in the current directory. - mmm: Builds all of the modules in the supplied directories. - cgrep: Greps on all local C/C++ files. - jgrep: Greps on all local Java files. - resgrep: Greps on all local res/*.xml files. - godir: Go to the directory containing a file. - printconfig: 当前build的配置情况. 可以使用 --help查看用法。 如:在修改了某一个模块以后,可以使用 $ mmm <目录> 来重新编译所有在<目录>中的所有模块(包括C、C++、JAVA程序),使用 $ mm 编译当前目录中的所有模块。 也可以直接在 Android源码根目录下执行“make 模块名”来编译模块(模块名可以在.mk文件中找到)。模块编译后会在out/target/product/generic/system/app下生 成对应的.apk包。但是,用mm/mmm来编译生成的.apk并不会打包到system.img中,需要我们手动通过make snod把 system文件夹打包为system.img,不过这就得重新运行模拟器了,这也是很麻烦了。 对于我们开发者来说,我们可以这样做:1)把需要修改、调试的模块(比如AlarmClock.apk)从/system/app下移除,然后make snod,这样system.img就没有AlarmClock.apk了。 2)运行模拟器,就看不到AlarmClock了 3)修改AlarmClock源码并用mm/mmm来编译,在/system/app下生成AlarmClock.apk 4)通过adb把AlarmClock.apk安装到Android文件系统中,安装方法有两个: A、通过adb install xxx/AlarmClock.apk B、通过adb push xxx/AlarmClock.apk /data/app 两种方法都可以把 AlarmClock安装到/data/app下,Android会自动把它显示在主菜单中(只要AlarmClock.apk中有一Activity包 含android.intent.category.LAUNCHER属性),不过A方法在/data/app生成 com.android.alarmclock.apk,B方法则是 AlarmClock.apk。用A方法时,如果原来已经安装了 AlarmClock,你还得先adb uninstall 它,而B方法则不用。推荐使用B方法。同样,卸载可以通过adb uninstall或adb shell rm xxx/xxx.apk来,也推荐用删除的方法来卸载。