转载请注明:www.asysbang.com
android4.0之后不支持对AndroidManifest.xml的overlay,可以参考android2.2来添加这个逻辑
主要修改文件:build/core/definitions.mk 和 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 生效
|