build/core/package.mk
在definitions.mk 中添加build-overlay-dirs 和get-first-existing-file 函数
define build-overlay-dirs
$(wildcard $(foreach dir, $(PRODUCT_PACKAGE_OVERLAYS), \
$(addprefix $(dir)/, $(1)))) \
$(wildcard $(foreach dir, $(DEVICE_PACKAGE_OVERLAYS), \
$(addprefix $(dir)/, $(1))))
endef
define get-first-existing-file
$(shell for f in $(1); do [ -f $$f ] && echo $$f && break; done)
endef
package.mk中添加对full_android_manifest 的overlay的判断
把full_android_manifest := $(LOCAL_FULL_MANIFEST_FILE)改为:
android_manifest_local_path := $(LOCAL_PATH)/$(LOCAL_MANIFEST_FILE)
android_manifest_candidates := \
$(call build-overlay-dirs, $(android_manifest_local_path)) \
$(android_manifest_local_path)
full_android_manifest := \
$(call get-first-existing-file, $(android_manifest_candidates))
补充提高:
overlay只可以覆盖xml和图片文件,不能覆盖java文件
build/core/package.mk中处理overlay的逻辑控制如下:
package_resource_overlays := $(strip \
$(wildcard $(foreach dir, $(PRODUCT_PACKAGE_OVERLAYS), \
$(addprefix $(dir)/, $(LOCAL_RESOURCE_DIR)))) \
$(wildcard $(foreach dir, $(DEVICE_PACKAGE_OVERLAYS), \
$(addprefix $(dir)/, $(LOCAL_RESOURCE_DIR)))))
也就是对于一个应用可以同时存在PRODUCT_PACKAGE_OVERLAYS 和 DEVICE_PACKAGE_OVERLAYS
当两个overlay都存在时,PRODUCT_PACKAGE_OVERLAYS 生效