Home | History | Annotate | Download | only in dalvik
      1 page.title=Configuring ART
      2 @jd:body
      3 
      4 <!--
      5     Copyright 2014 The Android Open Source Project
      6 
      7     Licensed under the Apache License, Version 2.0 (the "License");
      8     you may not use this file except in compliance with the License.
      9     You may obtain a copy of the License at
     10 
     11         http://www.apache.org/licenses/LICENSE-2.0
     12 
     13     Unless required by applicable law or agreed to in writing, software
     14     distributed under the License is distributed on an "AS IS" BASIS,
     15     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16     See the License for the specific language governing permissions and
     17     limitations under the License.
     18 -->
     19 
     20 
     21 <div id="qv-wrapper">
     22 <div id="qv">
     23   <h2 id="Contents">In this document</h2>
     24   <ol id="auto-toc">
     25   </ol>
     26 </div>
     27 </div>
     28 
     29 <h2 id=introduction>Introduction</h2>
     30 
     31 <p>This document is intended to discuss how to configure ART and its compilation
     32 options. Topics addressed here include configuration of pre-compilation of the
     33 system image, dex2oat compilation options at first boot (and post-OTA), and how
     34 to trade off system partition space, data partition space, and performance.</p>
     35 
     36 <p>See <a href="http://source.android.com/devices/tech/dalvik/index.html">ART
     37 and Dalvik</a>, the <a
     38 href="http://source.android.com/devices/tech/dalvik/dex-format.html">Dalvik
     39 Executable format</a>, and the remaining pages on source.android.com to work
     40 with ART. See <a
     41 href="http://developer.android.com/guide/practices/verifying-apps-art.html">Verifying
     42 App Behavior on the Android Runtime (ART)</a> to ensure your apps work
     43 properly.</p>
     44 
     45 <h2 id=how_art_works>How ART works</h2>
     46 
     47 <p>ART is the new Android runtime for the Android 5.0 (Lollipop or L) release and
     48 beyond. Dalvik is no longer available. </p>
     49 
     50 <p>Please note, this section merely summarizes ARTs configuration. For an
     51 in-depth description, see the <a
     52 href="https://www.google.com/events/io/io14videos/b750c8da-aebe-e311-b297-00155d5066d7">Android
     53 runtime</a> presentation conducted at Google I/O 2014. </p>
     54 
     55 <p>ART uses ahead-of-time (AOT) compilation. This means that, at installation, dex
     56 code is compiled to native code in OAT files, which replace Dalviks odex
     57 files. This has several implications:</p>
     58 
     59 <ul>
     60   <li> Performance is improved over Dalvik. There is also a commensurate improvement
     61 in power consumption measured in the lab.
     62   <li> There is no runtime code cache. The OAT files are mapped to memory (and are
     63 thus page-able). The RAM memory footprint for OAT files might seem larger in
     64 terms of Proportional Set Size (PSS, or the memory shared across processes
     65 divided evenly between the processes). But because they are pageable we have
     66 found the system impact is improved in terms of real memory pressure effects as
     67 the Dalvik JIT cache was not pageable.
     68   <li> Similar to preloaded classes in the zygote, ART attempts to pre-initialize a
     69 set of classes at compile time. This creates a boot.art file that comprises
     70 an image of the compacted heap of pre-initialized classes and related objects.
     71 This file is mapped into memory upon zygote startup. While this consumes
     72 additional storage (typically 10MB), it speeds zygote startup and creates
     73 opportunities for the system to swap out some preloaded classes under memory
     74 pressure. This also contributes to improved <a
     75 href="http://source.android.com/devices/low-ram.html">low-RAM</a> performance
     76 for ART, since in Dalvik much of this class information would have
     77 been stored in dirty pages in the linear alloc space.
     78   <li> Dex file compilation uses a tool called dex2oat and takes more time than
     79 dexopt. The increase in time varies, but 2-3x increases in compile time are not
     80 unusual. For example, apps that typically take a second to install using dexopt
     81 might take 2-3 seconds.
     82   <li> OAT files are larger than odex files if full compilation is enabled. We discuss
     83 options to mitigate this cost later in this document.
     84 </ul>
     85 
     86 <h2 id=compilation_options>Compilation options</h2>
     87 
     88 <p>Dex file compilation takes more time than dexopt, which can be noticeable when
     89 all of a users apps must be compiled during first boot (after factory reset or
     90 after receiving an OTA). To reduce the amount of compilation needed, ART
     91 supports the option of pre-optimizing libraries and applications in the system
     92 partition. Including the pre-optimized dex files takes space in the system
     93 image, so these options trade first boot time for system image size. Note that
     94 OTAs are relatively infrequent and subsequent boot times should be the same
     95 with or without pre-optimization.</p>
     96 
     97 <h3 id=undefined>WITH_DEXPREOPT</h3>
     98 
     99 <p>Pre-optimization is controlled by the build option
    100 <code>WITH_DEXPREOPT</code>. Before the L release, this was enabled by default
    101 in user builds. Starting in L, this option is opt-in and needs to be enabled
    102 in the product configuration such as a devices BoardConfig.mk file.</p>
    103 
    104 <p>Enabling <code>WITH_DEXPREOPT</code> causes everything in the system image to be
    105 pre-optimized. If this makes the system image too large, additional options can
    106 be specified to reduce the amount of pre-optimization. Note that all the
    107 following build options with PREOPT in the name must have <code>WITH_DEXPREOPT</code>
    108 enabled to work.</p>
    109 
    110 <p>Example usage (in products BoardConfig.mk):</p>
    111 
    112 <pre><code>WITH_DEXPREOPT := true</code></pre>
    113 
    114 <h3 id=dont_dexpreopt_prebuilts>DONT_DEXPREOPT_PREBUILTS</h3>
    115 
    116 <p>Enabling <code>DONT_DEXPREOPT_PREBUILTS</code> prevents the prebuilts from being
    117 pre-optimized. These are apps that have <code>include $(BUILD_PREBUILT)</code> specified
    118 in their Android.mk, such as Gmail. Skipping pre-optimization of prebuilt apps
    119 that are likely to be updated via Google Play saves /system space but does add
    120 to first boot time.</p>
    121 
    122 <p>Example usage (in products BoardConfig.mk):</p>
    123 
    124 <pre><code>WITH_DEXPREOPT := true
    125 DONT_DEXPREOPT_PREBUILTS := true</code></pre>
    126 
    127 <h3 id=with_dexpreopt_boot_img_only>WITH_DEXPREOPT_BOOT_IMG_ONLY</h3>
    128 
    129 <p>Enabling <code>WITH_DEXPREOPT_BOOT_IMG_ONLY</code> only pre-optimizes the
    130 boot image, which consists of boot.art with the image classes and boot.oat with
    131 code for the boot classpath. Enabling this saves significant /system space but
    132 means all apps will be optimized at first boot. Typically it is better to
    133 selectively disable app pre-optimization via
    134 <code>DONT_DEXPREOPT_PREBUILTS</code> or add-product-dex-preopt-module-config.</p>
    135 
    136 <p>Example usage (in products BoardConfig.mk):</p>
    137 
    138 <pre><code>WITH_DEXPREOPT := true
    139 WITH_DEXPREOPT_BOOT_IMG_ONLY := true</code></pre>
    140 
    141 <h3 id=local_dex_preopt>LOCAL_DEX_PREOPT</h3>
    142 
    143 <p>Pre-optimization can also be enabled or disabled on an individual app basis by
    144 specifying the <code>LOCAL_DEX_PREOPT</code> option in the module definition.
    145 This can be useful for disabling pre-optimization of apps that may immediately
    146 receive Google Play updates since the updates would render the pre-optimized
    147 code in the system image obsolete. This is also useful to save space on major
    148 version upgrade OTAs since users may already have newer versions of apps in the
    149 data partition.</p>
    150 
    151 <p><code>LOCAL_DEX_PREOPT</code> supports the values true or false to
    152 enable or disable pre-optimization respectively. In addition, nostripping can
    153 be specified if pre-optimization should not strip the classes.dex file from the
    154 apk or jar file. Normally this file is stripped since its no longer needed
    155 after pre-optimization, but this last option is necessary to allow third-party
    156 APK signatures to remain valid.</p>
    157 
    158 <p>Example usage (in apps Android.mk):</p>
    159 
    160 <pre><code>LOCAL_DEX_PREOPT := false</code></pre>
    161 
    162 <h3 id=product_dex_preopt_*>PRODUCT_DEX_PREOPT_*</h3>
    163 
    164 <p>Beginning post-L release in the Android Open Source Project (AOSP), a number of
    165 flags have been added that give further control to how pre-optimization is
    166 done. <code>PRODUCT_DEX_PREOPT_BOOT_FLAGS</code> passes options to dex2oat to control how
    167 the boot image is compiled. It can be used to specify customized image classes
    168 lists, compiled classes lists, and compiler filters, all of which are described
    169 in later sections. Similarly, <code>PRODUCT_DEX_PREOPT_DEFAULT_FLAGS</code>
    170 controls default flags to pass to dex2oat for compilation of everything besides
    171 the boot image, namely jar and apk files.</p>
    172 
    173 <p><code>PRODUCT_DEX_PREOPT_MODULE_CONFIGS</code> provides the ability to pass
    174 dex2oat options for a particular module and product configuration. It is set in
    175 a products device.mk file by <code>$(call
    176 add-product-dex-preopt-module-config,&lt;modules&gt;,&lt;option&gt;)</code>
    177 where &lt;modules&gt; is a list of <code>LOCAL_MODULE</code> and
    178 <code>LOCAL_PACKAGE</code> names for jar and apk files respectively. Through
    179 this flag, it is possible to have fine-grained control of pre-optimization for
    180 each dex file and a specific device. Such tuning allows /system space to be
    181 maximally used to improve first boot time.</p>
    182 
    183 <p>Example usage (in products device.mk):</p>
    184 
    185 <pre><code>PRODUCT_DEX_PREOPT_DEFAULT_FLAGS := --compiler-filter=interpret-only
    186 $(call add-product-dex-preopt-module-config,services,--compiler-filter=space)</code></pre>
    187 
    188 <h2 id=preloaded_classes_list>Preloaded Classes List</h2>
    189 
    190 <p>The preloaded classes list is a list of classes the zygote will initialize on
    191 startup. This saves each app from having to run these class initializers
    192 separately, allowing them to start up faster and share pages in memory. The
    193 preloaded classes list file is located at frameworks/base/preloaded-classes by
    194 default, and it contains a list that is tuned for typical phone use. This may
    195 be different for other devices, such as wearables, and should be tuned
    196 accordingly. Be careful when tuning this since adding too many classes wastes
    197 memory loading unused classes; meanwhile, adding too few forces each app to
    198 have to have its own copy, again wasting memory.</p>
    199 
    200 <p>Example usage (in products device.mk):</p>
    201 
    202 <pre><code>PRODUCT_COPY_FILES += &lt;filename&gt;:system/etc/preloaded-classes</code></pre>
    203 
    204 <p class="note"><strong>Note:</strong> This line must be placed before
    205 inheriting any product configuration makefiles that get the default one from
    206 build/target/product/base.mk.</p>
    207 
    208 <h2 id=image_classes_list>Image Classes List</h2>
    209 
    210 <p>The image classes list is a list of classes that dex2oat initializes ahead of
    211 time and stores in the boot.art file. This allows the zygote to load these
    212 results out of the boot.art file on startup instead of running the initializers
    213 for these classes itself during preloading. A key feature of this is that the
    214 pages loaded from the image and shared between processes can be clean, allowing
    215 them to be swapped out easily in low-memory situations. In L, by default the
    216 image classes list uses the same list as the preloaded classes list. Beginning
    217 post-L in AOSP, a custom image classes list can be specified using
    218 <code>PRODUCT_DEX_PREOPT_BOOT_FLAGS</code>.</p>
    219 
    220 <p>Example usage (in products device.mk):</p>
    221 
    222 <pre><code>PRODUCT_DEX_PREOPT_BOOT_FLAGS += --image-classes=&lt;filename&gt;</code></pre>
    223 
    224 <h2 id=compiled_classes_list>Compiled Classes List</h2>
    225 
    226 <p>In post-L AOSP, a subset of classes from the boot classpath can be specified to
    227 be compiled during pre-optimization using the compiled classes list. This can
    228 be a useful option for devices that are very tight on space and cant fit the
    229 entire pre-optimized boot image. However, note classes not specified by this
    230 list will not be compiled - not even on the device - and must be interpreted,
    231 potentially affecting runtime performance. By default, dex2oat will look for a
    232 compiled classes list in $OUT/system/etc/compiled-classes, so a custom one can
    233 be copied to that location by the device.mk. A particular file location can
    234 also be specified using <code>PRODUCT_DEX_PREOPT_BOOT_FLAGS</code>.</p>
    235 
    236 <p>Example usage (in products device.mk):</p>
    237 
    238 <pre><code>PRODUCT_COPY_FILES += &lt;filename&gt;:system/etc/compiled-classes</code></pre>
    239 
    240 <p class="note"><strong>Note:</strong> This line must be placed before
    241 inheriting any product configuration makefiles that get the default one from
    242 build/target/product/base.mk.</p>
    243 
    244 <h2 id=compiler_filters>Compiler Filters</h2>
    245 
    246 <p>In L, dex2oat takes a variety of --compiler-filter options to control how it
    247 compiles. Passing in a compiler filter flag for a particular app specifies how
    248 its pre-optimized. Heres a description of each available option:</p>
    249 
    250 <ul>
    251   <li><em>everything</em> - compiles almost everything, excluding class initializers and some rare
    252 methods that are too large to be represented by the compilers internal
    253 representation.
    254   <li><em>speed</em> - compiles most methods and maximizes runtime performance, which is the
    255 default option.
    256   <li><em>balanced</em> - attempts to get the best performance return on compilation investment.
    257   <li><em>space</em> - compiles a limited number of methods, prioritizing storage space.
    258   <li><em>interpret-only</em> - skips all compilation and relies on the interpreter to run code.
    259   <li><em>verify-none</em> - special option that skips verification and compilation, should be used only
    260 for trusted system code.
    261 </ul>
    262 
    263 <h2 id=with_dexpreopt_pic>WITH_DEXPREOPT_PIC</h2>
    264 
    265 <p>In post-L AOSP, <code>WITH_DEXPREOPT_PIC</code> can be specified to enable
    266 position-independent code (PIC). With this, compiled code from the image
    267 doesnt have to be relocated from /system into /data/dalvik-cache, saving space
    268 in the data partition. However, there is a slight runtime impact because it
    269 disables an optimization that takes advantage of position-dependent code.
    270 Typically, devices wanting to save space in /data should enable PIC
    271 compilation.</p>
    272 
    273 <p>Example usage (in products device.mk):</p>
    274 
    275 <pre><code>WITH_DEXPREOPT := true
    276 WITH_DEXPREOPT_PIC := true</code></pre>
    277 
    278 <h2 id=with_art_small_mode>WITH_ART_SMALL_MODE</h2>
    279 
    280 <p>For devices with very limited space, <code>WITH_ART_SMALL_MODE</code> can be
    281 enabled. This option compiles the boot classpath and nothing else, greatly
    282 reducing first boot time since most compilation is skipped. It also saves on
    283 storage because there is no compiled code for apps. However, this impacts
    284 runtime performance since app code has to be interpreted. The impact is limited
    285 since most performance sensitive code in the framework is still compiled, but
    286 regressions may appear in benchmarking.</p>
    287 
    288 <p>Example usage (in products device.mk):</p>
    289 
    290 <pre><code>WITH_ART_SMALL_MODE := true</code></pre>
    291 
    292 <p>In future releases, this build option will be removed since it can be done with
    293 this (in products device.mk):</p>
    294 
    295 <pre><code>PRODUCT_PROPERTY_OVERRIDES += \
    296      dalvik.vm.dex2oat-filter=interpret-only \
    297      dalvik.vm.image-dex2oat-filter=speed</code></pre>
    298 
    299 <h2 id=dalvik_vm_properties>dalvik.vm Properties</h2>
    300 
    301 <p>Most dalvik.vm properties in ART are similar to Dalvik, but there are a few
    302 additional ones as described below. Note that these options affect dex2oat
    303 during on-device compilation as well as during pre-optimization, whereas most
    304 of the options discussed above affect only pre-optimization.</p>
    305 
    306 <p>To control dex2oat while its compiling the boot image:</p>
    307 
    308 <ul>
    309   <li>dalvik.vm.image-dex2oat-Xms: initial heap size
    310   <li>dalvik.vm.image-dex2oat-Xmx: maximum heap size
    311   <li>dalvik.vm.image-dex2oat-filter: compiler filter option
    312 </ul>
    313 
    314 <p>To control dex2oat while its compiling everything besides the boot image:</p>
    315 
    316 <ul>
    317   <li> dalvik.vm.dex2oat-Xms: initial heap size
    318   <li> dalvik.vm.dex2oat-Xmx: maximum heap size
    319   <li> dalvik.vm.dex2oat-filter: compiler filter option
    320 </ul>
    321 
    322 <p>The options that control initial and maximum heap size for dex2oat should not
    323 be reduced since they could limit what applications can be compiled.</p>
    324 
    325 <h2 id=sample_usage>Sample Usage</h2>
    326 
    327 <p>The goal of these compiler options is to utilize available space in the system
    328 and data partition to reduce the amount of dex2oat that must be performed by
    329 the device. </p>
    330 
    331 <p>For devices with ample system and data space, enabling dex pre-optimization is
    332 all that is necessary.
    333 
    334 <p>BoardConfig.mk:</p>
    335 
    336 <pre><code>WITH_DEXPREOPT := true</code></pre>
    337 
    338 <p>If this causes the system image to become too large, the next thing to try is
    339 disabling pre-optimization of the prebuilts.
    340 
    341 <p>BoardConfig.mk:</p>
    342 
    343 <pre><code>WITH_DEXPREOPT := true
    344 DONT_DEXPREOPT_PREBUILTS := true</code></pre>
    345 
    346 <p>Again, if the system image is still too large, try pre-optimizing only the boot
    347 image.
    348 
    349 <p>BoardConfig.mk:</p>
    350 
    351 <pre><code>WITH_DEXPREOPT := true
    352 WITH_DEXPREOPT_BOOT_IMG_ONLY := true</code></pre>
    353 
    354 <p>However, limiting to pre-optimizing only the boot-image means all apps will
    355 have to be optimized on first boot. In order to avoid this, it is possible to
    356 combine these high level flags with more fine-grained controls to maximize the
    357 amount of pre-optimized apps.</p>
    358 
    359 <p>For instance, if disabling the pre-optimization of the prebuilts almost fits
    360 into the system partition, compiling the boot classpath with the space option
    361 may make it fit. Note this compiles fewer methods in the boot classpath,
    362 potentially interpreting more code and impacting runtime performance.
    363 
    364 <p>BoardConfig.mk:</p>
    365 
    366 <pre><code>WITH_DEXPREOPT := true
    367 DONT_DEXPREOPT_PREBUILTS := true</code></pre>
    368 
    369 <p>device.mk:</p>
    370 
    371 <pre><code>PRODUCT_DEX_PREOPT_BOOT_FLAGS := --compiler-filter=space</code></pre>
    372 
    373 <p>If a device has very limited system partition space, its possible to compile a
    374 subset of classes in the boot classpath using the compiled classes list. Boot
    375 classpath methods that arent in this list will have to be interpreted, which
    376 could affect runtime performance.
    377 
    378 <p>BoardConfig.mk:</p>
    379 
    380 <pre><code>WITH_DEXPREOPT := true
    381 WITH_DEXPREOPT_BOOT_IMG_ONLY := true</code></pre>
    382 
    383 <p>device.mk:</p>
    384 
    385 <pre><code>PRODUCT_COPY_FILES += &lt;filename&gt;:system/etc/compiled-classes</code></pre>
    386 
    387 <p>If a device has both limited space in the system and data partitions, compiler
    388 filter flags can be used to disable compilation of certain apps. This will save
    389 space in both system and data, as there wont be any compiled code, but these
    390 apps will have to be interpreted. This example configuration would pre-optimize
    391 the boot classpath but prevent compilation of other apps that are not
    392 prebuilts. However, to prevent noticeable performance degradation of
    393 system_server, the services.jar is still compiled but optimized for space. Note
    394 that user-installed applications will still use the default compiler filter of
    395 speed.
    396 
    397 <p>BoardConfig.mk:</p>
    398 
    399 <pre><code>WITH_DEXPREOPT := true
    400 DONT_DEXPREOPT_PREBUILTS := true</code></pre>
    401 
    402 <p>device.mk:</p>
    403 
    404 <pre><code>PRODUCT_DEX_PREOPT_DEFAULT_FLAGS := --compiler-filter=interpret-only
    405 $(call add-product-dex-preopt-module-config,services,--compiler-filter=space)</code></pre>
    406 
    407 <p>For a major version upgrade OTA, it can be useful to blacklist certain apps
    408 from being pre-optimized since they will likely be out of date. This can be
    409 done by specifying <code>LOCAL_DEX_PREOPT</code> (for all products) or with
    410 <code>PRODUCT_DEX_PREOPT_MODULE_CONFIGS</code> (for a particular product).
    411 
    412 <p>BoardConfig.mk:</p>
    413 
    414 <pre><code>WITH_DEXPREOPT := true</code></pre>
    415 
    416 <p>Android.mk (of blacklisted apps):</p>
    417 
    418 <pre><code>LOCAL_DEX_PREOPT := false</code></pre>
    419