android在全局执行make时,编译目标的一个入口files是依赖于modules_to_install的
818 .PHONY: files
819 files: prebuilt \
820 $(modules_to_install) \
821 $(INSTALLED_ANDROID_INFO_TXT_TARGET)
而modules_to_install变量的组成定义如下:
719 modules_to_install := $(sort \
720 $(ALL_DEFAULT_INSTALLED_MODULES) \ //包含Product_copy_file的入口dst
721 $(product_FILES) \ //包含变量PRODUCT_PACKAGES定义的变量
722 $(foreach tag,$(tags_to_install),$($(tag)_MODULES)) \ //eng_MDOULES/debug_MODULES 变量PRODUCT_PACKAGES_ENG入口
723 $(CUSTOM_MODULES) \
724 )
即如果上面的变量中要是没有定义对应的目标模块,则即使加载了对应模块的Android.mk文件(加载Android.mk文件只是建立了模块编译和安装所需要的各种依赖关系),但在全局编译时最终还是不会执行build和install操作的,因为该module编译入口并没有存在于modules_to_install变量之中:
704 eng_MODULES := $(sort \
705 $(call get-tagged-modules,eng) \
706 $(call module-installed-files, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES_ENG)) \
707 )
671 product_MODULES := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES)
690 product_FILES := $(call module-installed-files, $(product_MODULES))
这里需要区别于单个Android.mk模块的mm/mmm指令,他的make编译过程时是直接将all_modules(本质也就是Andorid.mk中定义的LOCAL_MODULE变量)变量作为编译的入口,而该入口all_modules 又是依赖于LOCAL_BUILT_MODULE和LOCAL_INSTALLED_MODULE这两个变量的,故每一次全新的mm操作肯定会执行built和install的操作。
QA: 如何让系统中的某个默认模块不被安装到system.img中去,最根本的方法是:
android系统默认的PRODUCT_PACKAGES的变量配置mk文件一般存在于build/target/product下,此外和自己hardware平台相关的模块需求一般是定义到device目录下的product.mk或者device.mk文件中。如果不想让某个系统模块如apk等编译进入system下,则需要定位到
PRODUCT_PACKAGES
变量并删除bypass相应的module名字(一般加在
PRODUCT_PACKAGES变量中的
模块名字就是定义在android.mk中的LOCAL_MODULE变量值)。
ps:当然如果Android.mk中的模块存在依赖关系,则对应的依赖目标模块所在的android.mk定义的LOCAL_MODULE也是会编译和安装输出的,无需在变量
PRODUCT_PACKAGES指定
。