android编译时如何决定一个APK等Module是否被自动编译到system.img中
来源:程序员人生 发布时间:2016-07-06 08:22:00 阅读次数:2556次
android在全局履行make时,编译目标的1个入口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文件1般存在于build/target/product下,另外和自己hardware平台相干的模块需求1般是定义到device目录下的product.mk或device.mk文件中。如果不想让某个系统模块如apk等编译进入system下,则需要定位到PRODUCT_PACKAGES 变量并删除bypass相应的module名字(1般加在PRODUCT_PACKAGES变量中的模块名字就是定义在android.mk中的LOCAL_MODULE变量值)。
ps:固然如果Android.mk中的模块存在依赖关系,则对应的依赖目标模块所在的android.mk定义的LOCAL_MODULE也是会编译和安装输出的,无需在变量PRODUCT_PACKAGES指定。
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠