repo 操作
1.只 sync 部分源码 在.repo/manifest.xml 查找所需要的同步的部分模块名称,例如 manifest.xml 文件如下:
<project path="bionic" name="platform/bionic" /> <project path="bootable/bootloader/legacy" name="platform/bootable/bootloader/legacy" /> <project path="bootable/diskinstaller" name="platform/bootable/diskinstaller" /> <project path="bootable/recovery" name="platform/bootable/recovery" /> <project path="cts" name="platform/cts" /> <project path="dalvik" name="platform/dalvik" /> <project path="development" name="platform/development" /> <project path="device/common" name="device/common" />
其中 path 所指向的就是需要 sync 的模块名称.例如只 sync dalvik 模块,直接输入:
repo sync dalvik
2.放弃所有的本地修改
repo forall -vc "git reset --hard"
Android 源码提供的命令
当需要编译 Android 的源码时,第一步的操作:
source build/envstartup.sh
上面的命令是使 Android 源码中带有的一些命令生效,而 Android 源码中提供的这些命令 在我们操作 Android 源码时会给我们提供很多的帮助.我们不在详细的分析 build/envstartup.sh 源码,只挑几个重要的命令说下.
- croot: Changes directory to the top of the tree. #切换工作目录为android源码目录的顶层目录 - make: builds all of the modules in the root directory. #编译整个 android 系统. - m: Makes from the top of the tree. #从android源码树的顶部开始编译 - mm: Builds all of the modules in the current directory. #编译当前目录下的所有模块,但不包含依赖 - mma: #编译当前目录下面的所有模块,包含依赖 - mmm: Builds all of the modules in the supplied directories. #编译指定目录下的所有模块,但不包含依赖 - mmma: #编译指定目录下的所有模块,包含依赖 - 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. #搜索出指定文件所在目录提供给用户来选择进入
如何编译 Android 源码的部分模块
当研究 Android 的源码时,避不可免的需要修改 Android 的源码,但是每次整体编译 Android 的源码实在是太耗时了,所以需要只编译修改的部分就可以了.编译部分模块的方法 如下: 1.在修改文件所在目录或者是修改文件父辈目录中包含 Android.mk 文件夹. 2.在包含 Android.mk 的文件夹下面执行
mm .
当然了也可以在 android 源码的根目录使用
mmm /frameworks/base/libs/androidfw/ # 其中 andoridfw 目录下是有 Android.mk 文件的
还有其他的方式编译 Android 系统的部分模块,具体的命令如下所示:
模块 | make 命令 | mmm 命令 |
---|---|---|
init | make init | mmm system/core/init |
zygot | make app_process | mmm frameworks/base/cmds/app_process |
system_server | make services | mmm frameworks/base/services |
java framwork | make framwork | mmm frameworks/base |
framework res | make framwork-res | mmm frameworks/base/core/res |
framework jni | make libandroid_runtime | mmm frameworks/base/core_jni |
binder | make libbinder | mmm frameworks/base/libs/binder |
对于 make 命令来说,模块名称未确定时,到相应目录下的 Android.mk 文件中查找 LOCAL_PACKAGE_NAME
3.如果修改的代码没有问题, 然后就可以使用命令,将更新后的模块重新打包到 Android 源码编译后的镜像中.
make snod
如何编译 Framework 的单独模块
Android 源码中的大部分模块都是可以通过上面的方式进行模块化编译的,但是针对 framework 中的代码,则不能使用上面的方式进行编译.针对 framework 的编译方式如下所 示: 1.修改了 framework/base/core/res 下的资源文件
mmm framework/base/core/res
上面的命令会在 out 目录下的相应位置生成 framework-res.jar 文件. 当然了也可以使用 make 命令,上面已经详细讲了 make 如何使用. 2.将生成的 frameworks.jar 等文件 push 到 Android 系统中.
adb remount adb push framework-res.apk /system/framework/ adb push framework.jar /system/framework/ adb push services.jar /system/framework/ adb reboot
将 framework-res.apk framework.jar 或者 services. jar是否 push 到系统中,取决于是 否需改了相应的代码.
以上的办法只适用于 android 6.0 以下的版本