Android11下BUILD_PHONY_PACKAGE定义的Android.mk用mma可编译make失效
问题根因
该现象是Android 11编译系统的架构变更和模块构建规则调整共同导致的,核心原因如下:
- Android 10及更高版本默认采用Kati+Ninja替代纯Make作为构建后端,只有显式纳入构建目标树的模块才会触发其依赖链,纯Make阶段的隐式依赖不会被Ninja识别。
- 你的模块配置了
LOCAL_MODULE_TAGS := optional,mma命令的逻辑是主动将当前目录下的所有模块作为构建目标,所以不管标签类型都会触发构建,其关联的LOCAL_ADDITIONAL_DEPENDENCIES也会被执行;而全局make -j8默认只构建产品配置中PRODUCT_PACKAGES列表内的模块及其依赖,你的phony模块没有被加入该列表的话,根本不会进入Ninja的构建队列,对应的自定义目标自然不会被执行。 - Android 11新增了构件路径校验、分区校验机制,未符合规则的模块即使加入
PRODUCT_PACKAGES也会被裁剪,可能导致构建不触发。
解决方案
- 首先在对应产品的mk配置文件(通常为
device/<厂商>/<设备名>/device.mk或产品通用配置mk)中添加以下配置,将你的phony模块显式加入全局构建列表:
PRODUCT_PACKAGES += mypackage
- 模块配置优化,在
include $(BUILD_PHONY_PACKAGE)之前补充以下配置,避免被系统裁剪规则过滤:
# 标记为产品专属模块,适配Android 11+的分区校验规则 LOCAL_PRODUCT_MODULE := true
- 如果仍然不生效,检查是否开启了构件路径校验,将模块相关路径加入白名单:
PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST += \ $(mypackage_BUILD_PATH)/%
- 验证配置有效性:单独执行
make mypackage -j8,如果自定义目标可以正常触发,说明配置生效,再执行全局构建即可。
内容的提问来源于stack exchange,提问作者mozcelikors
相关产品推荐
相关产品推荐

