Home | History | Annotate | only in /frameworks/base/libs/utils
Up to higher level directory
NameDateSize
Android.mk15-Nov-20112.8K
Asset.cpp15-Nov-201121.2K
AssetDir.cpp15-Nov-20111.7K
AssetManager.cpp15-Nov-201160.6K
BackupData.cpp15-Nov-20119K
BackupHelpers.cpp15-Nov-201145.6K
BlobCache.cpp15-Nov-20117.5K
BufferedTextOutput.cpp15-Nov-20117.4K
CallStack.cpp15-Nov-20118.4K
Debug.cpp15-Nov-20118.5K
FileMap.cpp15-Nov-20115.7K
Flattenable.cpp15-Nov-2011731
LinearTransform.cpp15-Nov-20117.2K
Looper.cpp15-Nov-201122.9K
misc.cpp15-Nov-20113.8K
MODULE_LICENSE_APACHE215-Nov-20110
NOTICE15-Nov-201110.4K
ObbFile.cpp15-Nov-20119.3K
PropertyMap.cpp15-Nov-20116.3K
README15-Nov-201110.6K
RefBase.cpp15-Nov-201117.9K
ResourceTypes.cpp15-Nov-2011178.1K
SharedBuffer.cpp15-Nov-20112.7K
Static.cpp15-Nov-20112.3K
StopWatch.cpp15-Nov-20112K
StreamingZipInflater.cpp15-Nov-20117.9K
String16.cpp15-Nov-201110.3K
String8.cpp15-Nov-201113.8K
StringArray.cpp15-Nov-20112.6K
SystemClock.cpp15-Nov-20113.3K
tests/15-Nov-2011
TextOutput.cpp15-Nov-20113.5K
Threads.cpp15-Nov-201126.3K
Timers.cpp15-Nov-20113.5K
Tokenizer.cpp15-Nov-20114.5K
Unicode.cpp15-Nov-201114.8K
VectorImpl.cpp15-Nov-201117.7K
ZipFileCRO.cpp15-Nov-20111.8K
ZipFileRO.cpp15-Nov-201127.3K
ZipUtils.cpp15-Nov-20119.4K

README

      1 Android Utility Function Library
      2 ================================
      3 
      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 
     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
    290