Android平台Overlay机制【转】

本文转载自:http://blog.csdn.net/wh_19910525/article/details/39254815

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

以下几类能够通过该机制定义:

(1),Configurations (string, bool, bool-array)

(2),Localization (string, string-array)

(3),UI Appearance (color, drawable, layout, style, theme, animation)

(4),Raw resources (audio, video, xml)

For detailed introduction on Android application resources, please refer to:

  http://developer.android.com/guide/topics/resources/available-resources.html

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 中的, 这两个定义如下:

build/core/package.mk (Line: 93)

1 LOCAL_RESOURCE_DIR := /2 $(wildcard $(foreach dir, $(PRODUCT_PACKAGE_OVERLAYS), /3 $(addprefix $(dir)/, $(LOCAL_RESOURCE_DIR)))) /4 $(wildcard $(foreach dir, $(DEVICE_PACKAGE_OVERLAYS), /5 $(addprefix $(dir)/, $(LOCAL_RESOURCE_DIR)))) /6 $(LOCAL_RESOURCE_DIR)

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

1.2 改变makefile来添加overlays的编译项

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

  (for example: device/vendor-name/device-name/product-name.mk)

添加以下几行:

PRODUCT_PACKAGE_OVERLAYS :=  device/vendor-name/device-name/product-name/overlay

$(PRODUCT_PACKAGE_OVERLAYS)

Or:

DEVICE_PACKAGE_OVERLAYS :=  device/vendor-name/device-name/common/overlay

$(DEVICE_PACKAGE_OVERLAYS)

(如: device/vendor-name/device-name/device_base.mk)中添加:

LOCAL_PATH := device/vendor-name/device-name

DEVICE_PACKAGE_OVERLAYS := $(LOCAL_PATH)/overlay

如果要定义多个overlays目录,需要用空格隔开。如果有多个目录,并且都包含同一资源的定义,那么将使用第一个定义的目录中的资源。

1.3 在overlay目录下创建资源文件

想覆盖Android系统自带package中资源文件, 那么在overlay目录下必须包含和要替换package相同的路径, 该路径是Android源码目录的相对路径.

For example, 如果我们想要替换以下目录的资源文件:

packages/apps/Settings/res/

那么在overlay目录下面必须创建一样的目录:

....../overlay目录/packages/apps/Settings/res/

然后放入想要替换的资源(必须和系统package相同路径和文件名)。

注意:

(1),For color, bool, string, array, style/theme types, the resource values are identifed by their keys, so for these types, there is no need to put the resources in a file with the same name as in the original base package.

(2),For layout, animation, picture drawables and raw types, the resources are indentifed by their file name, and overlay for these resources should keep the file name same as in the base packages.

2 在APK中检测资源

通过overlay改变apk资源文件并生成apk后,一般要检测生成的apk的资源是否已经改变了.

2.1 使用AAPT检测

Usage: aapt l[ist] [-v] [-a] file.{zip,jar,apk}    List contents of Zip-compatible archive.

aapt d[ump] [--values] WHAT file.{apk} [asset [asset ...]]

badging           Print the label and icon for the app declared in APK.

permissions     Print the permissions from the APK.

resources        Print the resource table from the APK.

configurations  Print the configurations in the APK.

xmltree           Print the compiled xmls in the given assets.

xmlstrings       Print the strings of the given compiled xml assets.

For example:

1. To dump string, bool values:   aapt dump resources Settings.apk

2. To dump a raw xml file:   aapt dump xmltree Settings.apk res/xml/appwidget_info.xml

3. To dump the current configurations/localizations:   aapt dump configurations Settings.apk

2.2 使用apktools检测   Reference:http://code.google.com/p/android-apktool/

Apktool v1.5.0.5a056e3 - a tool for reengineering Android apk files Copyright 2010 Ryszard Wi??niewski with smali v1.3.4-ibot8, and baksmali v1.3.4-ibot8.

Updated by iBotPeaches Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)  

Usage: apktool [-q|--quiet OR -v|--verbose] COMMAND [...]

COMMANDs are:

d[ecode] [OPTS] [ ]

Decode to

OPTS:          

-s, --no-src             Do not decode sources.

-r, --no-res             Do not decode resources.

-d, --debug             Decode in debug mode. Check project page for more info.

-f, --force                Force delete destination directory.

-t , --frame-tag        Try to use framework files tagged by .

--keep-broken-res    Use if there was an error and some resources were dropped, e.g.:"Invalid config flags detected. Dropping resources", but you want to decode them anyway, even with errors. You will have to  fix them manually before building.

b[uild] [OPTS] [] []  Build an apk from already decoded application located in . It will automatically detect, whether files was changed and perform needed steps only.If you omit then current directory will be used. If you omit then /dist/ will be used.

OPTS:

-f, --force-all              Skip changes detection and build all files.

-d, --debug                Build in debug mode. Check project page for more info.

if|install-framework [] Install framework file to your system.

For additional info, see:https://github.com/iBotPeaches/brut.apktoolFor smali/baksmali info, see:http://code.google.com/p/smali/.

3 More on AAPT and Overlay

3.1 How overlay works

While building the package APKs, the overlay directories are passed to aapt command lines using -S options in the same order as they are defined in PRODUCT_PACKAGE_OVERLAYS and DEVICE_PACKAGE_OVERLAYS.

For example, while building the Settings APK, the following command are executed:

out/host/linux-x86/bin/aapt package -u  -z /

-M packages/apps/Settings/AndroidManifest.xml /

-S device/vendor-name/device-name/product-name/overlay/packages/apps/Settings/res /

-S vendor/vendor-name/media/common/overlay/packages/apps/Settings/res -S packages/apps/Settings/res /

-I out/target/common/obj/APPS/framework-res_intermediates/package-export.apk /

--min-sdk-version 16 --target-sdk-version 16 --product default /

--version-code 16 --version-name 4.1.2-eng.xxxx.20121121.152327 /

-F out/target/product/product-name/obj/APPS/Settings_intermediates/package.apk

Note: some overlay directories that don't contain the Settings resources will be filtered first, and do not appear in the above command line.

3.2 Add extra resources in Overlay

Though not recommanded, we can add new resources in overlay directory, for example, if base package Settings doesn't define a bool value with key no_such_key, we can add it in the overlay file bool.xml like this:

... ...

true

... ...

If the add-resource line is missing, aapt tool will complain while creating the apk file:   device/vendor-name/device-name/product-name/overlay/packages/apps/Settings/res/values/bools.xml:30: error: Resource at no_such_key appears in overlay but /  not in the base package; use to add.

Another way to avoid the complaint is to run aapt with the option:   --auto-add-overlay     Automatically add resources that are only in overlays.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android动态overlay是一种在运行时修改应用程序的外观和行为的方法。通过动态overlay,您可以在不修改原始应用程序代码的情况下,通过叠加(overlay)外部资源文件来修改应用程序的界面元素、样式、布局和其他属性。 动态overlay的实现依赖于Android的资源覆盖机制。您可以创建一个独立的Overlay包(通常是一个apk文件),其中包含您想要叠加到目标应用程序上的资源文件。这些资源文件包括布局文件、样式文件、字符串等。 要使用动态overlay,您需要完成以下步骤: 1. 创建Overlay包:创建一个新的Android项目,将要覆盖的资源文件添加到该项目中。 2. 定义Overlay配置:在Overlay包的res/values目录下创建一个名为"config.xml"的文件,并定义Overlay的配置信息,例如目标应用程序的包名和版本号。 3. 打包Overlay:将Overlay项目打包成apk文件。 4. 安装Overlay:将Overlay apk安装到设备上。 5. 激活Overlay:通过调用OverlayManagerService API,将Overlay应用程序与目标应用程序关联起来,并将Overlay应用程序激活。 一旦激活了Overlay,它将会覆盖目标应用程序的相应资源,从而修改应用程序的外观和行为。您可以使用不同的Overlay应用程序来实现不同的修改效果,并且可以在运行时根据需要切换不同的Overlay。 请注意,动态overlay需要系统级权限才能进行操作,因此只有经过授权的应用程序才能够使用此功能。使用动态overlay时,务必小心处理和确保安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式小庄老师

要是觉得不错,就给我点支持吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值