您当前的位置:首页 > 手机百科 > 安卓百科

Android虚拟机Dalvik和ART详解

时间:2023-02-20 16:04:22  来源:51CTO  作者:Android开发编程
App安装时不编译代码只校验合法性,运行时通过解释器执行,将运行频繁的代码进行编译放到内存缓存并且记录在本地配置文件,后台线程编译配置文件记录的方法存放到.odex文件,再次运行App时优先读.odex文件中编译后的代码,然后重复这个过程。

Android应用用JAVA/Kotlin编写,Android虚拟机并不使用JVM字节码,而是将Class文件通过DX编译器(现已换成D8)编译程dex文件,然后由虚拟机执行;

底层眼里无论是java还是kolin,最终都是机器码运行;

不废话,开始介绍

一、Dalvik简单介绍

1、Dalvik虚拟机介绍

Dalvik是google公司自己设计用于Android平台的虚拟机。Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为 .dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且 每一个Dalvik 应用作为一个独立的linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

2、Dalvik诞生消亡史

  • Android 1.0,使用Dalvik作为Android虚拟机运行环境。
  • Android 2.2,Google在Andriod虚拟机中加入了JIT编译器(Just-In-Time Compiler)。
  • Android 4.4,Google带来了全新的虚拟机运行环境ART,此时ART和Dalvik是共存的,用户可以在两者之间进行选择。
  • Android 5.0,ART全面取代了Dalvik成为了Android虚拟机运行环境,至此Dalvik退出历史舞台。

3、Dalvik 特点

  • Dalvik虚拟机运行的是Dalvik字节码,Dalvik字节码由Java字节码转换而来,并被打包到一个dex文件中。而JVM运行的是class文件或jar文件;
  • 加载速度快,dex相比于Jar文件会把所有包含的信息整合在一起,减少了冗余信息。这样就减少I/O操作,提高类的查找速度。
  • Dalvik虚拟机是基于寄存器,而JVM是基于栈(操作数栈)。虽然基于寄存器执行效率好,但是可移植性差,难跨平台。
  • Dalvik虚拟机允许在有限的内存中同时运行多个进程,每一个应用都运行在一个Dalvik虚拟机实例中,拥有独立的进程空间。
  • Dalvik虚拟机有共享机制,不同应用之间在运行时可以共享相同的类,拥有更高的效率。

二、ART虚拟机

1、ART概念介绍

  • ART虚拟机在Android 5.0开始替换Dalvik虚拟机。其处理应用程序执行的方式不同于Dalvik虚拟机,它不使用JIT而是使用了AOT(Ahead-Of-Time),也就是提前编译技术。并且对垃圾收集器也进行了改进和优化。
  • ART虚拟机由Android4.4被引入成为可选项,在Android5.0之后替换掉了Dalvik,并且在Android7.0和8.0分别进行了一系列改动。

2、基本概念和名词

  • .dex文件:App所有java源代码编译后生成众多class文件,由DX/D8,编译为一个/多个(multiDex)dex文件,由Android虚拟机编译执行。
  • .odex文件:dex文件经过验证和优化后的产物,art下的odex文件包含经过AOT编译后的代码以及dex的完整内容,但Android8.0之后odex中的dex内容移动到了.vdex文件。
  • .art文件:art下根据配置文件生成odex文件时同时生成.art文件,主要是为了提升运行时加载odex中热点代码的速度,包含了类信息和odex中热点方法的索引,运行App时会首先根据这个文件来加载odex中已经编译过的代码。
  • 解释器(Interpreter):用于程序运行时对代码进行逐行解释,翻译成对应平台的机器码执行。
  • JIT编译(Just In Time):由于解释器方式运行太慢引入,对于频繁运行的热点代码(判定标准一般是在某个时间段内执行次数达到某个阈值)进行实时编译(在ART下以方法为粒度)执行,并且缓存JIT编译后的代码在内存中用于下次执行。由于以方法为粒度(ArtMethod)进行编译,JIT编较于解释器可以生成效率更高的代码,运行更快。
  • AOT编译(Ahead-Of-Time):应用安装时全量编译所有代码为本地机器码,运行时直接执行机器码。

3、ART 如何运作

(1)4.4~7.0

最开始ART只采用AOT编译,在App安装时就编译所有代码存储在本地,打开App直接运行,这样做的优点是应用运行速度变快,缺点也很明显,App安装时间明显变长,而且占用存储空间较大

(2)7.0

Android N之后对于ART进行改动,重新引入了JIT编译,结合使用AOT/JIT混合编译,主要机制如下:

  • 安装时不进行任何编译,前几次运行仅通过解释器解释运行,同时对热点代码进行JIT编译,并将这些代码的相关信息记录在一个配置文件里
  • 设备处于空闲和充电状态时,编译守护进程读取配置文件对热点代码进行AOT编译并写入到app对应的odex文件中
  • 再次启动应用后优先使用AOT编译过的代码,否则使用解释器+JIT编译,重复这个过程
  • 对于一些庞大的APP,比如某宝,有些功能可能你一辈子都不会用到,根据上述策略这部分代码就不会被编译保存,从而减少了存储空间的占用。另外,在系统升级时也避免了全量编译所有现存应用造成的时间空间消耗。

(3)8.0

Android 8.0引入了.vdex文件,它里面包含 APK 的未压缩 DEX 代码,以及一些用于加快验证速度的元数据.

4、ART垃圾收集器优化

  • 只有一次GC暂停(Dalvik需要两次)。
  • 并发复制,可减少后台内存使用和碎片。
  • GC暂停的时间不受堆大小影响。
  • 在清理最近分配的短时对象这种特殊情况中,回收器的总GC时间更短。
  • 优化了垃圾回收的工效,能够更加及时地进行并行垃圾回收,这使得GC_FOR_ALLOC事件在典型用例中极为罕见。

5、ART时间线

  • Android 4.4 ,ART和Dalvik是共存的,用户可以在两者之间进行选择。
  • Android 5.0,正式取代Dalvik虚拟机成为Android虚拟机运行环境,Dalvik退出历史舞台,AOT取代JIT。
  • Android 7.0,JIT回归,采用JIT和AOP混合编译模式。
  • ART持续更新优化

6、Dalvik VM 和 ART VM 有什么区别

  • ART早期使用AOT技术,后期使用AOT+JIT混合,而Dalvik使用JIT。
  • ART支持64位CPU并兼容32位CPU,而Dalvik只支持32位CPU。
  • ART对垃圾收集器进行了改进优化,提高了吞吐量。

总结

核心内容就一句话:App安装时不编译代码只校验合法性,运行时通过解释器执行,将运行频繁的代码进行编译放到内存缓存并且记录在本地配置文件,后台线程编译配置文件记录的方法存放到.odex文件,再次运行App时优先读.odex文件中编译后的代码,然后重复这个过程。



Tags:Android   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Android Emulator黑屏怎么办 Android模拟器黑屏解决方法
Android Emulator黑屏问题困扰了非常多的玩家,Android Emulator作为一款安卓模拟器,可以让你在电脑上运行和浏览安卓应用程序,但是程序本身不是很稳定,很容易会出现黑屏,启动不了...【详细内容】
2024-03-04  Search: Android  点击:(37)  评论:(0)  加入收藏
Android 谷歌三件套:解锁谷歌生态!
大家是不是遇到这个情况?当我们需要下载一些国外的游戏或者软件的时候,需要在手机里面安装Google Play商店,然后通过Google Play商店下载国外软件!为了帮助大家使用上各种好用的...【详细内容】
2024-01-02  Search: Android  点击:(113)  评论:(0)  加入收藏
Android开发中常见的Hook技术有哪些?
Hook技术介绍Hook技术是一种在软件开发中常见的技术,它允许开发者在特定的事件发生时插入自定义的代码逻辑。常见的应用场景包括在函数调用前后执行特定的操作,或者在特定的事...【详细内容】
2023-12-25  Search: Android  点击:(85)  评论:(0)  加入收藏
在Android应用开发中使用NFC功能
NFC介绍NFC是指“近场通讯”(Near Field Communication),它是一种短距离无线通信技术,允许设备在非接触或极短距离内进行通信。NFC通常用于移动支付、门禁系统、智能标签和其他...【详细内容】
2023-12-22  Search: Android  点击:(102)  评论:(0)  加入收藏
关于Android图像Bitmap类,你要知道的一切
Bitmap介绍Bitmap是一种图像文件格式,它由像素阵列组成,每个像素都有自己的颜色信息。在计算机图形学中,Bitmap图像可以被描述为一个二维的矩阵,其中每个元素代表一个像素的颜色...【详细内容】
2023-12-19  Search: Android  点击:(99)  评论:(0)  加入收藏
Android开发中如何进行单元测试?
单元测试介绍单元测试是软件开发中的一种测试方法,用于验证代码中的最小可测试单元(通常是函数或方法)是否按预期工作。单元测试通常由开发人员编写,旨在隔离和测试代码的特定部...【详细内容】
2023-12-11  Search: Android  点击:(168)  评论:(0)  加入收藏
我的手机我做主,如何为Android手机应用换图标?
作为一名Android用户,你是否曾经为自己的手机桌面感到单调而乏味?虽然Android系统的桌面定制性已经非常强大,但有时候我们还是希望能够在细节上做出一些改变,尤其是对于那些每天...【详细内容】
2023-12-10  Search: Android  点击:(61)  评论:(0)  加入收藏
了解Android系统架构中的HAL硬件抽象层
在Android系统中,HAL的存在使得不同厂商的硬件可以统一被上层的应用程序调用,从而提高了系统的兼容性和可移植性。HAL还可以帮助开发者更方便地开发应用程序,因为他们不需要为...【详细内容】
2023-12-06  Search: Android  点击:(203)  评论:(0)  加入收藏
谷歌 CEO 皮查伊建议 Android 用户不要侧载应用,称非常危险
iOS和Android的一个显著差异是,Android支持用户从第三方渠道安装应用程序(即“侧载”)。然而,谷歌似乎并不希望用户这样做。最近,在与Epic Store的法律诉讼中,谷歌首席执行官桑达...【详细内容】
2023-11-20  Search: Android  点击:(167)  评论:(0)  加入收藏
Android数据对象序列化原理与应用
序列化与反序列化「序列化」是将对象转换为可以存储或传输的格式的过程。在计算机科学中,对象通常是指内存中的数据结构,如数组、列表、字典等。通过序列化,可以将这些对象转换...【详细内容】
2023-11-14  Search: Android  点击:(273)  评论:(0)  加入收藏
▌简易百科推荐
安卓手机内存满了,如何清理内存?
随着安卓手机的普及,越来越多的人开始使用安卓系统。然而,由于安卓系统的开放性和可定制性,许多用户可能会在手机上安装各种各样的应用程序,导致手机内存被占用,从而影响手机的运...【详细内容】
2024-01-11      Tags:清理内存   点击:(91)  评论:(0)  加入收藏
如何释放安卓应用内存:清理优化指南
清理安卓应用的内存占用可以提高设备性能并释放空间。以下是详细的步骤和方法:关闭不必要的应用: 进入设备的“最近使用的应用”或按下多任务切换按钮(通常是右下角的方形按钮)...【详细内容】
2024-01-11  智盼游    Tags:安卓   点击:(52)  评论:(0)  加入收藏
安卓系统更新迭代与Root需求的变化
随着安卓系统的不断更新迭代,我们见证了整个生态从混乱到规范的过程。回溯过去,安卓生态处于一个“妖魔横行”的时代,各种弹窗广告、自动下载、自动启动等问题层出不穷。为了解...【详细内容】
2024-01-03  科技办公达人莱说    Tags:安卓系统   点击:(51)  评论:(0)  加入收藏
Android 谷歌三件套:解锁谷歌生态!
大家是不是遇到这个情况?当我们需要下载一些国外的游戏或者软件的时候,需要在手机里面安装Google Play商店,然后通过Google Play商店下载国外软件!为了帮助大家使用上各种好用的...【详细内容】
2024-01-02  MatrixWave  今日头条  Tags:Android   点击:(113)  评论:(0)  加入收藏
安卓手机上面有哪些好用的录音软件?
安卓手机上面有哪些好用的录音软件?在日常的生活中,很少需要通过录音记录,在录音时,尽量选择一个安静的环境进行录音,并将手机放在靠近声源的位置,以获得更好的录音效果。录制人声...【详细内容】
2023-12-29  美食得爱好者    Tags:录音软件   点击:(74)  评论:(0)  加入收藏
安卓手机的照片怎么传到苹果手机?试试这3个方法!
原本一直使用安卓手机,但今天新买了一部苹果手机,需要将安卓手机中的照片全部转移到新的苹果手机里,不过她对该如何操作感到困惑。购置新手机是一件令人兴奋的事情,而将旧手机的...【详细内容】
2023-12-29  艾尚去旅行    Tags:安卓手机   点击:(48)  评论:(0)  加入收藏
搞定流畅性过后,安卓旗舰手机游戏体验还要什么?
手机游戏可以改善体验的地方数不胜数,在骁龙移动平台原生支持的“超分、超帧”等技术支持下,未来手机必将以更低的成本,呈现出更出色的游戏体验。曾几何时,手机性能的展示被局限...【详细内容】
2023-12-20    PChome  Tags:安卓   点击:(47)  评论:(0)  加入收藏
我的手机我做主,如何为Android手机应用换图标?
作为一名Android用户,你是否曾经为自己的手机桌面感到单调而乏味?虽然Android系统的桌面定制性已经非常强大,但有时候我们还是希望能够在细节上做出一些改变,尤其是对于那些每天...【详细内容】
2023-12-10  王炸无人机飞手    Tags:Android   点击:(61)  评论:(0)  加入收藏
安卓手机低电量模式有什么影响,性能与续航的权衡
在现代社会,手机已经成为我们日常生活中不可或缺的一部分。然而,随着手机功能的不断增加,电池的续航时间逐渐成为一个令人关注的问题。为了解决这一问题,安卓手机提供了一种称为...【详细内容】
2023-11-11  PC小教程    Tags:安卓手机   点击:(109)  评论:(0)  加入收藏
谷歌安卓 14 减少后台活动,可提高性能、延长续航
IT之家 10 月 25 日消息,在最新一期 #TheAndroidShow 活动,谷歌的安卓工程副总裁 Dave Burke 表示,安卓 14 系统更改了处理器和内存的工作负载平衡机制,不仅可以提升设备性能,而...【详细内容】
2023-10-25    IT之家  Tags:安卓   点击:(111)  评论:(0)  加入收藏
站内最新
站内热门
站内头条