Android预优化那些事

Preopt ART Dalvik
APK的预优化原理和作用

  • Android预优化那些事

    • 1.什么是Android预优化
    • 2.Android预优化的原理
    • 3.Android ART优化的过程
    • 4.Android预优化的过程
    • 5.项目中执行的效果

1.什么是Android预优化

Android预优化,也就是把Android在启动或APP在运行时所需要做的一些事情,把这些事情转移到编译APK时完成,来达到更快的Android系统启动速度和更快的APP运行速度。

2.Android预优化的原理

先来回顾一下Android的发展史,在2014年的Google I/O大会上,Google隆重的发布了Android 4.4操作系统,其中有一个环节着重介绍了ART(Android runtime),也就是虚拟机,也就是运行APP的环境,也就是运行Java代码的虚拟机。虽然Android 4.4版本默认仍然用DVM(Dalvik VM),但到Android 5.0时ART就变成了默认模式,自此,DVM时代一去不再复返。
DVM和ART和Android的预优化有什么关系?先了解Java的几种虚拟机基本的工作机制:

  • (1)JVM:JVM虚拟机运行的是java字节码。Java文件到JVM的过程是:java -> java bytecode(class) -> java bytecode(jar)。
  • (2)DVM:DVM虚拟机解析执行的dex字节码。Java文件到DVM的过程是:java -> java bytecode(class) -> dalvik bytecode(dex)。
  • (3)ART:ART虚拟机执行本地机器码。Java文件到ART的过程是:java -> java bytecode(class) -> dalvik bytecode(dex) -> optimized android runtime machine code(oat)。

在Android 4.4(包括)之前用的是DVM,Android 4.4之后用的是ART,从java文件到虚拟机执行代码,ART比DVM多了oat的过程,ART所使用的AOT(Ahead-Of-Time)编译,在应用首次安装时,字节码预编译成机器码存在本地,而DVM是典型的JIT(Just-In-Time),在此模式下,应用每次运行的时候,字节码都需要即时编译器转换为机器码再执行,ART模式相对于DVM省去了解析字节码的过程,占用内存也相应减少,进而提高APP的运行效率,所以Andorid 5.0发布时,Google号称Android系统可以跑在512 M的内存的机器上,ART发挥了举足轻重的作用。

3.Android ART优化的过程

Zygote进程在启动的过程中,创建ART虚拟机。在ART中,打包在APK里面的Dex字节码是通过LLVM翻译成本地机器指令的。LLVM是一个用来快速开发自己的编译器的框架系统,在Dalvik运行时中,APK在安装的时候,安装服务PackageManagerService会通过守护进程installd调用一个工具 dexopt对打包在APK里面包含有Dex字节码的classes.dex进行优化,优化得到的文件保存在/data/dalvik-cache目录 中,并且以.odex为后缀名,表示这是一个优化过的Dex文件。在ART运行时中,APK在安装的时候,同样安装服务 PackageManager¬Service会通过守护进程installd调用另外一个工具dex2oat对打包在APK里面包含有Dex字节码进翻译。翻译后得到的是一个ELF格式的oat文件,这个oat文件同样是以.odex后缀结束,并且也是保存在/data/dalvik-cache目录中。

4.Android预优化的过程

在第三节可知,Android在首次启动和首次安装应用时,需要将字节码翻译成机器码,这样Android系统的启动速度将会大大减慢,如果没有预优化,APP的运行速度也会加上翻译所需要的时间。所以,这个翻译的工作需要转移到编译上面来,也就是所,在编译APK文件时,将会预先对APK进行翻译的优化,然后再打包到系统里面去,这样Android系统在首次启动时,就不再需要花费大量的时间去翻译APK的字节码。下文赘述这个过程的控制过程:
在项目的device.mk文件中有如下的配置:

如上图,当编译user版本时,WITH_DEXPREOPT将会置成true,
继续看WITH_DEXPREOPT的作用范围,如下:

在上图中,过滤各种条件,会执行LOCAL_DEX_PREOPT := $(DEX_PREOPT_DEFAULT)语句,而DEX_PREOPT_DEFAULT的定义在:

抛开其它条件,在user环境下编译,LOCAL_DEX_PREOPT会被置换成true,LOCAL_DEX_PREOPT是怎样控制编译呢?

在编译APP时,LOCAL_DEX_PREOPT是true,将会按照相应的规则优化APK文件,这个规则定在dex_preopt.mk文件中。

5.项目中执行的效果

在pixi5-5 4G的项目中Dialer、MMS、Contacts采用独立的仓库,服务器出版本的时候,不再编译源码中的这三个模块,而是已app list的方式,定制apk文件,所以就需要本地编译好apk文件,在上传到服务器。先来看看eng环境下(或关闭预优化)和user环境下编译App后会有什么不一样。
在eng环境下(或关闭预优化),以TctDialer为例,编译后输出的目录是这样的:

在看看user下编译的情况,编译后输出的目录是这样的:

对比可发现,没有预优化的apk文件有个classes.dex文件,而预优化的没有这个文件了,java代码跑哪里去了,可以看到输出目录多了oat子目录,编译后的java正好在这个目录下。
因此,在user环境下编译,生成的apk文件是不能直接上传到服务器的,因为这个apk已经没有java的代码了。所以在编译apk时,把mk文件中添加LOCAL_DEX_PREOPT := false把预编译关闭。

如果在user下编译的apk,push到daily的系统中,apk依然能够运行,不是没有classes.dex文件了吗?java代码都没有了,为什么还能运行?在第三节可知道,在android系统启动是会优化系统的app,所以daily中的APK的java代码被缓存到手机本地了,push user下编译的apk运行时依然运行的是daily版中apk缓存下来的code。

Android ART模式预优化那些事相关推荐

  1. android ART编译预优化

    点击打开链接 编译预优化 DEX文件编译比较花费时间.这在OTA或者工厂首次烧入程序后非常明显. 可以在BoardConfig.mk文件中使能编译预优化,在编译时将会为APK/jar做Dex优化(de ...

  2. Android预优化那些事

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

  3. Android art模式解析

    Android art模式解析 本文主要针对android系统art模式下面从安装apk到运行apk的一个过程,主要有一下几个方面: Art虚拟机介绍 安装时dex文件转化为oat文件 oat文件对应 ...

  4. Android art模式 调试注意的问题

    1.Android art模式调试会出现 部分方法有问题,如果shouldInterceptRequest方法.

  5. Android ART模式简介

    新书上市<深入解析Android 5.0系统> 以下内容节选自本书 Android4.4最大的变化就是引入ART模式来代替Dalvik虚拟机.ART是AndroidRuntime的缩写,它 ...

  6. android l art模式,Android ART模式简介

    Android4.4最大的变化就是引入ART模式来代替Dalvik虚拟机.ART是Android Runtime的缩写,它提供了以AOT(Ahead-Of-Time)的方式运行Android应用程序的 ...

  7. Android ART模式

    ART模式是Android Runtime的简称,从Android 4.2 开始出现,在Android 4.2以前,Android 系统的程序运行在Daivik Java的虚拟机上运行,这种运行模式还 ...

  8. android+art模式死机,ADB命令解决切换ART模式后reboot无法进入系统循环卡屏教程

    相信作为原生Android 4.4的一项特色功能,不少同学都会想要体验一下原汁原味ART模式吧.据说在ART模式下Android将不再卡顿,丝丝顺滑的流畅度直逼iOS.当然也有不少同学在把手机切换到A ...

  9. Dalvik虚拟机的优化 安卓4.4 ART模式 扭转战局的棋子

    传统的Dalvik虚拟机 11月1日,谷歌继续低调发布了Android 4.4和Nexus 5,Android 4.4作为最新的系统版本更换代号为KitKat,但人们发现这个版本的系统似乎只是在一些小 ...

最新文章

  1. 用python做乘法口诀表_使用python写乘法口诀表
  2. ie对java的设置字体,css3文字特效和浏览器兼容性
  3. python3字典列表_python3入门(3)---列表、元组、字典、集合详解
  4. 12.多媒体和超链接标签及其应用实例
  5. 论文浅尝 | 基于神经网络的知识推理
  6. win7 能下node什么版本_微软从未公开的win10版本,3GB+极度精简,老爷机有救了
  7. 华南理工大学计算机科学与工程学院篡改,华南理工大学涉嫌篡改成绩人员已被停职调查...
  8. 标签概述及GoodMES云标签的创新应用
  9. 常见的SQL面试题:经典50例
  10. Git捷径,游戏搞定!
  11. 权限设计=功能权限+数据权限
  12. JAVA 中的this 是什么意思?
  13. 薅羊毛算副业吗?薅羊毛到底是怎么赚钱的?
  14. 京东评论爬虫(详解)
  15. java摄氏度转华氏度 在控制台输入
  16. 基于神经网络的人工智能,人工神经网络心得体会
  17. linux越狱时手机怎么进入dfu,手动进入DFU模式并开始越狱
  18. openface源码理解(4)
  19. 梦见自己准备考计算机一级,梦见自己准备要去考试,却没准备好,心里很焦急是什么兆头...
  20. 北京地铁运营线路图 1号线 2号线 5号线 8号线 10号线 13号线 八通线和机场快轨

热门文章

  1. nginx -s stop 出现问题 error pid
  2. 11.24黄金投资分析、白银实时涨跌布局、原油操作指导
  3. 置顶关注这几个公众号,丰富您对世界的认知
  4. 硬盘变成RAW格式无法读取的解决办法
  5. 为逗女朋友开心,我用python写了个定时短信
  6. WifiP2pService的启动以及P2P的连接
  7. Shell中单引号和双引号的使用
  8. 游戏开发工具与Game Virtual Machine 设想
  9. 智能电视TV开发---如何实现程序省电
  10. PDF格式转换器的使用方法