2019-08-13 10:48:41 u011733020 阅读数 84

Android Runtime (ART) 是 Android 上的应用和部分系统服务使用的托管式运行时。ART 及其前身 Dalvik 最初是专为 Android 项目打造的。作为运行时的 ART 可执行 Dalvik 可执行文件并遵循 Dex 字节码规范。

ART 和 Dalvik 是运行 Dex 字节码的兼容运行时,因此针对 Dalvik 开发的应用也能在 ART 环境中运作。不过,Dalvik 采用的一些技术并不适用于 ART。有关最重要问题的信息,请参阅在 Android Runtime (ART) 上验证应用行为。

ART 功能

以下是 ART 实现的一些主要功能。

预先 (AOT) 编译

ART 引入了预先编译机制,可提高应用的性能。ART 还具有比 Dalvik 更严格的安装时验证。

在安装时,ART 使用设备自带的 dex2oat 工具来编译应用。该实用工具接受 DEX 文件作为输入,并为目标设备生成经过编译的应用可执行文件。该工具应能够顺利编译所有有效的 DEX 文件。但是,一些后处理工具会生成无效文件,Dalvik 可以接受这些文件,但 ART 无法编译这些文件。有关详情,请参阅解决垃圾回收问题。

垃圾回收方面的优化

垃圾回收 (GC) 可能有损于应用性能,从而导致显示不稳定、界面响应速度缓慢以及其他问题。ART 通过以下几种方式对垃圾回收做了优化:

  • 只有一次(而非两次)GC 暂停
  • 在 GC 保持暂停状态期间并行处理
  • 在清理最近分配的短时对象这种特殊情况中,回收器的总 GC 时间更短
  • 优化了垃圾回收的工效,能够更加及时地进行并行垃圾回收,这使得 GC_FOR_ALLOC 事件在典型用例中极为罕见
  • 压缩 GC 以减少后台内存使用和碎片

开发和调试方面的优化

ART 提供了大量功能来优化应用开发和调试。

支持采样分析器

一直以来,开发者都使用 Traceview 工具(用于跟踪应用执行情况)作为分析器。虽然 Traceview 可提供有用的信息,但每次方法调用产生的开销会导致 Dalvik 分析结果出现偏差,而且使用该工具明显会影响运行时性能。

ART 添加了对没有这些限制的专用采样分析器的支持,因而可更准确地了解应用执行情况,而不会明显减慢速度。KitKat 版本为 Dalvik 的 Traceview 添加了采样支持。

支持更多调试功能

ART 支持许多新的调试选项,特别是与监控和垃圾回收相关的功能。例如,您可以:

  • 查看堆栈跟踪中保留了哪些锁,然后跳转到持有锁的线程。

  • 询问指定类的当前活动的实例数、请求查看实例,以及查看使对象保持有效状态的参考。

  • 过滤特定实例的事件(如断点)。

  • 查看方法退出(使用“method-exit”事件)时返回的值。

  • 设置字段观察点,以在访问和/或修改特定字段时暂停程序执行。

优化了异常和崩溃报告中的诊断详细信息

当发生运行时异常时,ART 会为您提供尽可能多的上下文和详细信息。ART 会提供 java.lang.ClassCastException、java.lang.ClassNotFoundException 和 java.lang.NullPointerException 的更多异常详细信息(较高版本的 Dalvik 会提供 java.lang. ArrayIndexOutOfBoundsExceptionjava.lang.ArrayStoreException 的更多异常详细信息,这些信息现在包括数组大小和越界偏移量;ART 也提供这类信息)。

例如,java.lang.NullPointerException 现在会显示有关应用尝试处理 null 指针时所执行操作的信息,例如应用尝试写入的字段或尝试调用的方法。一些典型示例如下:

java.lang.NullPointerException: Attempt to write to field 'int
android.accessibilityservice.AccessibilityServiceInfo.flags' on a null object
reference
java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.String java.lang.Object.toString()' on a null object reference

ART 还通过纳入 Java 和原生堆栈信息,在应用原生代码崩溃报告中提供更实用的上下文信息。

Dalvik虚拟机

Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的Java应用程序的运行。dex格式是专门为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Google对其进行了特定的优化,使得Dalvik具有高效、简洁、节省资源的特点。从Android系统架构图知,Dalvik虚拟机运行在Android的运行时库层。

Dalvik作为面向Linux、为嵌入式操作系统设计的虚拟机,主要负责完成对象生命周期管理、堆栈管理、线程管理、安全和异常管理,以及垃圾回收等。另外,Dalvik早期并没有JIT编译器,直到Android2.2才加入了对JIT的技术支持。

Dalvik虚拟机的特点

  • 体积小,占用内存空间小;
  • 专有的DEX可执行文件格式,体积更小,执行速度更快;
  • 常量池采用32位索引值,寻址类方法名,字段名,常量更快;
  • 基于寄存器架构,并拥有一套完整的指令系统;
  • 提供了对象生命周期管理,堆栈管理,线程管理,安全和异常管理以及垃圾回收等重要功能;
  • 所有的Android程序都运行在Android系统进程里,每个进程对应着一个Dalvik虚拟机实例。

Dalvik虚拟机和Java虚拟机的区别

Dalvik虚拟机与传统的Java虚拟机有着许多不同点,两者并不兼容,它们显著的不同点主要表现在以下几个方面:

Java虚拟机运行的是Java字节码,Dalvik虚拟机运行的是Dalvik字节码。
传统的Java程序经过编译,生成Java字节码保存在class文件中,Java虚拟机通过解码class文件中的内容来运行程序。而Dalvik虚拟机运行的是Dalvik字节码,所有的Dalvik字节码由Java字节码转换而来,并被打包到一个DEX(Dalvik Executable)可执行文件中。Dalvik虚拟机通过解释DEX文件来执行这些字节码。

Dalvik可执行文件体积小。Android SDK中有一个叫dx的工具负责将Java字节码转换为Dalvik字节码。

Android APK 编译打包流程

在这里插入图片描述
1.Java编译器对工程本身的java代码进行编译,这些java代码有三个来源:app的源代码,由资源文件生成的R文件(aapt工具),以及有aidl文件生成的java接口文件(aidl工具)。产出为.class文件。

①.用AAPT编译R.java文件
②编译AIDL的java文件
③把java文件编译成class文件

2…class文件和依赖的三方库文件通过dex工具生成Delvik虚拟机可执行的.dex文件,包含了所有的class信息,包括项目自身的class和依赖的class。产出为.dex文件。

3.apkbuilder工具将.dex文件和编译后的资源文件生成未经签名对齐的apk文件。这里编译后的资源文件包括两部分,一是由aapt编译产生的编译后的资源文件,二是依赖的三方库里的资源文件。产出为未经签名的.apk文件。

4.分别由Jarsigner和zipalign对apk文件进行签名和对齐,生成最终的apk文件。

总结为:编译–>DEX–>打包–>签名和对齐

ART虚拟机与Dalvik虚拟机的区别

ART代表Android Runtime,其处理应用程序执行的方式完全不同于Dalvik,Dalvik是依靠一个Just-In-Time (JIT)编译器去解释字节码。开发者编译后的应用代码需要通过一个解释器在用户的设备上运行,这一机制并不高效,但让应用能更容易在不同硬件和架构上运 行。ART则完全改变了这套做法,在应用安装时就预编译字节码到机器语言,这一机制叫Ahead-Of-Time (AOT)编译。在移除解释代码这一过程后,应用程序执行将更有效率,启动更快。

ART优点:
1、系统性能的显著提升。
2、应用启动更快、运行更快、体验更流畅、触感反馈更及时。
3、更长的电池续航能力。
4、支持更低的硬件。

ART缺点:
1、更大的存储空间占用,可能会增加10%-20%。
2、更长的应用安装时间。

ART虚拟机相对于Dalvik虚拟机的提升

预编译

在dalvik中,如同其他大多数JVM一样,都采用的是JIT来做及时翻译(动态翻译),将dex或odex中并排的dalvik code(或者叫smali指令集)运行态翻译成native code去执行.JIT的引入使得dalvik提升了3~6倍的性能。

而在ART中,完全抛弃了dalvik的JIT,使用了AOT直接在安装时将其完全翻译成native code.这一技术的引入,使得虚拟机执行指令的速度又一重大提升

垃圾回收方面的优化

垃圾回收 (GC) 可能有损于应用性能,从而导致显示不稳定、界面响应速度缓慢以及其他问题。ART 通过以下几种方式对垃圾回收做了优化:

  • 只有一次(而非两次)GC 暂停
  • 在 GC 保持暂停状态期间并行处理
  • 在清理最近分配的短时对象这种特殊情况中,回收器的总 GC 时间更短
  • 优化了垃圾回收的工效,能够更加及时地进行并行垃圾回收,这使得 GC_FOR_ALLOC 事件在典型用例中极为罕见
  • 压缩 GC 以减少后台内存使用和碎片
2017-07-21 17:14:56 xiaocheng2290 阅读数 234

转载请注明出处:https://www.niwoxuexi.com/blog/android/article/201.html

2014年6月谷歌I/O大会,Android L 改动幅度较大,Google将直接放弃Dalvik虚拟机,代替它的是传闻已久的ART(Android Runtime)。什么是ART?,google为什么弃用Dalvik虚拟机?要想回答这些问题,还需要先了解什么是虚拟机、什么是JVM(java 虚拟机)的概念。

一、什么是虚拟机?

官方语言:虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。

解释:用软件模拟出来的一个计算机系统。这些虚拟机完全就像真正的计算机那样进行工作,例如你可以安装操作系统、安装应用程序、访问网络资源等等

虚拟机分两种:系统虚拟机和进程虚拟机

1,系统虚拟机

解释:提供一个系统的仿真和抽象

平时用的VM Ware,或者VirtualBox 等属于系统虚拟机。能够仿真出一个机器。可在上面跑ubuntu,小红帽的系统

2,进程虚拟机

解释:只提供一个进程的仿真和抽象

我们下面讲得Dalvik,和JVM都是进程虚拟机

例如:Dalvik, JVM(java Virtual Machine),Microsoft.NET

二、什么是JVM(Java虚拟机)

官方语言:JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

解释:其实就是上面讲到的进程虚拟机

我们下看一下jvm的工作流程

java代码用javac编译成bytecode文件,通过虚拟机可以编译成各种平台的汇编语言

所以:虚拟机的好处,write once,compile once,run everywhere

三、什么是Dalvik

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

解释:Dalvik是Google专门为Android平台定制的虚拟机。主要是对内存,CPU,电源等模块进行了优化

四、最好解释 ART(Android Runtime)

ART 的机制与 Dalvik 不同。在Dalvik下,应用每次运行的时候,字节码都需要通过即时编译器转换为机器码,这会拖慢应用的运行效率,而在ART 环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。这个过程叫做预编译(AOT,Ahead-Of-Time)。这样的话,应用的启动(首次)和执行都会变得更加快速

解释:ART完全改变了这种做法,在应用安装时就预编译字节码到机器语言,在移除解释代码这一过程后,应用程序执行将更有效率,启动更快。

Dalvik是Google公司自己设计用于Android平台的虚拟机。Dalvik经过优化,使其更适合android平台。具体优点会在下面和JVM进行比较时说明。


四、ART和Dalvik相比优缺点

优点:

1、系统性能的显著提升。

2、应用启动更快、运行更快、体验更流畅、触感反馈更及时。

3、更长的电池续航能力。

4、支持更低的硬件。

缺点:

1.机器码占用的存储空间更大,字节码变为机器码之后,可能会增加10%-20%(不过在应用包中,可执行的代码常常只是一部分。比如最新的 Google+ APK 是 28.3 MB,但是代码只有 6.9 MB。)

2.应用的安装时间会变长。著作权归作者所有。

总的来说,ART 的优点还是远远超越其缺点的。毕竟,影响用户体验的要素中,电池续航和应用顺畅运行更为重要。在于2014 年 10 月 15 日发布的全新 Android 操作系统Android 5.0上,Dalvik彻底被ART取代了!

2013-11-14 13:58:23 netwalk 阅读数 3474
跟核心虚拟机Dalvik说再见 Android Runtime(ART)登场 
转自:http://www.apkbus.com/portal.php?mod=view&aid=6060 

Dalvik是Android的核心组成部分之一,Android上的应用程序需要依靠它才可以正常运行。现在Google准备用新的运行环境ART来替代它。在最新的Android4.4上,有两个运行环境供开发者选择——默认的Dalvik和测试中的ART。
       在以前的Android系统上,所有的应用程序都是运行在Dalvik中。应用程序每次运行时其中一部分代码都要需要机器重新编译。这个过程即消耗时间又要消耗系统资源,所以执行效率难免会降低。但其优点在于这种机制可以让各种各样的应用程序运行在多种硬件架构上。相比Dalvik,ART的处理机制完全不同,它会在应用程序安装时就把程序代码转换成机器语言,让程序成为真正的本地应用。这样做的好处是程序的启动时间被极大的提高,运行速度也会更快。电量消耗的更少,系统行也跟着更加流畅。
       对于想尝鲜的Nexus5用户可以到设置的开发者选项里选择ART选项,确认之后机器会重启,根据手机内安装的应用程序数量不同,第一次开机消耗的时间也不相同。
       由于ART还处于测试阶段,所以目前还很难精确地度量出其为Android设备提升的效率。但是一些基准测试表明它将大多数应用程序的执行时间削减了一半左右。这就意味着那些需要大量处理器性能和长时间运行的任务会被更快地执行完毕,系统也会更多地停留在闲置状态。电量损耗会减少,流畅度也自然会提升。
       当然ART带来一些优点的同时,也会带来一些缺点。
       其一,由于ART需要应用程序在安装时就把程序代码转换成机器语言,所以这会消耗掉更多的存储空间,但消耗掉空间的增幅通常不会超过应用代码包大小的20%。
       其二,由于有了一个转码的过程,所以应用安装时间难免会延长。拿最新的Google+应用为例,其apk格式的安装包大小为28.3MB,但其代码仅为6.9MB,所以多消耗掉的存储空间并不惊人。至于第二个缺点那就只能等待了。
      事实上,ART项目在Google内部已经进行了2年左右的时间。回溯一下,当时差不多就是Google和甲骨文因为Java专利官司闹得不可开交的那段时期。虽然到今天我们很难判断发起ART项目的初衷是哪一个,但既然它能提升Android设备的性能,我们为什么不欢迎呢?
2017-06-11 18:13:17 lixpjita39 阅读数 1154

Dalvik虚拟机和ART的区别

  零零星星的看了一些关于Dalvik虚拟机和ART虚拟机的介绍,今天来总结下,以防忘记:

一. Dalvik虚拟机

  1. Dalvik的历史

  Dalvik虚拟机,是由Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它由Dan Bornstein编写,名字来源于他的祖先曾居住过的小渔村达尔维克(Dalvík),位于冰岛Eyjafjörður。Dalvik可以支持转换为.dex(全称:Dalvik Executable)格式的Java应用程序的运行。.dex格式是专门为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。

  2.进化

  Dalvik经过优化后,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行,独立的进程可以防止在虚拟机崩溃的时候所以程序都被关闭。每个应用都是作为独自的虚拟机运行,与其他应用不牵扯。

  3.其他

  • Dalvik虚拟机中的寄存器都是32位的,64位类型的数据则用两个相邻的寄存器表示,也就是对于double这种64位类型的数据,需要用到两个32位寄存器来存储.
  • Dalvik最多支持65536个寄存器(编号从0~65535)。

ART(Android Runtime)

  1. ART的历史

  Android Runtime(缩写为 ART),是一种在Android操作系统上的运行环境,由Google公司研发,并在2013年作为Android 4.4系统中的一项测试功能正式对外发布,在Android 5.0及后续Android版本中作为正式的运行时库取代了以往的Dalvik虚拟机。ART能够把应用程序的字节码转换为机器码,是Android所使用的一种新的虚拟机。
  Google公司在Android 4.4中带来的ART模式仅仅是ART的一个预览版,系统默认仍然使用的是Dalvik虚拟机,4.4上面提供的预览版ART相对于Android 5.0以后的ART运行时库有较大的不同,尤其体现在兼容性上。

Dalvik和ART区别

1.平台支持区别

  Dalvik:Android 4.4及其以下系统使用。
  ART:Android 4.4以上系统使用。

2.工作原理区别

  Dalvki采用JIT(Just In Time)技术。
  ART采用AOT技术。

什么是JIT?


  JIT是”Just In Time Compiler”的缩写,就是”即时编译技术”,与Dalvik虚拟机相关。

怎么理解这句话呢?这要从Android的一些特性说起。

JIT是在2.2版本提出的,目的是为了提高Android的运行速度,一直存活到4.4版本,因为在4.4之后的ROM中,就不存在Dalvik虚拟机了。

我们使用Java开发android,在编译打包APK文件时,会经过以下流程
Java编译器将应用中所有Java文件编译为class文件
dx工具将应用编译输出的类文件转换为Dalvik字节码,即dex文件

之后经过签名、对齐等操作变为APK文件。

Dalvik虚拟机可以看做是一个Java VM,他负责解释dex文件为机器码,如果我们不做处理的话,每次执行代码,都需要Dalvik将dex代码翻译为微处理器指令,然后交给系统处理,这样效率不高。

为了解决这个问题,Google在2.2版本添加了JIT编译器,当App运行时,每当遇到一个新类,JIT编译器就会对这个类进行编译,经过编译后的代码,会被优化成相当精简的原生型指令码(即native code),这样在下次执行到相同逻辑的时候,速度就会更快。

当然使用JIT也不一定加快执行速度,如果大部分代码的执行次数很少,那么编译花费的时间不一定少于执行dex的时间。Google当然也知道这一点,所以JIT不对所有dex代码进行编译,而是只编译执行次数较多的dex为本地机器码。

有一点需要注意,那就是dex字节码翻译成本地机器码是发生在应用程序的运行过程中的,并且应用程序每一次重新运行的时候,都要做重做这个翻译工作,所以这个工作并不是一劳永逸,每次重新打开App,都需要JIT编译。


什么是AOT


  AOT是”Ahead Of Time”的缩写,指的就是ART(Anroid RunTime)这种运行方式。

前面介绍过,JIT是运行时编译,这样可以对执行次数频繁的dex代码进行编译和优化,减少以后使用时的翻译时间,虽然可以加快Dalvik运行速度,但是还是有弊病,那就是将dex翻译为本地机器码也要占用时间,所以Google在4.4之后推出了ART,用来替换Dalvik。

在4.4版本上,两种运行时环境共存,可以相互切换,但是在5.0+,Dalvik虚拟机则被彻底的丢弃,全部采用ART。

ART的策略与Dalvik不同,在ART 环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。之后打开App的时候,不需要额外的翻译工作,直接使用本地机器码运行,因此运行速度提高。

当然ART与Dalvik相比,还是有缺点的。
ART需要应用程序在安装时,就把程序代码转换成机器语言,所以这会消耗掉更多的存储空间,但消耗掉空间的增幅通常不会超过应用代码包大小的20%
由于有了一个转码的过程,所以应用安装时间难免会延长


这里写图片描述

引用网上对Dalvik和ART通俗的总结就是:Dalvik模式像是一台折叠自行车,每次骑之前都要组装后才能上路。而ART模式就是一个已经装好的自行车,直接就能上车走人。所以ART模式在效率上肯定是要好于Dalvik。

2019-05-06 16:02:18 chehec2010 阅读数 48
  • 问:Android系统至今有多少种Java虚拟机?分别有什么特点?

    答:两种,Dalvik和Android Runtime。执行的文件是.dex文件和Java字节码文件。Android 4.4开始是使用Android Runtime虚拟机。

  • 问:描述一下Android的apk包生成的过程。

    答:略

  • 问:使用WebView的时候要注意哪些问题?如何处理WebView造成的内存泄露问题?

  • 问:极光推送能否在应用不运行的情况下收到推送?OneSignal能否在应用不运行的情况下收到推送?为什么?

  • 问:简要描述你上一份工作处理页面过度绘制问题的方法。

  • 问:简要说一下你上一个负责的APP线上有哪些异常,说一下出现次数最多的是哪些?是什么原因导致一直没法完全避免的。

  • 问:了解持续集成吗?说一下Jenkins配置自动打包和代码检测的一些步骤。

  • 问:描述Glide图片加载框架的原理。如果让你去设计一个图片加载框架,会从哪些方面去设计?

  • 问:描述一下Android系统把布局的xml文件渲染成界面视图的过程。

  • 问:有哪些语种是需要做RTL适配的?

    答:阿语和希伯来语。

  • 问:如果有段文案,里面混杂了阿语和英文,还有数字,直接放到TextView里是否合适?要怎么处理?

  • 问:描述一下图片压缩的原理。等比压缩和像素压缩分别怎么实现的?

  • 问:Kotlin语言是如何避免空指针异常的?

 

dalvik和Jvm的区别

阅读数 616

没有更多推荐了,返回首页