当前位置: 移动技术网 > IT编程>移动开发>Android > android开发 overlay机制研究

android开发 overlay机制研究

2019年04月18日  | 移动技术网IT编程  | 我要评论

孙若仪,搞定岳父大人迅雷下载,女权天下日志

一.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.  
  3. 86 ifeq (,$(local_resource_dir))
  4. 87 local_resource_dir := $(local_path)/res
  5. 88 else
  6. 89 need_compile_res := true
  7. 90 endif
  8. 93 package_resource_overlays := $(strip \
  9. 94 $(wildcard $(foreach dir, $(product_package_overlays), \
  10. 95 $(addprefix $(dir)/, $(local_resource_dir)))) \
  11. 96 $(wildcard $(foreach dir, $(device_package_overlays), \
  12. 97 $(addprefix $(dir)/, $(local_resource_dir)))))
  13. 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.  
  3. $(resource_export_package): $(all_res_assets) $(full_android_manifest) $(renderscript_file_stamp) $(aapt)
  4. $(create-empty-package)
  5. $(add-assets-to-package)
  6. endif

  1. #/build/core/definitions.mk
  2.  
  3. define add-assets-to-package
  4. $(hide) $(aapt) package -u $(private_aapt_flags) \
  5. $(addprefix -c , $(private_product_aapt_config)) \
  6. $(addprefix --preferred-density , $(private_product_aapt_pref_config)) \
  7. $(addprefix -m , $(private_android_manifest)) \
  8. $(addprefix -s , $(private_resource_dir))\
  9. $(addprefix -a , $(private_asset_dir)) \
  10. $(addprefix -i , $(private_aapt_includes)) \
  11. $(addprefix --min-sdk-version , $(private_default_app_target_sdk)) \
  12. $(addprefix --target-sdk-version , $(private_default_app_target_sdk)) \
  13. $(if $(filter --product,$(private_aapt_flags)),,$(addprefix --product , $(target_aapt_characteristics))) \
  14. $(if $(filter --version-code,$(private_aapt_flags)),,$(addprefix --version-code , $(platform_sdk_version))) \
  15. $(if $(filter --version-name,$(private_aapt_flags)),,$(addprefix --version-name , $(platform_version)-$(build_number))) \
  16. $(addprefix --rename-manifest-package , $(private_manifest_package_name)) \
  17. $(addprefix --rename-instrumentation-target-package , $(private_manifest_instrumentation_for)) \
  18. -f $@
  19. endef

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


  1. #/build/core/base_rules.mk
  2.  
  3. 404 $(local_intermediate_targets): private_resource_dir := $(local_resource_dir)
  4. 405 $(local_intermediate_targets): private_asset_dir := $(local_asset_dir)
  5. 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 里面定义多个目录,如果只修改其中一个目录里的配置文件,那么无论改哪个目录修改都会生效。如果多个目录同时修改,那么最前面定义的那个目录将生效。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网