android overlay机制研究

一.overlay 介绍

Android overlay 机制允许在不修改packages中apk的情况下,来自定义 framework和package中的资源文件,实现资源的定制。来达到显示不同的UI的目的.

二.overlay编译流程分析

1.添加overlay 目录

1.1 Product Overlays与Device Overlays

有两种不同的overaly目录定义,来影响最终的效果:
PRODUCT_PACKAGE_OVERLAYS: used by a particular product
DEVICE_PACKAGE_OVERLAYS: used several products that share a common device model
如果包含同一资源,那么 PRODUCT_PACKAGE_OVERLAYS 将覆盖 DEVICE_PACKAGE_OVERLAYS 中的。

PRODUCT_PACKAGE_OVERLAYS 和 DEVICE_PACKAGE_OVERLAYS 功能是一样的,只是优先级不一样:PRODUCT_PACKAGE_OVERLAYS 优先于 DEVICE_PACKAGE_OVERLAYS。

添加overlay目录,为了添加一个overlay目录, 需要修改产品的makefile:
例:

 
 
  1. #/device/s3graphics/zx2000/zx2k_hdtv.mk
  2. 334 # overlay
  3. 335 DEVICE_PACKAGE_OVERLAYS := \
  4. 336 device/s3graphics/zx2000/overlay \
  5. 337 device/s3graphics/zx2000/overlay/location

2.在overlay目录下创建资源文件

想覆盖Android系统自带package中资源文件, 那么在overlay目录下必须包含和要替换package相同的路径, 该路径是Android源码目录的相对路径.
例:如果我们想要替换以下目录的资源文件: /frameworks/base/core/res/res/values/ 那么在overlay目录下面必须创建一样的目录:/device/s3graphics/zx2000/overlay/frameworks/base/core/res/res/values/
然后放入想要替换的资源(必须和系统package相同路径和文件名)。

3. 编译流程

 
 
  1. #/frameworks/base/core/res/Android.mk
  2. 16 LOCAL_PATH := $(call my-dir)
 
 
  1. #/build/core/package_internal.mk
  2. 86 ifeq (,$(LOCAL_RESOURCE_DIR))
  3. 87 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
  4. 88 else
  5. 89 need_compile_res := true
  6. 90 endif
  7. 93 package_resource_overlays := $(strip \
  8. 94 $(wildcard $(foreach dir, $(PRODUCT_PACKAGE_OVERLAYS), \
  9. 95 $(addprefix $(dir)/, $(LOCAL_RESOURCE_DIR)))) \
  10. 96 $(wildcard $(foreach dir, $(DEVICE_PACKAGE_OVERLAYS), \
  11. 97 $(addprefix $(dir)/, $(LOCAL_RESOURCE_DIR)))))
  12. 101 LOCAL_RESOURCE_DIR := $(package_resource_overlays) $(LOCAL_RESOURCE_DIR)

为每一个$(LOCAL_RESOURCE_DIR)目录添加$(DEVICE_PACKAGE_OVERLAYS)前缀。
编译执行结果:
package_resource_overlays= device/s3graphics/zx2000/overlay/frameworks/base/core/res/res device/s3graphics/zx2000/overlay/location/frameworks/base/core/res/res

然后将本地resource目录和overlay resource 目录加进 LOCAL_RESOURCE_DIR 中。
编译执行结果:
LOCAL_RESOURCE_DIR=device/s3graphics/zx2000/overlay/frameworks/base/core/res/res ,device/s3graphics/zx2000/overlay/location/frameworks/base/core/res/res , frameworks/base/core/res/res

使用aapt 工具对资源文件进行打包:

 
 
  1. #/build/core/package_internal.mk
  2. $(resource_export_package): $(all_res_assets) $(full_android_manifest) $(RenderScript_file_stamp) $(AAPT)
  3. $(create-empty-package)
  4. $(add-assets-to-package)
  5. endif
 
 
  1. #/build/core/definitions.mk
  2. define add-assets-to-package
  3. $(hide) $(AAPT) package -u $(PRIVATE_AAPT_FLAGS) \
  4. $(addprefix -c , $(PRIVATE_PRODUCT_AAPT_CONFIG)) \
  5. $(addprefix --preferred-density , $(PRIVATE_PRODUCT_AAPT_PREF_CONFIG)) \
  6. $(addprefix -M , $(PRIVATE_ANDROID_MANIFEST)) \
  7. $(addprefix -S , $(PRIVATE_RESOURCE_DIR))\
  8. $(addprefix -A , $(PRIVATE_ASSET_DIR)) \
  9. $(addprefix -I , $(PRIVATE_AAPT_INCLUDES)) \
  10. $(addprefix --min-sdk-version , $(PRIVATE_DEFAULT_APP_TARGET_SDK)) \
  11. $(addprefix --target-sdk-version , $(PRIVATE_DEFAULT_APP_TARGET_SDK)) \
  12. $(if $(filter --product,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --product , $(TARGET_AAPT_CHARACTERISTICS))) \
  13. $(if $(filter --version-code,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --version-code , $(PLATFORM_SDK_VERSION))) \
  14. $(if $(filter --version-name,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --version-name , $(PLATFORM_VERSION)-$(BUILD_NUMBER))) \
  15. $(addprefix --rename-manifest-package , $(PRIVATE_MANIFEST_PACKAGE_NAME)) \
  16. $(addprefix --rename-instrumentation-target-package , $(PRIVATE_MANIFEST_INSTRUMENTATION_FOR)) \
  17. -F $@
  18. endef

通过以上代码分析最终通过最终通过 aapt -S $(PRIVATE_RESOURCE_DIR) 将res内容加入到 framework-res.apk 中。

 
 
  1. #/build/core/base_rules.mk
  2. 404 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_RESOURCE_DIR := $(LOCAL_RESOURCE_DIR)
  3. 405 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ASSET_DIR := $(LOCAL_ASSET_DIR)
  4. 406 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_STATIC_JAVA_LIBRARIES := $(full_static_java_libs)

由于:PRIVATE_RESOURCE_DIR := $(LOCAL_RESOURCE_DIR)
因此最终执行的命令展开的结果为:
aapt -S device/s3graphics/zx2000/overlay/frameworks/base/core/res/res device/s3graphics/zx2000/overlay/location/frameworks/base/core/res/res frameworks/base/core/res/res

 
 
  1. aapt :
  2. -S directory in which to find resources. Multiple directories will be scanned
  3. and the first match found (left to right) will take precedence.

总结:如果DEVICE_PACKAGE_OVERLAYS 里面定义多个目录,如果只修改其中一个目录里的配置文件,那么无论改哪个目录修改都会生效。如果多个目录同时修改,那么最前面定义的那个目录将生效。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android overlay是一种在Android应用程序中实现界面定制化的技术。通过使用overlay,开发者可以在不修改原始应用程序代码的情况下,添加、修改或替换应用程序的布局、样式和资源。在Android中,overlay通常是通过创建一个新的AndroidManifest.xml文件来实现的。\[1\] 在创建AndroidManifest.xml文件时,需要指定overlay的优先级、是否静态以及目标包名。优先级决定了overlay的显示顺序,静态表示overlay在运行时不会被修改,目标包名指定了要进行定制化的应用程序。\[1\] 除了创建AndroidManifest.xml文件,还可以参考一些相关的资料来了解更多关于Android overlay的信息。例如,可以参考http://mmmyddd.github.io/wiki/android/overlay.html和https://developer.sonymobile.com/2014/04/22/sony-contributes-runtime-resource-overlay-framework-to-android-code-example/。\[2\] 在编译后生成的apk中,overlay的路径可以根据不同的方案进行调整。一种常见的路径是vendor/overlay/TestOverlay/TestOverlay.apk,可以通过设置LOCAL_MODULE_PATH来指定路径。\[3\] #### 引用[.reference_title] - *1* *3* [Android Overlay机制](https://blog.csdn.net/weixin_44021334/article/details/130421043)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Android overlay简单总结](https://blog.csdn.net/Dylan_Sen/article/details/78878641)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值