Android 源码编译技巧--模块编译

源码全编译

基于AN 8.0 ,全编译一般步骤为

source jdk_env.sh
source build/envsetup.sh
lunch //选择对应的device或product
make -j8 //数字越大越好,但取决于编译服务器性能

模块编译

模块编译俗称单编,就是单独编译某个模块。需要全编译后才可以单编。

模块编译的好处是不用每次都完整的烧录 rom 到板子上,节省时间。

将模块编译生成的文件直接 adb push 或者串口拷贝到板子上就能看到修改效果,方便调试。

是否可以模块编译,主要看该模块根目录下是否有 Android.mk 文件。

编译某个单独的系统APP

到app目录下

mm -B

或者到app目录下

mma -B

或者直接指定源码根目录,以 Launcher2 示例

mmm packages/apps/Launcher2

mmm -j12 packages/apps/Launcher2

mma packages/apps/Launcher2

mmm 与 mma 的区别在于:
mmm 只编译当前模块;
mma 编译当前模块及其依赖的模块,如果 mmm 编译提示缺少依赖,用 mma 编译即可

编译系统某些文件

比如修改了开机动画的逻辑,
修改了 frameworks/base/cmds/bootanimation/BootAnimation.cpp 文件,
则到 frameworks/base/cmds/bootanimation/目录下mm -B即可,
会生成 out/target/product//system/bin/bootanimation 此文件,
通过串口工具拷贝到板子上,并修改为对应的权限即可看到修改效果,
其他模块也类似。

编译系统jar包

比如修改了 frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
frameworks/base/services/ 目录 mm -B
即可生成 out/target/product//system/framework/services.jar
将 services.jar push到板子上即可。

重点:使用make编译

编译规则:

make -j8

是对应目标模块的 Android.mk 文件里的 LOCAL_PACKAGE_NAME 或者 LOCAL_MODULE

1.编译 packages/apps/Launcher2

make -j8 Launcher2
make Launcher2 -j8

2.编译 framework 得到 framework.jar

make framework -j8

3.编译 framework-res 得到 framework-res.apk

make framework-res -j8

4.编译 services 得到 services.jar

make services.core.unboosted -j8
make services.core -j8
make services -j8

如果全编译过,直接

make services -j8

5.编译 frameworks/base/packages/SystemUI/

make SystemUI -j8

编译无效问题

1.模块编译替换后无效果,可能是编译中间件导致的,
删除 out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/out/target/product//obj/APPS/Browser3_intermediates/
等文件后重新编译即可。

2.编译后烧录出现卡死在开机Logo或者开机动画页面,make clean 后重新编译即可。
make clean 后再次编译会很耗时,相当于第一次编译。

3.类似2的情况,删除 out/ 目录后重新编译,比 make clean 更暴力。

参考:https://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/index.html

你可能感兴趣的:(Android,编译,aosp,android)