以下几类能够通过该机制定义:
For detailed introduction on Android application resources, please refer to:
http://developer.android.com/guide/topics/resources/available-resources.html
有两种不同的overaly目录定义,来影响最终的效果:
如果包含同一资源,那么 PRODUCT_PACKAGE_OVERLAYS 将覆盖 DEVICE_PACKAGE_OVERLAYS 中的, 这两个定义如下:
build/core/package.mk (Line: 93)
LOCAL_RESOURCE_DIR := \
$(wildcard $(foreach dir, $(PRODUCT_PACKAGE_OVERLAYS), \
$(addprefix $(dir)/, $(LOCAL_RESOURCE_DIR)))) \
$(wildcard $(foreach dir, $(DEVICE_PACKAGE_OVERLAYS), \
$(addprefix $(dir)/, $(LOCAL_RESOURCE_DIR)))) \
$(LOCAL_RESOURCE_DIR)
PRODUCT_PACKAGE_OVERLAYS & DEVICE_PACKAGE_OVERLAYS 功能是一样的,只是优先级不一样:
PRODUCT_PACKAGE_OVERLAYS 优先于 DEVICE_PACKAGE_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目录,需要用空格隔开.
如果有多个目录,并且都包含同一资源的定义,那么将使用第一个定义的目录中的资源。
想覆盖Android系统自带package中资源文件, 那么在overlay目录下必须包含和要替换package相同的路径, 该路径是Android源码目录的相对路径.
For example, 如果我们想要替换以下目录的资源文件:
packages/apps/Settings/res/
那么在overlay目录下面必须创建一样的目录:
....../overlay目录/packages/apps/Settings/res/
然后放入想要替换的资源(必须和系统package相同路径和文件名).
注意:
通过overlay改变apk资源文件并生成apk后,一般要检测生成的apk的资源是否已经改变了.
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
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.apktool
For smali/baksmali info, see: http://code.google.com/p/smali/
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.
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.