源码全编译
基于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/<product_name>/system/bin/bootanimation 此文件,
通过串口工具拷贝到板子上,并修改为对应的权限即可看到修改效果,
其他模块也类似。
编译系统jar包
比如修改了 frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
到 frameworks/base/services/ 目录 mm -B ,
即可生成 out/target/product/<product_name>/system/framework/services.jar,
将 services.jar push到板子上即可。
重点:使用make编译
编译规则:
make <PACKAGE_NAME> -j8
<PACKAGE_NAME> 是对应目标模块的 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/<product_name>/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