asysbang

标题: 实现AndroidManifest.xml的overlay [打印本页]

作者: admin    时间: 2013-4-20 15:17
标题: 实现AndroidManifest.xml的overlay
转载请注明: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 生效








欢迎光临 asysbang (http://asysbang.com/) Powered by Discuz! X2.5