点击打开链接

编译预优化

DEX文件编译比较花费时间。这在OTA或者工厂首次烧入程序后非常明显。

可以在BoardConfig.mk文件中使能编译预优化,在编译时将会为APK/jar做Dex优化(dex2oat):

[plain] view plain copy
WITH_DEXPREOPT := true

如果完全的编译预优化,则system.img的大小将会增加500MB。由于ASLR特性,预优化的DEX文件将被转化并拷贝到data分区,所以data分区同样增加500MB。
对于android 5.1,可以使用WITH_DEXPREOPT_PIC来禁止data分区中的优化文件,只在system分区存在编译预优化的文件,这会对运行时稍微有些影响,这可以通过在BoardConfig.mk中添加编译选项实现:

[plain] view plain copy
WITH_DEXPREOPT := true  
WITH_DEXPREOPT_PIC := true  
如果分区大小受限,则可以使用WITH_ART_SMALL_MODE参数减小编译预优化后的文件大小,这同样是在BoardConfig.mk文件中实现:
[plain] view plain copy
WITH_DEXPREOPT := true  
WITH_ART_SMALL_MODE := true

WITH_ART_SMALL_MODE主要是将BootClasspath和大多数APKs用到的Jar文件做dex2oat转化,只做传统的解释优化。而不会为apk启动编译预先优化,这将加速首次系统启动,但也影响app运行时性能。但是影响是有限的,这一优化将增加200MB的系统分区大小。

在往后的版本中,该优化选项去掉了。使用如下:

[plain] view plain copy
+WITH_DEXPREOPT := true  
+PRODUCT_PROPERTY_OVERRIDES +=\  
+               dalvik.vm.dex2oat-filter=interpret-only \  
+               dalvik.vm.image-dex2oat-filter=speed

编译预优化可能的问题

一类问题是64bit处理器上遇到的ABI的适用性问题。

共享UID问题

在64bit机器上共享UID非常复杂:

在64bit机器上,32bit和64bit app都能运行,有两种Zygote进程:“Zygote”和“Zygote64”。“Zygote”用于fork 32bit应用进程,“Zygote64”用于fork 64bit进程。
如果应用共享UID(在AndroidManifest.xml文件中使用android.shareUserId),尤其是当它们共享进程时(使用“android:process”指定app运行的目标进程),则所有的共享UID相同的进程必须运行在相同的进程中。
只有不依赖JNI的apk,可以被同时编译成32bit和64bit。如果使能了编译预优化,在编译时将生成二进制文件。对于64bit机器,绝大多少apk默认将被编译成64bit二进制,在编译预优化完成后,为了节省空间apk的classes.dex将被删除,但是如果apk依赖native代码,并且native代码被编译成了32bit二进制,apk同样要被编译成32bit二进制。
问题来了,如果一个32bit apk和一个64bit apk使用共享UID,这将导致未知问题。
如果apk不共享UID,将不会出现问题。
有三种解决方法:

对于所有共享相同UID的apk, 在编译的.mk文件中添加LOCAL_MULTILIB := both以支持两个版本的odex。
在.mk文件中使用LOCAL_DEX_PREOPT := nostripping以确保classes.dex文件不被删除,这将节约存储空间,但是影响启动时间。
创建伪link以使PackageManager运行在32bit模式,这通过将ystem/app/(appname)/lib/arm/通过符号链接到任意的32bit库。

android ART编译预优化相关推荐

  1. Android ART模式预优化那些事

    Android预优化那些事 Preopt ART Dalvik APK的预优化原理和作用 Android预优化那些事 1.什么是Android预优化 2.Android预优化的原理 3.Android ...

  2. Android Sutido 编译速度优化

    虽然Android Studio 此时已经更新到了Android Studio 2.1版本,build 版本android-studio-bundle-143.2739321.但是在安装该版本都是根据 ...

  3. Android首次启动时间长优化之预编译提取Odex

    提示!应用程序的安装有两种情况,第一:首次启动系统时安装.第二:系统启动完毕后安装. 本篇博文基于第一种安装场景.在系统首次启动的场景中,系统会对/system/app./system/priv-ap ...

  4. android预置app 不分解odex,Android首次启动时间长优化之预编译提取Odex

    提示!应用程序的安装有两种情况,第一:首次启动系统时安装:第二:系统启动完成后安装.本篇博文基于第一种安装场景.在系统首次启动的场景中,系统会对/system/app./system/priv-app ...

  5. Android预优化那些事

    https://blog.csdn.net/myfriend0/article/details/54970455 Android预优化那些事 Preopt ART Dalvik APK的预优化原理和作 ...

  6. Android系统编译优化:使用Ninja加快编译

    背景 环境 关键编译阶段和耗时分析 阶段一:Soong bootstrap 阶段二:Kati遍历.mk搜集与ninja生成 阶段三:Ninja编译 编译优化 对比汇总 背景 Android系统模块代码 ...

  7. android quicken模式,启动耗时分析(三)-ART编译分析

    原创文章,转载请注明出处,多谢! 一.ART简介 编译方式:具有JIT(Just-In-Time)和AOT(Ahead-of-Time)两种编译方式. 执行方式:解释器执行 和 执行编译后的机器码 两 ...

  8. 今日头条 Android '秒' 级编译速度优化

    背景介绍 Android 项目一般使用 gradle 作为构建打包工具,而其执行速度慢也一直为人所诟病,对于今日头条 Android 项目这种千万行级别的大型工程来说,全量编译一次的时间可能高达六七分 ...

  9. 美图Android编译速度优化实践指南

    分享嘉宾:张仙华 美图 资深开发工程师 分享嘉宾:张仙华,美图秀秀android团队资深研发工程师,负责编译加速.性能优化.架构设计等公共基础相关工作 导读:本文的主题是美图秀秀的Android编译速 ...

最新文章

  1. 开服侠显示服务器已停止,蜘蛛侠:极限(已关服)无法连接服务器是什么原因...
  2. Pyhon爬虫开发:URLError的使用
  3. HTTPS连接的前几毫秒发生了什么
  4. 数据结构与算法分析:C语言描述(原书第2版 简体中文版!!!) PDF+源代码+习题答案...
  5. virtualenv在windows10下面使用的注意事项
  6. 关于Unity中的Mesh Collider碰撞器
  7. 如何写一个包含多个事件四则运算的留存SQL ——impala hive
  8. proxmox集群节点崩溃处理
  9. 微软 2018 Build 大会前瞻:AI、Azure、Windows 10 都在!
  10. R语言:Error in file(out, “wt“) : cannot open the connection
  11. 3Dmax读取丢失的贴图的方法
  12. Win10 实现对计算机的远程控制 (Windows自带+QQ)
  13. 软件测试中单元测试的内容有哪些?-alltesting云测试
  14. 修改网页logo图片
  15. 数仓建模—表设计规范
  16. 第2章 ISA防火墙策略配置
  17. 黑客的专用通道以及入侵方法
  18. matlab实现三分之一倍频程,三分之一倍频程程序
  19. 【Origin双y轴】三条曲线,其中两条曲线共用一个y轴
  20. three.js例子

热门文章

  1. apache http server 停止工作_配置nginx,Apache支持pathinfo模式-什么是phpinfo模式
  2. 不是说一个源程序中只能有一个public类?怎么内部类可以用public?
  3. 013_JDBC模板使用第三方连接池
  4. 017_layout排版
  5. oracle 日志大于4g,Oracle日志文件达到4G
  6. mongodb 默认端口号_快2020年了,该如何面对BATJM对MongoDB灵魂式的拷问呢?
  7. fatal: unable to access : The requested URL returned error: 403
  8. Android四大组件之BroadCastReceiver
  9. 摆脱“人肉”审核,从0搭建可视化SQL自动审核平台
  10. 用html通过python调用mysql_HTTP协议与使用Python获取数据并写入MySQL