ART与DVM

作者: 梧叶已秋声 | 来源:发表于2020-05-27 11:50 被阅读0次

ART : Android RunTime
Run Time通常翻译为运行时,Android Run Time即为Android 运行时,这是个很别扭的翻译,不太容易理解。
先来看看百科上Run Time的解释。

出处:运行期
运行时期(Run time)在计算机科学中代表一个计算机程序从开始运行到终止运行的运作、运行的时期。与运行时期相对的其他时期包括:设计时期(design time)、编译时期(compile time)、链接时期(link time)、与加载时期(load time)。

简而言之就是程序从开始运行到结束运行的那个时期(例如从16:00我打开了一个软件,然后到了16:10我关闭了这个软件,这个时间段就是软件的run time)。
然后再来看Android Run Time

出处:Android Runtime (ART) and Dalvik
Android runtime (ART) is the managed runtime used by applications and some system services on Android.

这句话读起来不太顺,一开始我没找到宾语。让我想起来被英语语法支配的恐惧。
其实这句话是定语从句省略了which is。
This is the book (which is) written by Lu Xun. 这是鲁迅写的书。

所以应该翻译为Android RunTime(ART)是个通过 applications和一些Android 系统 services 管理的 Runtime 。
用我更容易接受的说法就是当Android程序运行的时候, 通过applications和一些Android 系统 services去管理。这句话表示了Android 程序的运行时候 通过什么去管理。
因此ART我觉得还是应该理解为Android程序运行时期。

出处:Android Runtime (ART) and Dalvik
ART 及其前身 Dalvik 最初是专为 Android 项目打造的。
作为运行时的 ART 执行 Dalvik 可执行文件格式并遵循 Dex 字节码规范。ART 和 Dalvik 是运行 Dex 字节码的兼容运行时,因此针对 Dalvik 开发的应用也能在 ART 环境中运作。

这段非常拗口,简化一下。可以把一些成分去掉,例如这里先把修饰ART 的语句去掉。
ART 执行 Dalvik 可执行文件格式 并遵循 Dex 字节码规范。
这句话表达了2个意思:
1.Android 程序运行时期,执行的是Dalvik 可执行文件格式。
2.Android程序运行时期,遵循Dex字节码规范。
那么这里需要理解Dalvik 可执行文件格式Dex字节码规范才能理解这句话。
在这之前,首先要了解DVM(Dalvik虚拟机)以及JVM(Java虚拟机)。

Dalvik虚拟机,是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为.dex(即“Dalvik Executable”)格式的Java应用程序的运行。.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik由Dan Bornstein编写的,名字来源于他的祖先曾经居住过的小渔村达尔维克(Dalvík),位于冰岛埃亚峡湾。
大多数虚拟机包括JVM都是一种堆栈机器,而Dalvik虚拟机则是寄存器机。两种架构各有优劣,一般而言,基于堆栈的机器需要更多指令,而基于寄存器的机器指令更长。
从Android 5.0版起,Android Runtime(ART)取代Dalvik成为系统内默认虚拟机。

Java虚拟机(英语:Java Virtual Machine,缩写为JVM),一种能够运行Java bytecode的虚拟机,以堆栈结构机器来进行实做。最早由太阳微系统所研发并实现第一个实现版本,是Java平台的一部分,能够运行以Java语言写作的软件程序。

JVM和DVM中执行.java文件过程对比如下所示。

https://www.jianshu.com/p/bdb6c29aca83
先来看看.java,.class以及.dex文件。
.java文件可以直接使用notepad去打开。
而byte code文件(.class和.dex)则需要使用插件才能看到,否则是乱码。插件使用方法如下:
class文件结构及查看 Notepad++的HEX-Editor插件
当使用Android studio新建一个工厂然后编译后,会在build目录下自动生成.class和.dex文件。
MainActivity.java
MainActivity.class
MainActivity.dex

.java转.class,.class转.dex就是对文件重新编码,使其符合字节码规范的一个过程。例如,现存在3种语言中文,英文,韩文。现需要翻译中文“花”,首先将其翻译为英文“flower”,再将英语翻译成韩语“꽃.”所谓规范,就是一个约定俗成的文档,翻译的规范就是字典。这只是简单的翻译,实际例如我需要翻译,如果直接翻译成中文有时候很容易出现语句不通的现象,通常就需要使用英语去转。

还有一点,无论是JVM还是DVM,都是将字节码翻译成机器码(二进制代码,由01组成),让计算机识别,然后执行。

对DVM有一定了解后,再回过头来对比一起看看ART。

扒一扒 Android 运行时: DVM vs ART
Dalvik 是一个基于 JIT(Just in time)编译的引擎。使用 Dalvik 存在一些缺点,所以从 Android 4.4(Kitkat)开始引入了 ART 作为运行时,从 Android 5.0(Lollipop)开始 ART 就全面取代了Dalvik。Android 7.0 向 ART 中添加了一个 just-in-time(JIT)编译器,这样就可以在应用运行时持续的提高其性能。
Just In Time (JIT)
使用 Dalvik JIT 编译器,每次应用在运行时,它实时的将一部分 Dalvik 字节码翻译成机器码。在程序的执行过程中,更多的代码被被编译并缓存。由于 JIT 只翻译一部分代码,它消耗的更少的内存,占用的更少的物理存储空间。
Ahead Of Time(AOT)
ART 内置了一个 Ahead-of-Time 编译器。在应用的安装期间,他就将 DEX 字节码翻译成机器码并存储在设备的存储器上。这个过程只在将应用安装到设备上时发生。由于不再需要 JIT 编译,代码的执行速度要快得多。
由于 ART 直接运行的是应用的机器码(native execution),它所占用的 CPU 资源要少于 使用 JIT 编译的 Dalvik。由于占用较少的 CPU 资源也就消耗更少的电池资源。

https://www.jianshu.com/p/bdb6c29aca83
ART 和 Dalvik 一样使用的是相同的 DEX 字节码。编译好的应用如果使用 ART 在安装时需要额外的时间用于编译,同时还需要更多的空间用于存储编译后的代码。
ART 的优点
应用运行更快,因为 DEX 字节码的翻译在应用安装是就已经完成。
减少应用的启动时间,因为直接执行的是 native 代码。
提高设备的续航能力,因为节约了用于一行一行解释字节码所需要的电池。
改善的垃圾回收器
改善的开发者工具
ART 的缺点
应用安装需要更长的时间,因为 DEX 字节码需要在安装时就翻译成机器码。
由于在安装时时生成的 native 机器码是存储在内部存储器上,所以需要更多的内部存储空间。

JIT 编译器概述
Just-In-Time (JIT) 编译器是 Java Runtime Environment 的一个组件,用于提高运行时的 Java 应用程序的性能。

android在2.2-4.4以及7.0以后的版本中使用了JIT编译器。中间由于引入ART,删除了JIT部分,后续重新引入。

从Android系统源码中AndroidRuntime中可以看到,启动了虚拟机。
出处:Android系统启动分析(二)

//frameworks/base/core/jni/AndroidRuntime.cpp
void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)
{
    ……
    //获取根目录
    const char* rootDir = getenv("ANDROID_ROOT");
    if (rootDir == NULL) {
        rootDir = "/system";
        if (!hasDir("/system")) {
            LOG_FATAL("No root directory specified, and /android does not exist.");
            return;
        }
        setenv("ANDROID_ROOT", rootDir, 1);
    }

    //注释1:创建虚拟机
    JniInvocation jni_invocation;
    jni_invocation.Init(NULL);
    JNIEnv* env;
    if (startVm(&mJavaVM, &env, zygote) != 0) {
        return;
    }
    //回调AppRuntime的onVmCreate函数
    onVmCreated(env);

    //注释2:注册JNI函数
    if (startReg(env) < 0) {
        ALOGE("Unable to register all android natives\n");
        return;
    }
    ……
    
    //注释3:将classname的"."替换为"/"
    //如: "com.android.internal.os.ZygoteInit"替换为"com/android/internal/os/ZygoteInit"
    char* slashClassName = toSlashClassName(className != NULL ? className : "");
    //根据路径找到class文件
    jclass startClass = env->FindClass(slashClassName);
    if (startClass == NULL) {
        ……
    } else {
        //注释4:通过反射找到ZygoteInit.main()函数
        jmethodID startMeth = env->GetStaticMethodID(startClass, "main",
            "([Ljava/lang/String;)V");
        if (startMeth == NULL) {
           ……
        } else {
            //注释5:调用ZygoteInit.main()函数
            env->CallStaticVoidMethod(startClass, startMeth, strArray);
        }
    }
    free(slashClassName);
    if (mJavaVM->DetachCurrentThread() != JNI_OK)
        ALOGW("Warning: unable to detach main thread\n");
    if (mJavaVM->DestroyJavaVM() != 0)
        ALOGW("Warning: VM did not shut down cleanly\n");
}

DVM是虚拟机,但ART并不是,ART从字面上的意思来说只是表示程序运行的时间段,源码中系统启动部分AndroidRuntime中的代码,这里是调用了startVm去启动虚拟机的,还是用到了虚拟机的。感觉上AndroidRuntime更像是对DVM做了一层封装,使程序在安装以及运行过程中翻译成机器码并存储在Android设备上,从而使程序运行更快,而仅仅使用DVM的情况下是每次启动程序的时候再将dex字节码翻译成机器码,然后再去执行。

代替这个词的使用场景我首先想到的是例如今天中午想吃苹果,不想吃梨子,用苹果代替梨子,苹果和梨子可以分为同一类物品——水果,但是你选择了不同的水果。但是现在就像是你把梨子炖了下或者微波叮了下,然后再吃掉梨子,这种情景下也可以用代替这个词语,但是关键是名称是xx梨子。总而言之,还是ART这个名字起得与虚拟机关联度太低导致我查看ART相关概念的时候非常绕。

参考链接:
运行期
Android Runtime (ART) 和 Dalvik
运行时(runtime)是什么意思?应该怎样深入且直观地理解?
扒一扒 Android 运行时: DVM vs ART
Android系统启动分析(二)
浅谈 Android Dex 文件
JVM与DVM的关系
Java虚拟机
Dalvik虚拟机
class文件结构及查看 Notepad++的HEX-Editor插件
说一说Android的Dalvik,ART与JIT,AOT

相关文章

  • ART与DVM

    ART : Android RunTime。Run Time通常翻译为运行时,Android Run Time即为...

  • JVM DVM ART

    一.Java -> JVM JAVA为每一个平台开发一个 JVM,即 Java 虚拟机。Java 编译器将 .ja...

  • JVM、DVM、ART

    一、JVM、JRE、JDK JVM:Java Virtual Machine。java虚拟机是一个翻译器,把Cla...

  • JVM DVM ART介绍与区别

    JVM DVM ART java中内存: 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控...

  • Android类加载(一)——DVM、ART、Dexopt、De

    Android类加载(一)——DVM、ART、Dexopt、DexAot名词解析Android类加载(二)——双亲...

  • Android类加载(二)——双亲委托机制

    Android类加载(一)——DVM、ART、Dexopt、DexAot名词解析Android类加载(二)——双亲...

  • Android类加载(三)——源码解读

    Android类加载(一)——DVM、ART、Dexopt、DexAot名词解析Android类加载(二)——双亲...

  • DVM, ART, Dalvik, JVM

    转载自:https://www.jianshu.com/p/923aebd31b65https://www.jia...

  • 虚拟机

    前言 本篇文章将会介绍Java虚拟机(JVM)的结构等基础知识、Dalvik(DVM)/ART虚拟机与JVM的比较...

  • 虚拟机概述

    前言 本篇文章将会介绍Java虚拟机(JVM)的结构等基础知识、Dalvik(DVM)/ART虚拟机与JVM的比较...

网友评论

      本文标题:ART与DVM

      本文链接:https://www.haomeiwen.com/subject/pakvahtx.html