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


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指定
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值