Android 자원 오 버 레이 메커니즘
17235 단어 Android
비교적 상세 한 블 로그 한 편 을 붙 여 넣 으 세 요.
http://mmmyddd.freeshell.net/wiki/android/overlay.html
Overlay Mechanism
The Android overlay mechanism allows the framework and package resources to be customized without changing the base packages. The customizable resourses fall into the following categories
Configurations (string, bool, bool-array)
Localization (string, string-array)
UI Appearance (color, drawable, layout, style, theme, animation)
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 Add Overlay Directories for Product
1.1 Product Overlays vs Device Overlays
There are two types of overaly directories that affect a product:
PRODUCT_PACKAGE_OVERLAYS: used by a particular product
DEVICE_PACKAGE_OVERLAYS: used several products that share a common device model
The PRODUCT_PACKAGE_OVERLAYS will override the DEVICE_PACKAGE_OVERLAYS if they contain same resources, the behavior is defined by:
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)
1.2 Change the makefile to add overlays
To add an overlay directory to a product, change the product configuration makefile (for example: device/vendor-name/device-name/product-name.mk) to add the following lines:
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)
If multiple overlay directories are required to be added, separate them with blank charactors. The directories defined first in the line will override the following directories if they contain the same set of resources.
1.3 Create resources under the overlay directory
To overlay the resources in a base package, the subdirectory containing the overlay resources under the overlay directory, must has the same path as the base package resource directory relative to the Android project root.
For example, if we want to overlay the resources under the base package directory:
packages/apps/Settings/res/
we need to create the directory:
/packages/apps/Settings/res/
and in the directory, put the overlay resources in the files with the same path and file names as where they are defined in the base package.
Note that:
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.
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 Check the resource in APK
After changed the overlay resources and built the target packages, sometimes we need to check if the overlay directory took effects and the values are changed in the finally generated apks.
2.2 Using 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 Using 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.apktool
For smali/baksmali info, see: http://code.google.com/p/smali/
2.3 Using dumpres
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.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.