在前文Android——编译系统初始化设置中有解析编译的TARGET_BUILD_VARIANT的配置与基本区别,
其中的一些编译控制是对的但是Module的Android.mk中的LOCAL_MODULE_TAGS 控制并不全适用目前的android4.2,这里记录一下我对Module的控制过程。
撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/39209341
首先还是这个放在Android.mk中的变量,默认在/build/core/base_rules.mk 中:
LOCAL_MODULE_TAGS := $(sort $(LOCAL_MODULE_TAGS))
ifeq (,$(LOCAL_MODULE_TAGS))
LOCAL_MODULE_TAGS := optional
endif
而且并不是 LOCAL_MODULE_TAGS :=optional 就会都安装进system.img !
LOCAL_MODULE_TAGS 在 android 4.2 能取的值有:
# Only the tags mentioned in this test are expected to be set by module
# makefiles. Anything else is either a typo or a source of unexpected
# behaviors.
ifneq ($(filter-out debug eng tests optional samples shell_ash shell_mksh,$(LOCAL_MODULE_TAGS)),)
$(warning unusual tags $(LOCAL_MODULE_TAGS) on $(LOCAL_MODULE) at $(LOCAL_PATH))
endif
其中TARGET_BUILD_VARIANT 还是对应:
默认类型,安装 LOCAL_MODULE_TAGS 的类型为/build/core/main.mk:
ifeq ($(TARGET_BUILD_VARIANT),eng)
tags_to_install := debug eng
安装 PRODUCT_PACKAGES 中定义的Module
用于发行版,像之前描述的关闭log,shel,rootl,编译出odex Android——编译odex保护
LOCAL_MODULE_TAGS 的值不能为 user
安装哪些Module 只依赖与 PRODUCT_PACKAGES
用于调试,安装 LOCAL_MODULE_TAGS 的类型为/build/core/main.mk:
ifeq ($(user_variant),userdebug)
# Pick up some extra useful tools
tags_to_install += debug
安装 PRODUCT_PACKAGES 中定义的Module
这里记录一种现象,不管 Module 是apk 还是 lib ,有的时候在单独 mmm 编译 的时候,
是可以安装到 /out 中的system对应位置的,最后能够打包进系统的system.img
但是 如果整体的 make -j* 编译系统,那么 对应的 apk .lib 就会生成在 /out 下的 symbols/system 对应的位置,
最后是不会打包进系统system.img 的!
这就是因为 Module 的LOCAL_MODULE_TAGS 和当前的编译的TARGET_BUILD_VARIANT 没有满足上面说到的规则,
Module 并不认定为需要 install 的!
可以按照上面的规则,修改Module的 LOCAL_MODULE_TAGS 或者 看下面的 在 PRODUCT_PACKAGES 中添加 Module !
这里只区分对Module的安装控制,可以看到在4.2 中 对Module的控制级别最高的是 PRODUCT_PACKAGES 这个变量!
这个变量在很多.mk中都有赋值,比如在device中的 device.mk 中,而且都是 类似这样的:
# jscese add libusb and compat lib ,usb-modeswitch execute binary for 3G
PRODUCT_PACKAGES += \
rild \
libusb \
libusb-compat \
usb_modeswitch
#end
这就代表这些Module 无论如何都会被编译安装进系统。
简单记录下PRODUCT_PACKAGES 的作用过程:
首先在main.mk中的
# The base list of modules to build for this product is specified
# by the appropriate product definition file, which was included
# by product_config.make.
product_MODULES := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES)
# Filter out the overridden packages before doing expansion
product_MODULES := $(filter-out $(foreach p, $(product_MODULES), \
$(PACKAGES.$(p).OVERRIDES)), $(product_MODULES))
$(call expand-required-modules,product_MODULES,$(product_MODULES))
product_FILES := $(call module-installed-files, $(product_MODULES))
modules_to_install := $(sort \
$(ALL_DEFAULT_INSTALLED_MODULES) \
$(product_FILES) \
$(foreach tag,$(tags_to_install),$($(tag)_MODULES)) \
$(call get-tagged-modules, shell_$(TARGET_SHELL)) \
$(CUSTOM_MODULES) \
)
# build/core/Makefile contains extra stuff that we don't want to pollute this
# top-level makefile with. It expects that ALL_DEFAULT_INSTALLED_MODULES
# contains everything that's built during the current make, but it also further
# extends ALL_DEFAULT_INSTALLED_MODULES.
ALL_DEFAULT_INSTALLED_MODULES := $(modules_to_install)
include $(BUILD_SYSTEM)/Makefile
modules_to_install := $(sort $(ALL_DEFAULT_INSTALLED_MODULES))
ALL_DEFAULT_INSTALLED_MODULES :=
make 编译的时候的依赖如下:
# Building a full system-- the default is to build droidcore
droid: droidcore dist_files
...
.PHONY: droid
# Build files and then package it into the rom formats
.PHONY: droidcore
droidcore: files \
systemimage \
$(INSTALLED_BOOTIMAGE_TARGET) \
$(INSTALLED_RECOVERYIMAGE_TARGET) \
$(INSTALLED_USERDATAIMAGE_TARGET) \
$(INSTALLED_CACHEIMAGE_TARGET) \
$(INSTALLED_FILES_FILE)
# All the droid stuff, in directories
.PHONY: files
files: prebuilt \
$(modules_to_install) \
$(modules_to_check) \
$(INSTALLED_ANDROID_INFO_TXT_TARGET)
可以看到 依赖到了 上面分析到的 modules_to_install !