有人问我这样一个问题,就是高通或者mtk是如何将自己的内容打包到system.img中的。接触编译比较少的,所以对这个还是陌生的,不过目前android的相关资料太详实了,自己看文章和追踪代码过程记录如下。文章首推“老罗Android之旅”,其中有4篇文章讲解编译系统的,这个是强烈推荐大家看的。
简略的原理如下:各个模块下都会有Android.mk文件,这个是编译脚本的片段。在一次Android系统的完整编译中,编译脚本会搜索所有子目录下的Android.mk,然后组合成一个完整的编译脚本,这样避免掉了文件间编译依赖冲突或循环的问题。要想将一个模块编译到system.img中,一定要有脚本将模块加入到PRODUCT_PACKAGES变量中,这个是唯一的条件。PRODUCT_PACKAGES不只是app哦,framework或者bin等都是要加入到其中的。
mtk打包代码分析
build/target/product/telephony.mk
PRODUCT_PACKAGES += \
CarrierConfig \
Dialer \
CallLogBackup \
rild
device/mediatek/common/device.mk
# MediaTek framework base modules
PRODUCT_PACKAGES += \
mediatek-common \
mediatek-framework \
CustomPropInterface \
mediatek-telephony-common
build目录下有诸多通用的脚本文件,不过在device的mediatek目录下又有个common文件夹,有点重复...,除了这两处,在项目的脚本里也可以配置。或者新写个文件,include到编译流程中。
高通打包代码分析
分析完mtk,再看高通,在build或者device搜索会发现一无所获,是高通更改了编译流程?其实并不是
vendor/qcom/proprietary/common/config/device-vendor.mk
#Qc extended functionality of android telephony
QTI_TELEPHONY_FWK := qti-telephony-common
QTI_TELEPHONY_FWK += QtiTelephonyServicelibrary
...
PRODUCT_PACKAGES += $(QTI_TELEPHONY_FWK)
高通维护自己模块的脚本只有一处,修改起来比较方便。