国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > 综合技术 > android编译时如何决定一个APK等Module是否被自动编译到system.img中

android编译时如何决定一个APK等Module是否被自动编译到system.img中

来源:程序员人生   发布时间:2016-07-06 08:22:00 阅读次数:2537次

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指定
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生