Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android各版本虚拟机的Dexopt区别

Android各版本虚拟机的Dexopt区别

作者头像
None_Ling
发布于 2020-12-02 06:59:39
发布于 2020-12-02 06:59:39
3.4K0
举报
文章被收录于专栏:Android相关Android相关

简述

Android 2.1版本到现在的Android 11 , 中间虚拟机变化过三次 :

版本

虚拟机类型

特性

2.1-4.4

Dalvik

JIT+解释器

5.0-7.0

ART

AOT

7.0-11

ART

AOT+JIT+解释器

各个版本ClassLoader加载的区别

image.png

各个版本dexopt产物的区别

5.0以下

使用Dalvik虚拟机 , 生成odex文件 . Dalvik采用的是JIT编译+解释器,也就是即时编译,每次应用运行时会实时将Dex翻译成机器码.

  • 优点 : 安装速度超快 , 占用存储空间小
  • 缺点 :
    • 由于在Dex加载时会触发dexopt , 导致Multidex加载的时候会非常慢
    • 由于热点代码的Monitor一直在运行 , 解释器解释的字节码会带来CPU和时间的消耗, 会带来电量的损耗
5.0 - 7.0

使用ART虚拟机 , 生成oat文件. 在ROM OTA或者恢复出场设置后 , 会要进行dex2oat根据当前ROM进行重新编译生成.oat文件.

  • 优点 : 运行时省电 , 运行速度快
  • 缺点 :
    • 由于安装APK时触发dex2oat , 需要编译成native code , 导致安装时间过长
    • 由于dex2oat生成的文件较大 , 会占用较多的空间
7.0 - 8.0

使用ART虚拟机 , 但是在7.0之上 , 增加了.vdex.art机制 , 在ART虚拟机再次启动/升级 , 加载Dex/Oat文件时 , 会减少Dex的校验时间 , 提升加载与运行效率

9.0

在ART虚拟机的基础上 , 增加了Cdex ( Compat Dex )机制 ,

compat_dex_file.h

Odex、Vdex、Cdex、Art文件

  • .vdex:其中包含 APK 的未压缩 DEX 代码,以及一些旨在加快验证速度的元数据。 目的是为了避免不必要的验证Dex文件合法性的过程,例如首次安装时进行dex2oat时会校验Dex 文件各个section的合法性,这时候使用的compiler filter 为了照顾安装速度等方面,并没有采用全量编译,当app启动后,运行一段时间后,收集了足够多的jit 热点方法信息,Android会在后台重新进行dex2oat, 将热点方法编译成机器代码,这时候就不用再重复做验证Dex文件的过程了
  • .odex:其中包含 APK 中已经过 AOT 编译的方法代码。
  • .art(optional):其中包含 APK 中列出的某些字符串和类的 ART 内部表示,用于加快应用启动速度。在ART加载的时候 , 则是通过Image进行加载.

Compiler-fileter

在dex2oat的时候 , 会有一个目标编译类型 , 会有以下几类 , 根据时机不同dex2oat的编译方式也会不同

  • verify:只运行 DEX 代码验证。
  • quicken:运行 DEX 代码验证,并优化一些 DEX 指令,以获得更好的解译器性能。
  • speed:运行 DEX 代码验证,并对所有方法进行 AOT 编译。
  • speed-profile:运行 DEX 代码验证,并对配置文件中列出的方法进行 AOT 编译。

参考资料

配置

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android虚拟机的JIT编译器
最近参加了华为方舟的Workshop,从编译到Runtime都有了一些体会,并且对于虚拟机的运行也有了一些了解。
None_Ling
2019/06/14
1.6K0
Android虚拟机的JIT编译器
从JVM到Dalivk再到ART(class,dex,odex,vdex,ELF)
现在市面上的 Android 手机大部分都是运行的是ART虚拟机了。还记得自己一部 Android手机(HuaweiG520),Android4.1 系统。那时候还是没有 ART虚拟机 的。作为Android开发者,我们应该对 Android 的发展历史有些了解为什么 Android 会经历这么多的变化。Android 是先有 JVM 然后是 Dalvik ,接着是现在的 ART虚拟机 。那么他们之间有什么关系呢?
静默加载
2020/05/29
2.2K0
【Android 安装包优化】APK 打包流程 ( 文件结构 | 打包流程 | 安装流程 | 安卓虚拟机 )
将打包好的 APK 文件安装到 Android 手机中 , 就是可运行的应用程序 ;
韩曙亮
2023/03/29
1.6K0
【Android 安装包优化】APK 打包流程 ( 文件结构 | 打包流程 | 安装流程 | 安卓虚拟机 )
【Android开发丨主题周】ART 的上位与 JIT 的回归
Android应用程序主要是通过Java语言开发的(当然,也可以结合NDK通过C/C++开发。另外,从Android N开始,Kotlin已经成为Android官方开发语言,但实际上Kotlin的编译产物仍然是在虚拟机上运行的)。Java语言的编译产物是不能直接在设备上运行的,而必须借助于虚拟机来执行。
博文视点Broadview
2020/06/12
6610
【Android开发丨主题周】ART 的上位与 JIT 的回归
dex优化对Arouter查找路径的影响
1、通过aapt打包资源文件res,对应生成R.java、resources.arsc和res文件(二进制&非二进制保持原来的代码)
2020labs小助手
2021/06/04
9850
Dalvik,ART与ODEX简析
如果你有这样的问题: 1.Dalvik和ART的区别 2.DEX在Dalvik转化为ODEX和ART中转化为ODEX的过程有上面区别 3.multidex在dalvik上起作用,ART上使用的也是multidex么(如果不是的话在application中写入multidex.install会对apk启动造成影响么)
Anymarvel
2018/10/22
1.6K0
Dalvik,ART与ODEX简析
Android N 中的ART
我们知道在Android N 中对其 ART做了比较大的变化。主要是同一程序的代码可能同时运行在本地机器码(编译)、解释和JIT(Just In Time)的混合运行模式,并且不同的用户,同一应用程序的代码,可能运行不同的编译代码。因为有了Profile-guided JIT/AOT Compilation,那么不同的用户行为对同一app可能会有不同的编译结果。N 上做此变化的其目的是为了在安装时间、内存占用、电池消耗和性能之间获得最好的折衷。
用户9732312
2022/05/13
1.1K0
Android N 中的ART
Android N混合编译与对热补丁影响解析
首先非常抱歉Tinker没有按期内测,这主要因为开源的代码需要通过公司内部审核与评测,这项工作大约还需要一个月左右。当前Tinker已经在公司内部开源,我们会努力让它以更完善的姿态与大家见面。 大约在六月底,Tinker在微信全量上线了一个补丁版本,随即华为反馈在Android N上微信无法启动。冷汗冒一地,Android N又搞了什么东东?为什么与instant run保持一致的补丁方式也跪了?talk is cheap,show me the code。趁着台风妮妲肆虐广东,终于有时间总结一把。在此非常
微信终端开发团队
2018/01/29
3.4K0
Android N混合编译与对热补丁影响解析
Dalvik虚拟机和ART
http://blog.csdn.net/watermusicyes/article/details/50526814
tea9
2022/07/16
5280
Android N 混合编译与对热补丁影响解析
大约在六月底,Tinker在微信全量上线了一个补丁版本,随即华为反馈在Android N上微信无法启动。冷汗冒一地,Android N又搞了什么东东?为什么与instant run保持一致的补丁方式也
张绍文
2017/07/18
3.6K0
Android N 混合编译与对热补丁影响解析
Android ClassLoader详解
我们知道不管是插件化还是组件化,都是基于系统的ClassLoader来设计的。只不过Android平台上虚拟机运行的是Dex字节码,一种对class文件优化的产物,传统Class文件是一个Java源码
xiangzhihong
2018/02/05
1.4K0
Android ClassLoader详解
Tinker:技术的初心与坚持
张绍文
2017/07/17
3.9K1
Tinker:技术的初心与坚持
ART 在 Android 安全攻防中的应用
在日常的 Android 应用安全分析中,经常会遇到一些对抗,比如目标应用加壳、混淆、加固,需要进行脱壳还原;又或者会有针对常用注入工具的检测,比如 frida、Xposed 等,这时候也会想知道这些工具的核心原理以及是否自己可以实现。
evilpan
2023/02/12
1.4K0
ART 在 Android 安全攻防中的应用
Android 虚拟机:你需要掌握的基本知识
本文简要介绍 Android Runtime 虚拟机里的一些细节点,主要包括 dex file, oat file, mirror::Class, ArtField, ArtMethod, DexCache, ClassTable 等。
张拭心 shixinzhang
2022/01/13
1.1K0
Android 虚拟机:你需要掌握的基本知识
android studio 输出apk过程,apk中的文件格式(bsh文件,dex文件),JVM、DVM、ART的区别,IOS与安卓的区别,ART和Dalvik
android studio 输出apk过程:https://www.jianshu.com/p/2babb51d2556
zhangjiqun
2024/12/16
2210
android studio 输出apk过程,apk中的文件格式(bsh文件,dex文件),JVM、DVM、ART的区别,IOS与安卓的区别,ART和Dalvik
JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对比
JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才能够运行Java程序,JAVA在编译后会生成类似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是,C编译成的汇编语言会直接在硬件上跑,但JAVA编译后生成的字节码是在JVM上跑,需要由JVM把字节码翻译成机器指令,才能使JAVA程序跑起来。
全栈程序员站长
2022/07/20
1.6K0
JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对比
热修复Class流派和Dex流派实现原理
基本原理:加载类的时候是找element,每个element对于一个dex。我要把我修复的那个类单独放到dex插入dexlist前面,在你做类加载从前往后找优先从你的dex加载加载的就是你修复后的class.这就是
小柔
2022/12/07
5920
热修复Class流派和Dex流派实现原理
JAVA虚拟机与Android虚拟机的区别
1.JAVA虚拟机运行的是JAVA字节码,Dalvik虚拟机运行的是Dalvik字节码 java虚拟机:JAVA->class文件 dalvik虚拟机:JAVA->class文件->Dalvik字节码->打包到dex中->DVM通过解释DEX文件来执行这些字节码。
老马的编程之旅
2022/06/22
1.2K0
JAVA虚拟机与Android虚拟机的区别
面试必问的安卓虚拟机,你真的掌握了么?——安卓虚拟机基础知识回顾
21世纪,安卓虚拟机正在一步步的走入我们的生活,小到个人部分朋友在电脑上使用安卓虚拟机玩手游,大到安卓从业人员在虚拟机上面跑程序。不得不承认,对于每一位Androider 而言,安卓虚拟机是我们日常开发中不可或缺的一环,但是关于安卓虚拟机的一些知识点和小细节你真的完全掌握了么?本文将就主要包括 dex file, oat file, mirror::Class, ArtField, ArtMethod, DexCache, ClassTable,这一块内容进行一个简单的概述和讨论,希望新手们多多学习,老手们温故而知新。
BlueSocks
2022/03/22
6770
面试必问的安卓虚拟机,你真的掌握了么?——安卓虚拟机基础知识回顾
Android内存管理(JVM 、DVM(dalvik) 、ART简单介绍)
本文不对JVM 、DVM(dalvik) 、ART这三者做具体的分析。只是从内存管理的角度来介绍下三者的区别和联系。
Anymarvel
2020/09/06
3.2K0
推荐阅读
相关推荐
Android虚拟机的JIT编译器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档