123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- Android Utility Function Library
- ================================
- If you need a feature that is native to Linux but not present on other
- platforms, construct a platform-dependent implementation that shares
- the Linux interface. That way the actual device runs as "light" as
- possible.
- If that isn't feasible, create a system-independent interface and hide
- the details.
- The ultimate goal is *not* to create a super-duper platform abstraction
- layer. The goal is to provide an optimized solution for Linux with
- reasonable implementations for other platforms.
- Resource overlay
- ================
- Introduction
- ------------
- Overlay packages are special .apk files which provide no code but
- additional resource values (and possibly new configurations) for
- resources in other packages. When an application requests resources,
- the system will return values from either the application's original
- package or any associated overlay package. Any redirection is completely
- transparent to the calling application.
- Resource values have the following precedence table, listed in
- descending precedence.
- * overlay package, matching config (eg res/values-en-land)
- * original package, matching config
- * overlay package, no config (eg res/values)
- * original package, no config
- During compilation, overlay packages are differentiated from regular
- packages by passing the -o flag to aapt.
- Background
- ----------
- This section provides generic background material on resources in
- Android.
- How resources are bundled in .apk files
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Android .apk files are .zip files, usually housing .dex code,
- certificates and resources, though packages containing resources but
- no code are possible. Resources can be divided into the following
- categories; a `configuration' indicates a set of phone language, display
- density, network operator, etc.
- * assets: uncompressed, raw files packaged as part of an .apk and
- explicitly referenced by filename. These files are
- independent of configuration.
- * res/drawable: bitmap or xml graphics. Each file may have different
- values depending on configuration.
- * res/values: integers, strings, etc. Each resource may have different
- values depending on configuration.
- Resource meta information and information proper is stored in a binary
- format in a named file resources.arsc, bundled as part of the .apk.
- Resource IDs and lookup
- ~~~~~~~~~~~~~~~~~~~~~~~
- During compilation, the aapt tool gathers application resources and
- generates a resources.arsc file. Each resource name is assigned an
- integer ID 0xppttiii (translated to a symbolic name via R.java), where
- * pp: corresponds to the package namespace (details below).
- * tt: corresponds to the resource type (string, int, etc). Every
- resource of the same type within the same package has the same
- tt value, but depending on available types, the actual numerical
- value may be different between packages.
- * iiii: sequential number, assigned in the order resources are found.
- Resource values are specified paired with a set of configuration
- constraints (the default being the empty set), eg res/values-sv-port
- which imposes restrictions on language (Swedish) and display orientation
- (portrait). During lookup, every constraint set is matched against the
- current configuration, and the value corresponding to the best matching
- constraint set is returned (ResourceTypes.{h,cpp}).
- Parsing of resources.arsc is handled by ResourceTypes.cpp; this utility
- is governed by AssetManager.cpp, which tracks loaded resources per
- process.
- Assets are looked up by path and filename in AssetManager.cpp. The path
- to resources in res/drawable are located by ResourceTypes.cpp and then
- handled like assets by AssetManager.cpp. Other resources are handled
- solely by ResourceTypes.cpp.
- Package ID as namespace
- ~~~~~~~~~~~~~~~~~~~~~~~
- The pp part of a resource ID defines a namespace. Android currently
- defines two namespaces:
- * 0x01: system resources (pre-installed in framework-res.apk)
- * 0x7f: application resources (bundled in the application .apk)
- ResourceTypes.cpp supports package IDs between 0x01 and 0x7f
- (inclusive); values outside this range are invalid.
- Each running (Dalvik) process is assigned a unique instance of
- AssetManager, which in turn keeps a forest structure of loaded
- resource.arsc files. Normally, this forest is structured as follows,
- where mPackageMap is the internal vector employed in ResourceTypes.cpp.
- mPackageMap[0x00] -> system package
- mPackageMap[0x01] -> NULL
- mPackageMap[0x02] -> NULL
- ...
- mPackageMap[0x7f - 2] -> NULL
- mPackageMap[0x7f - 1] -> application package
- The resource overlay extension
- ------------------------------
- The resource overlay mechanism aims to (partly) shadow and extend
- existing resources with new values for defined and new configurations.
- Technically, this is achieved by adding resource-only packages (called
- overlay packages) to existing resource namespaces, like so:
- mPackageMap[0x00] -> system package -> system overlay package
- mPackageMap[0x01] -> NULL
- mPackageMap[0x02] -> NULL
- ...
- mPackageMap[0x7f - 2] -> NULL
- mPackageMap[0x7f - 1] -> application package -> overlay 1 -> overlay 2
- The use of overlay resources is completely transparent to
- applications; no additional resource identifiers are introduced, only
- configuration/value pairs. Any number of overlay packages may be loaded
- at a time; overlay packages are agnostic to what they target -- both
- system and application resources are fair game.
- The package targeted by an overlay package is called the target or
- original package.
- Resource overlay operates on symbolic resources names. Hence, to
- override the string/str1 resources in a package, the overlay package
- would include a resource also named string/str1. The end user does not
- have to worry about the numeric resources IDs assigned by aapt, as this
- is resolved automatically by the system.
- As of this writing, the use of resource overlay has not been fully
- explored. Until it has, only OEMs are trusted to use resource overlay.
- For this reason, overlay packages must reside in /system/overlay.
- Resource ID mapping
- ~~~~~~~~~~~~~~~~~~~
- Resource identifiers must be coherent within the same namespace (ie
- PackageGroup in ResourceTypes.cpp). Calling applications will refer to
- resources using the IDs defined in the original package, but there is no
- guarantee aapt has assigned the same ID to the corresponding resource in
- an overlay package. To translate between the two, a resource ID mapping
- {original ID -> overlay ID} is created during package installation
- (PackageManagerService.java) and used during resource lookup. The
- mapping is stored in /data/resource-cache, with a @idmap file name
- suffix.
- The idmap file format is documented in a separate section, below.
- Package management
- ~~~~~~~~~~~~~~~~~~
- Packages are managed by the PackageManagerService. Addition and removal
- of packages are monitored via the inotify framework, exposed via
- android.os.FileObserver.
- During initialization of a Dalvik process, ActivityThread.java requests
- the process' AssetManager (by proxy, via AssetManager.java and JNI)
- to load a list of packages. This list includes overlay packages, if
- present.
- When a target package or a corresponding overlay package is installed,
- the target package's process is stopped and a new idmap is generated.
- This is similar to how applications are stopped when their packages are
- upgraded.
- Creating overlay packages
- -------------------------
- Overlay packages should contain no code, define (some) resources with
- the same type and name as in the original package, and be compiled with
- the -o flag passed to aapt.
- The aapt -o flag instructs aapt to create an overlay package.
- Technically, this means the package will be assigned package id 0x00.
- There are no restrictions on overlay packages names, though the naming
- convention <original.package.name>.overlay.<name> is recommended.
- Example overlay package
- ~~~~~~~~~~~~~~~~~~~~~~~
- To overlay the resource bool/b in package com.foo.bar, to be applied
- when the display is in landscape mode, create a new package with
- no source code and a single .xml file under res/values-land, with
- an entry for bool/b. Compile with aapt -o and place the results in
- /system/overlay by adding the following to Android.mk:
- LOCAL_AAPT_FLAGS := -o com.foo.bar
- LOCAL_MODULE_PATH := $(TARGET_OUT)/overlay
- The ID map (idmap) file format
- ------------------------------
- The idmap format is designed for lookup performance. However, leading
- and trailing undefined overlay values are discarded to reduce the memory
- footprint.
- idmap grammar
- ~~~~~~~~~~~~~
- All atoms (names in square brackets) are uint32_t integers. The
- idmap-magic constant spells "idmp" in ASCII. Offsets are given relative
- to the data_header, not to the beginning of the file.
- map := header data
- header := idmap-magic <crc32-original-pkg> <crc32-overlay-pkg>
- idmap-magic := <0x706d6469>
- data := data_header type_block+
- data_header := <m> header_block{m}
- header_block := <0> | <type_block_offset>
- type_block := <n> <id_offset> entry{n}
- entry := <resource_id_in_target_package>
- idmap example
- ~~~~~~~~~~~~~
- Given a pair of target and overlay packages with CRC sums 0x216a8fe2
- and 0x6b9beaec, each defining the following resources
- Name Target package Overlay package
- string/str0 0x7f010000 -
- string/str1 0x7f010001 0x7f010000
- string/str2 0x7f010002 -
- string/str3 0x7f010003 0x7f010001
- string/str4 0x7f010004 -
- bool/bool0 0x7f020000 -
- integer/int0 0x7f030000 0x7f020000
- integer/int1 0x7f030001 -
- the corresponding resource map is
- 0x706d6469 0x216a8fe2 0x6b9beaec 0x00000003 \
- 0x00000004 0x00000000 0x00000009 0x00000003 \
- 0x00000001 0x7f010000 0x00000000 0x7f010001 \
- 0x00000001 0x00000000 0x7f020000
- or, formatted differently
- 0x706d6469 # magic: all idmap files begin with this constant
- 0x216a8fe2 # CRC32 of the resources.arsc file in the original package
- 0x6b9beaec # CRC32 of the resources.arsc file in the overlay package
- 0x00000003 # header; three types (string, bool, integer) in the target package
- 0x00000004 # header_block for type 0 (string) is located at offset 4
- 0x00000000 # no bool type exists in overlay package -> no header_block
- 0x00000009 # header_block for type 2 (integer) is located at offset 9
- 0x00000003 # header_block for string; overlay IDs span 3 elements
- 0x00000001 # the first string in target package is entry 1 == offset
- 0x7f010000 # target 0x7f01001 -> overlay 0x7f010000
- 0x00000000 # str2 not defined in overlay package
- 0x7f010001 # target 0x7f010003 -> overlay 0x7f010001
- 0x00000001 # header_block for integer; overlay IDs span 1 element
- 0x00000000 # offset == 0
- 0x7f020000 # target 0x7f030000 -> overlay 0x7f020000
|