编译 Android 源码那点事

2019/06/11 Android

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 以下的版本

Search

    Table of Contents