转载请注明出处:http://blog.csdn.net/droyon/article/details/8648646
上面说了如何让厂商定义的apk编译到system.img中?
总结:对于product来说,有三部分东西是要包含的。
第一种就是基础子项目,所有的product都要包含。比如adbd,管理adb进程,用于各种adb命令操作,比如adb install ,adb push等。
第二种就是可选的子项目,比如一些apk程序。他们的LOCAL_MODULE_TAG定义为optional。
第三种就是一些文件。这些文件可以是单独编译好的apk程序,也可以是一个配置文件。
在编译系统中,定义了一系列的约束,来描述一个product需要包含那些可选的子项目以及文件,我们在执行make product时,会加载编译系统定义好的脚本,这些脚本定义了一系列的变量,这些变量描述了编译系统对那些文件进行编译压缩,最后生成system.img。
我们具体的每个product,在自己的约束中只要给编译系统定义好的变量重新赋值就能定义自己的规则,将需要的子项目编译压缩到system.img中。
在编译系统中定义的变量如下:
_product_var_list := \
PRODUCT_NAME \
PRODUCT_MODEL \
PRODUCT_LOCALES \
PRODUCT_AAPT_CONFIG \
PRODUCT_AAPT_PREF_CONFIG \
PRODUCT_PACKAGES \
PRODUCT_DEVICE \
PRODUCT_MANUFACTURER \
PRODUCT_BRAND \
PRODUCT_PROPERTY_OVERRIDES \
PRODUCT_DEFAULT_PROPERTY_OVERRIDES \
PRODUCT_CHARACTERISTICS \
PRODUCT_COPY_FILES \
PRODUCT_OTA_PUBLIC_KEYS \
PRODUCT_EXTRA_RECOVERY_KEYS \
PRODUCT_PACKAGE_OVERLAYS \
DEVICE_PACKAGE_OVERLAYS \
PRODUCT_TAGS \
PRODUCT_SDK_ADDON_NAME \
PRODUCT_SDK_ADDON_COPY_FILES \
PRODUCT_SDK_ADDON_COPY_MODULES \
PRODUCT_SDK_ADDON_DOC_MODULES \
PRODUCT_DEFAULT_WIFI_CHANNELS \
PRODUCT_DEFAULT_DEV_CERTIFICATE \
如何查找android系统中有那些product,我们在第一篇文章中说了,在build/target/product、device、vendor目录下搜索AndroidProduct.mk文件。
define _find-android-products-files
$(shell test -d device && find device -maxdepth 6 -name AndroidProducts.mk) \
$(shell test -d vendor && find vendor -maxdepth 6 -name AndroidProducts.mk) \
$(SRC_TARGET_DIR)/product/AndroidProducts.mk
endef
在具体的product中的AndroidProduct.mk文件中会给编译系统定义的变量赋值
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/core.mk \
$(LOCAL_DIR)/generic.mk \
$(LOCAL_DIR)/full.mk
else
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/core.mk \
$(LOCAL_DIR)/generic.mk \
$(LOCAL_DIR)/generic_armv5.mk \
$(LOCAL_DIR)/generic_x86.mk \
$(LOCAL_DIR)/generic_mips.mk \
$(LOCAL_DIR)/full.mk \
$(LOCAL_DIR)/full_x86.mk \
$(LOCAL_DIR)/full_mips.mk \
$(LOCAL_DIR)/vbox_x86.mk \
$(LOCAL_DIR)/sdk.mk \
$(LOCAL_DIR)/sdk_x86.mk \
$(LOCAL_DIR)/large_emu_hw.mk
endif
它就给PRODUCT_MAKEFILES变量进行了赋值。它赋值的内容就是加载更多的*.mk文件。
这是PRODUCT_MAKEFILES变量,如果想将那些可选的子项目、apk文件通过编译加入到项目编译生成的system.img中就要给PRODUCT_PACKAGES变量进行赋值。
比如:
PRODUCT_PACKAGES := \
ApplicationsProvider \
BackupRestoreConfirmation \
Browser \
Contacts \
ContactsProvider \
DefaultContainerService \
DownloadProvider \
DownloadProviderUi \
HTMLViewer \
Home \
KeyChain \
MediaProvider \
PackageInstaller \
PicoTts \
SettingsProvider \
SharedStorageBackup \
TelephonyProvider \
UserDictionaryProvider \
VpnDialogs \
apache-xml \
bouncycastle \
bu \
cacerts \
com.android.location.provider \
com.android.location.provider.xml \
core \
core-junit \
对于一些文件或者编译好的apk程序,我们可以通过给LOCAL_COPY_FILES变量进行赋值来使之编译到system.img中。
PRODUCT_COPY_FILES := \
development/data/etc/apns-conf.xml:system/etc/apns-conf.xml \
development/data/etc/vold.conf:system/etc/vold.conf \
development/tools/emulator/system/camera/media_profiles.xml:system/etc/media_profiles.xml \
。
4、我们应如何给android系统中增加一个product
总结:如果我们要添加一个product到系统中,那么我们最好在device或者vendor目录下,因为android编译系统也会默认扫描这两个目录下的AndroidProduct.mk文件。
假如我们要定义一个product,我们可以在vendor目录下,执行如下:假定我们的公司为 fenghuolun,我们的产品为jerry,那么,我们可以执行如下:
mkdir -p fenghuolun/jerry
然后在jerry下创建AndrodProduct.mk文件。在这个文件里,对变量PRODUCT_MAKEFILES变量进行赋值。
#for fenghuolun/jerry/AndroidProduct.mk
PRODUCT_MAKEFILES:= \
$(LOCAL_DIR)/jerry.mk
然后创建上一步中指定的jerry.mk文件,在这个文件中对product相关变量进行赋值,比如LOCAL_PACKAGES。
#jerry.mk
PRODUCT_PACKAGES:=\
Helloworld
PRODUCT_NAME:=eng_jerry
PRODUCT_DEVICE:=jerry
PRODUCT_BRAND:=Android
然后在项目目录下必须创建一个BoardConfig.mk文件,在前面我们说过,编译系统会对这个文件进行包含的。
我们直接创建这个文件好了,不写任何东西。
#fenghuolun/jerry/BoardConfig.mk
#write nothing
product添加完毕,然后就可以编译验证了。
5、添加了product,那么如何添加子项目,也就是target?
总结:在android系统中,如果要添加一个应用,也就是我们前面说的target,理论上可以在android源码的任意位置,只要在相应的位置下包含Android.mk文件,那么就可以根据编译类别,编译出对应的apk,或者动态库等。
但为了代码的一致性,我们一般在一下位置添加:
external:包含一些二进制的可执行程序或文件。
package:包含android下的应用程序源码
上面两个目录都是系统级的。添加应用当然也可以,最好添加到Vendor目录中。
vendor/device:包含设备厂商的一些自定义项目。我们也可以将我们自定义的应用放到这里。
如果是framework层的源码改动,我们在第一篇中说过,framework不会将所有的文件都包含都framework.jar文件中,在它定义了包含源文件的目录名称。
下面继续如何添加子项目,以及注意事项?
............
又很晚了,明天在写吧。