| The Android Open Source Project | cbb1011 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 1 | Android Utility Function Library | 
| Mårten Kongstad | 3145b38 | 2011-03-17 14:13:41 +0100 | [diff] [blame] | 2 | ================================ | 
|  | 3 |  | 
| The Android Open Source Project | cbb1011 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 4 |  | 
|  | 5 | If you need a feature that is native to Linux but not present on other | 
|  | 6 | platforms, construct a platform-dependent implementation that shares | 
|  | 7 | the Linux interface.  That way the actual device runs as "light" as | 
|  | 8 | possible. | 
|  | 9 |  | 
|  | 10 | If that isn't feasible, create a system-independent interface and hide | 
|  | 11 | the details. | 
|  | 12 |  | 
|  | 13 | The ultimate goal is *not* to create a super-duper platform abstraction | 
|  | 14 | layer.  The goal is to provide an optimized solution for Linux with | 
|  | 15 | reasonable implementations for other platforms. | 
|  | 16 |  | 
| Mårten Kongstad | 3145b38 | 2011-03-17 14:13:41 +0100 | [diff] [blame] | 17 |  | 
|  | 18 |  | 
|  | 19 | Resource overlay | 
|  | 20 | ================ | 
|  | 21 |  | 
|  | 22 |  | 
|  | 23 | Introduction | 
|  | 24 | ------------ | 
|  | 25 |  | 
|  | 26 | Overlay packages are special .apk files which provide no code but | 
|  | 27 | additional resource values (and possibly new configurations) for | 
|  | 28 | resources in other packages. When an application requests resources, | 
|  | 29 | the system will return values from either the application's original | 
|  | 30 | package or any associated overlay package. Any redirection is completely | 
|  | 31 | transparent to the calling application. | 
|  | 32 |  | 
|  | 33 | Resource values have the following precedence table, listed in | 
|  | 34 | descending precedence. | 
|  | 35 |  | 
|  | 36 | * overlay package, matching config (eg res/values-en-land) | 
|  | 37 |  | 
|  | 38 | * original package, matching config | 
|  | 39 |  | 
|  | 40 | * overlay package, no config (eg res/values) | 
|  | 41 |  | 
|  | 42 | * original package, no config | 
|  | 43 |  | 
|  | 44 | During compilation, overlay packages are differentiated from regular | 
|  | 45 | packages by passing the -o flag to aapt. | 
|  | 46 |  | 
|  | 47 |  | 
|  | 48 | Background | 
|  | 49 | ---------- | 
|  | 50 |  | 
|  | 51 | This section provides generic background material on resources in | 
|  | 52 | Android. | 
|  | 53 |  | 
|  | 54 |  | 
|  | 55 | How resources are bundled in .apk files | 
|  | 56 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  | 57 | Android .apk files are .zip files, usually housing .dex code, | 
|  | 58 | certificates and resources, though packages containing resources but | 
|  | 59 | no code are possible. Resources can be divided into the following | 
|  | 60 | categories; a `configuration' indicates a set of phone language, display | 
|  | 61 | density, network operator, etc. | 
|  | 62 |  | 
|  | 63 | * assets: uncompressed, raw files packaged as part of an .apk and | 
|  | 64 | explicitly referenced by filename. These files are | 
|  | 65 | independent of configuration. | 
|  | 66 |  | 
|  | 67 | * res/drawable: bitmap or xml graphics. Each file may have different | 
|  | 68 | values depending on configuration. | 
|  | 69 |  | 
|  | 70 | * res/values: integers, strings, etc. Each resource may have different | 
|  | 71 | values depending on configuration. | 
|  | 72 |  | 
|  | 73 | Resource meta information and information proper is stored in a binary | 
|  | 74 | format in a named file resources.arsc, bundled as part of the .apk. | 
|  | 75 |  | 
|  | 76 | Resource IDs and lookup | 
|  | 77 | ~~~~~~~~~~~~~~~~~~~~~~~ | 
|  | 78 | During compilation, the aapt tool gathers application resources and | 
|  | 79 | generates a resources.arsc file. Each resource name is assigned an | 
|  | 80 | integer ID 0xppttiii (translated to a symbolic name via R.java), where | 
|  | 81 |  | 
|  | 82 | * pp: corresponds to the package namespace (details below). | 
|  | 83 |  | 
|  | 84 | * tt: corresponds to the resource type (string, int, etc). Every | 
|  | 85 | resource of the same type within the same package has the same | 
|  | 86 | tt value, but depending on available types, the actual numerical | 
|  | 87 | value may be different between packages. | 
|  | 88 |  | 
|  | 89 | * iiii: sequential number, assigned in the order resources are found. | 
|  | 90 |  | 
|  | 91 | Resource values are specified paired with a set of configuration | 
|  | 92 | constraints (the default being the empty set), eg res/values-sv-port | 
|  | 93 | which imposes restrictions on language (Swedish) and display orientation | 
|  | 94 | (portrait). During lookup, every constraint set is matched against the | 
|  | 95 | current configuration, and the value corresponding to the best matching | 
|  | 96 | constraint set is returned (ResourceTypes.{h,cpp}). | 
|  | 97 |  | 
|  | 98 | Parsing of resources.arsc is handled by ResourceTypes.cpp; this utility | 
|  | 99 | is governed by AssetManager.cpp, which tracks loaded resources per | 
|  | 100 | process. | 
|  | 101 |  | 
|  | 102 | Assets are looked up by path and filename in AssetManager.cpp. The path | 
|  | 103 | to resources in res/drawable are located by ResourceTypes.cpp and then | 
|  | 104 | handled like assets by AssetManager.cpp. Other resources are handled | 
|  | 105 | solely by ResourceTypes.cpp. | 
|  | 106 |  | 
|  | 107 | Package ID as namespace | 
|  | 108 | ~~~~~~~~~~~~~~~~~~~~~~~ | 
|  | 109 | The pp part of a resource ID defines a namespace. Android currently | 
|  | 110 | defines two namespaces: | 
|  | 111 |  | 
|  | 112 | * 0x01: system resources (pre-installed in framework-res.apk) | 
|  | 113 |  | 
|  | 114 | * 0x7f: application resources (bundled in the application .apk) | 
|  | 115 |  | 
|  | 116 | ResourceTypes.cpp supports package IDs between 0x01 and 0x7f | 
|  | 117 | (inclusive); values outside this range are invalid. | 
|  | 118 |  | 
|  | 119 | Each running (Dalvik) process is assigned a unique instance of | 
|  | 120 | AssetManager, which in turn keeps a forest structure of loaded | 
|  | 121 | resource.arsc files. Normally, this forest is structured as follows, | 
|  | 122 | where mPackageMap is the internal vector employed in ResourceTypes.cpp. | 
|  | 123 |  | 
|  | 124 | mPackageMap[0x00] -> system package | 
|  | 125 | mPackageMap[0x01] -> NULL | 
|  | 126 | mPackageMap[0x02] -> NULL | 
|  | 127 | ... | 
|  | 128 | mPackageMap[0x7f - 2] -> NULL | 
|  | 129 | mPackageMap[0x7f - 1] -> application package | 
|  | 130 |  | 
|  | 131 |  | 
|  | 132 |  | 
|  | 133 | The resource overlay extension | 
|  | 134 | ------------------------------ | 
|  | 135 |  | 
|  | 136 | The resource overlay mechanism aims to (partly) shadow and extend | 
|  | 137 | existing resources with new values for defined and new configurations. | 
|  | 138 | Technically, this is achieved by adding resource-only packages (called | 
|  | 139 | overlay packages) to existing resource namespaces, like so: | 
|  | 140 |  | 
|  | 141 | mPackageMap[0x00] -> system package -> system overlay package | 
|  | 142 | mPackageMap[0x01] -> NULL | 
|  | 143 | mPackageMap[0x02] -> NULL | 
|  | 144 | ... | 
|  | 145 | mPackageMap[0x7f - 2] -> NULL | 
|  | 146 | mPackageMap[0x7f - 1] -> application package -> overlay 1 -> overlay 2 | 
|  | 147 |  | 
|  | 148 | The use of overlay resources is completely transparent to | 
|  | 149 | applications; no additional resource identifiers are introduced, only | 
|  | 150 | configuration/value pairs. Any number of overlay packages may be loaded | 
|  | 151 | at a time; overlay packages are agnostic to what they target -- both | 
|  | 152 | system and application resources are fair game. | 
|  | 153 |  | 
|  | 154 | The package targeted by an overlay package is called the target or | 
|  | 155 | original package. | 
|  | 156 |  | 
|  | 157 | Resource overlay operates on symbolic resources names. Hence, to | 
|  | 158 | override the string/str1 resources in a package, the overlay package | 
|  | 159 | would include a resource also named string/str1. The end user does not | 
|  | 160 | have to worry about the numeric resources IDs assigned by aapt, as this | 
|  | 161 | is resolved automatically by the system. | 
|  | 162 |  | 
|  | 163 | As of this writing, the use of resource overlay has not been fully | 
|  | 164 | explored. Until it has, only OEMs are trusted to use resource overlay. | 
|  | 165 | For this reason, overlay packages must reside in /system/overlay. | 
|  | 166 |  | 
|  | 167 |  | 
|  | 168 | Resource ID mapping | 
|  | 169 | ~~~~~~~~~~~~~~~~~~~ | 
|  | 170 | Resource identifiers must be coherent within the same namespace (ie | 
|  | 171 | PackageGroup in ResourceTypes.cpp). Calling applications will refer to | 
|  | 172 | resources using the IDs defined in the original package, but there is no | 
|  | 173 | guarantee aapt has assigned the same ID to the corresponding resource in | 
|  | 174 | an overlay package. To translate between the two, a resource ID mapping | 
|  | 175 | {original ID -> overlay ID} is created during package installation | 
|  | 176 | (PackageManagerService.java) and used during resource lookup. The | 
|  | 177 | mapping is stored in /data/resource-cache, with a @idmap file name | 
|  | 178 | suffix. | 
|  | 179 |  | 
|  | 180 | The idmap file format is documented in a separate section, below. | 
|  | 181 |  | 
|  | 182 |  | 
|  | 183 | Package management | 
|  | 184 | ~~~~~~~~~~~~~~~~~~ | 
|  | 185 | Packages are managed by the PackageManagerService. Addition and removal | 
|  | 186 | of packages are monitored via the inotify framework, exposed via | 
|  | 187 | android.os.FileObserver. | 
|  | 188 |  | 
|  | 189 | During initialization of a Dalvik process, ActivityThread.java requests | 
|  | 190 | the process' AssetManager (by proxy, via AssetManager.java and JNI) | 
|  | 191 | to load a list of packages. This list includes overlay packages, if | 
|  | 192 | present. | 
|  | 193 |  | 
|  | 194 | When a target package or a corresponding overlay package is installed, | 
|  | 195 | the target package's process is stopped and a new idmap is generated. | 
|  | 196 | This is similar to how applications are stopped when their packages are | 
|  | 197 | upgraded. | 
|  | 198 |  | 
|  | 199 |  | 
|  | 200 | Creating overlay packages | 
|  | 201 | ------------------------- | 
|  | 202 |  | 
|  | 203 | Overlay packages should contain no code, define (some) resources with | 
|  | 204 | the same type and name as in the original package, and be compiled with | 
|  | 205 | the -o flag passed to aapt. | 
|  | 206 |  | 
|  | 207 | The aapt -o flag instructs aapt to create an overlay package. | 
|  | 208 | Technically, this means the package will be assigned package id 0x00. | 
|  | 209 |  | 
|  | 210 | There are no restrictions on overlay packages names, though the naming | 
|  | 211 | convention <original.package.name>.overlay.<name> is recommended. | 
|  | 212 |  | 
|  | 213 |  | 
|  | 214 | Example overlay package | 
|  | 215 | ~~~~~~~~~~~~~~~~~~~~~~~ | 
|  | 216 |  | 
|  | 217 | To overlay the resource bool/b in package com.foo.bar, to be applied | 
|  | 218 | when the display is in landscape mode, create a new package with | 
|  | 219 | no source code and a single .xml file under res/values-land, with | 
|  | 220 | an entry for bool/b. Compile with aapt -o and place the results in | 
|  | 221 | /system/overlay by adding the following to Android.mk: | 
|  | 222 |  | 
|  | 223 | LOCAL_AAPT_FLAGS := -o com.foo.bar | 
|  | 224 | LOCAL_MODULE_PATH := $(TARGET_OUT)/overlay | 
|  | 225 |  | 
|  | 226 |  | 
|  | 227 | The ID map (idmap) file format | 
|  | 228 | ------------------------------ | 
|  | 229 |  | 
|  | 230 | The idmap format is designed for lookup performance. However, leading | 
|  | 231 | and trailing undefined overlay values are discarded to reduce the memory | 
|  | 232 | footprint. | 
|  | 233 |  | 
|  | 234 |  | 
|  | 235 | idmap grammar | 
|  | 236 | ~~~~~~~~~~~~~ | 
|  | 237 | All atoms (names in square brackets) are uint32_t integers. The | 
|  | 238 | idmap-magic constant spells "idmp" in ASCII. Offsets are given relative | 
|  | 239 | to the data_header, not to the beginning of the file. | 
|  | 240 |  | 
|  | 241 | map          := header data | 
|  | 242 | header       := idmap-magic <crc32-original-pkg> <crc32-overlay-pkg> | 
|  | 243 | idmap-magic  := <0x706d6469> | 
|  | 244 | data         := data_header type_block+ | 
|  | 245 | data_header  := <m> header_block{m} | 
|  | 246 | header_block := <0> | <type_block_offset> | 
|  | 247 | type_block   := <n> <id_offset> entry{n} | 
|  | 248 | entry        := <resource_id_in_target_package> | 
|  | 249 |  | 
|  | 250 |  | 
|  | 251 | idmap example | 
|  | 252 | ~~~~~~~~~~~~~ | 
|  | 253 | Given a pair of target and overlay packages with CRC sums 0x216a8fe2 | 
|  | 254 | and 0x6b9beaec, each defining the following resources | 
|  | 255 |  | 
|  | 256 | Name          Target package  Overlay package | 
|  | 257 | string/str0   0x7f010000      - | 
|  | 258 | string/str1   0x7f010001      0x7f010000 | 
|  | 259 | string/str2   0x7f010002      - | 
|  | 260 | string/str3   0x7f010003      0x7f010001 | 
|  | 261 | string/str4   0x7f010004      - | 
|  | 262 | bool/bool0    0x7f020000      - | 
|  | 263 | integer/int0  0x7f030000      0x7f020000 | 
|  | 264 | integer/int1  0x7f030001      - | 
|  | 265 |  | 
|  | 266 | the corresponding resource map is | 
|  | 267 |  | 
|  | 268 | 0x706d6469 0x216a8fe2 0x6b9beaec 0x00000003 \ | 
|  | 269 | 0x00000004 0x00000000 0x00000009 0x00000003 \ | 
|  | 270 | 0x00000001 0x7f010000 0x00000000 0x7f010001 \ | 
|  | 271 | 0x00000001 0x00000000 0x7f020000 | 
|  | 272 |  | 
|  | 273 | or, formatted differently | 
|  | 274 |  | 
|  | 275 | 0x706d6469  # magic: all idmap files begin with this constant | 
|  | 276 | 0x216a8fe2  # CRC32 of the resources.arsc file in the original package | 
|  | 277 | 0x6b9beaec  # CRC32 of the resources.arsc file in the overlay package | 
|  | 278 | 0x00000003  # header; three types (string, bool, integer) in the target package | 
|  | 279 | 0x00000004  #   header_block for type 0 (string) is located at offset 4 | 
|  | 280 | 0x00000000  #   no bool type exists in overlay package -> no header_block | 
|  | 281 | 0x00000009  #   header_block for type 2 (integer) is located at offset 9 | 
|  | 282 | 0x00000003  # header_block for string; overlay IDs span 3 elements | 
|  | 283 | 0x00000001  #   the first string in target package is entry 1 == offset | 
|  | 284 | 0x7f010000  #   target 0x7f01001 -> overlay 0x7f010000 | 
|  | 285 | 0x00000000  #   str2 not defined in overlay package | 
|  | 286 | 0x7f010001  #   target 0x7f010003 -> overlay 0x7f010001 | 
|  | 287 | 0x00000001  # header_block for integer; overlay IDs span 1 element | 
|  | 288 | 0x00000000  #   offset == 0 | 
|  | 289 | 0x7f020000  #   target 0x7f030000 -> overlay 0x7f020000 |