精华内容
参与话题
问答
  • ART虚拟机

    2019-10-10 10:14:26
    一、ART虚拟机的启动过程 Android系统通过将ART运行时抽象成一个Java虚拟机,以及通过系统属性persist.sys.dalvik.vm.lib和一个适配层JniInvocation,就可以无缝地将Dalvik虚拟机替换为ART运行时。这个替换过程设计...

    一、ART虚拟机的启动过程
    Android系统通过将ART运行时抽象成一个Java虚拟机,以及通过系统属性persist.sys.dalvik.vm.lib和一个适配层JniInvocation,就可以无缝地将Dalvik虚拟机替换为ART运行时。这个替换过程设计非常巧妙,因为涉及到的代码修改是非常少的。

    frameworks/base/core/jni/AndroidRuntime.cpp
    JniInvocation类的成员函数init实际上就是根据系统属性persist.sys.dalvik.vm.lib来初始化Dalvik虚拟机或者ART虚拟机环境。
    JniInvocation
        persist.sys.dalvik.vm.lib    //libdvm.so  libart.so
        抽象Java虚拟机的三个接口
        JniInvocation:
            JNI_GetDefaultJavaVMInitArgs_: JNI_GetDefaultJavaVMInitArgs
            JNI_CreateJavaVM_: JNI_CreateJavaVM
            JNI_GetCreatedJavaVMs_: JNI_GetCreatedJavaVMs

            
    JavaVM
    JNIEnv

    startVm --> JNI_CreateJavaVM_
        创建一个JavaVM接口及其对应的JNIEnv接口
        
    二、应用程序在安装过程中将dex字节码翻译为本地机器码的过程
    frameworks/base/services/core/java/com/android/server/pm/Installer.java
    frameworks/base/core/java/com/android/internal/os/InstallerConnection.java
        通过socket向守护进程installd发送一个dexopt请求,这个请求是由installd里面的函数dexopt来处理的
    frameworks/native/cmds/installd/commands.cpp
        run_patchoat调用的是”/system/bin/patchoat”;将dex文件优化成odex文件
        而run_dex2oat调用的是”/system/bin/dex2oat”,将dex字节码翻译成本地机器码,生成oat文件。

    统一是以.odex后缀结束,保存在/data/dalvik-cache下:
    /data/dalvik-cache/arm64/system@framework@boot.art
                            /system@framework@boot.oat
                            
    在ART中,打包在APK里面的Dex字节码是通过LLVM翻译成本地机器指令的
        source code --> frontend --> optimizer --> backend --> machine code                        
                            

    ART翻译classes.dex后得到的ELF格式的oat文件:
        oatdata:储存原来打包在APK里面的dex文件,还有找到机器指令的信息
        oatexec:翻译这个dex文件里面的类方法得到本地机器指令
        
    三、CallStaticVoidMethod使得它以指定的类方法为入口正式进入运行状态
    实质上就是要对dex文件进行解析,以获得相关的信息。这与Dalvik虚拟机在dex文件中查找类和方法信息的过程是一样的
        Runtime::Create   //创建一个ART虚拟机
        Runtimee->Start() //启动该ART虚拟机
        Runtime->Init     //对该新创建的ART虚拟机进行初始化
            new gc::Heap  //创建好ART虚拟机堆后
            new JavaVMExt //通过该JavaVMExt实例来和ART虚拟机交互
            ClassLinker   //加载加载Java类时要用到的 加载类以及链接类方法
            
    art/runtime/gc/space/image_space.cc
    如果没有指定Image文件,那么将system分区预先准备好的framework/boot.art文件作为Image文件来启动ART虚拟机
    /data/dalvik-cache/system@framework@boot.art@classes.dex
    这些需要预加载的类由/system/framework/framework.jar文件里面的preloaded-classes文件指定

    在OAT文件中查找类方法的本地机器指令的过程:
        首先是根据类签名信息从包含在OAT文件里面的DEX文件中查找目标Class的编号,然后再根据这个编号找到在OAT文件中找到对应的OatClass。接下来再根据方法签名从包含在OAT文件里面的DEX文件中查找目标方法的编号,然后再根据这个编号在前面找到的OatClass中找到对应的OatMethod。有了这个OatMethod之后,我们就根据它的成员变量begin_和code_offset_找到目标类方法的本地机器指令了。其中,从DEX文件中根据签名找到类和方法的编号要求对DEX文件进行解析,这就需要利用Dalvik虚拟机的知识了


    四、JNI接口FindClass和GetStaticMethodID的实现,以便理解ART运行时是如何查找到指定的类和方法的
    JNIEnvExt类的构造函数将父类JNIEnv的成员变量functions初始化为全局变量gJniNativeInterface。也就是说,JNI函数表实际是由全局变量gJniNativeInterface来描述的。
    const JNINativeInterface gJniNativeInterface = {
      JNI::GetVersion,
      JNI::FindClass,
      JNI::GetStaticMethodID,
      JNI::CallStaticVoidMethod,
    }

    art/runtime/jni_internal.cc
        FindClass
    art/runtime/class_linker.cc    
            ClassLinker->FindSystemClass  //加载系统类
             system@framework@boot.art@classes.oat的OAT文件,这个OAT文件包含有多个DEX文件,所谓的系统启动类路径,其实就是一系列指定的由系统提供的DEX文件,这些DEX文件保存在ClassLinker类的成员变量boot_class_path_描述的一个向量中。
             
    ClassLinker类的成员函数LoadClass的实现,以便可以了解类的加载过程
    art/runtime/class_linker.cc
        这个Class对象关联有一系列的ArtField对象和ArtMethod对象    

    art/runtime/jni_internal.cc
        GetStaticMethodID
            FindMethodID
            
            
    五、JNI接口CallStaticVoidMethod来执行指定类方法的本地机器指令的
    art/runtime/jni_internal.cc
            CallStaticVoidMethod
                InvokeWithArgArray
                    ArtMethod->Invoke //调用参数method指定的类方法
                        GetEntryPointFromCompiledCode //被调用类方法的执行入口点 //进入解释器的,也有可能是用来进入到类方法的本地机器指令去
                        
                        

    展开全文
  • art虚拟机

    2020-08-20 15:58:35
    ART是在Android 4.0引入并在Android 5.0中设为默认解决方案的主要特性之一。ART取代了Dalvik,但是前者与后者仍然保持了字节码级的兼容。ART的主要特征之一就是安装时对应用的AOT编译。这种方式的主要优点就是优化 ...

    ART是在Android 4.0引入并在Android 5.0中设为默认解决方案的主要特性之一。ART取代了Dalvik,但是前者与后者仍然保持了字节码级的兼容。ART的主要特征之一就是安装时对应用的AOT编译。这种方式的主要优点就是优化 产生的本地代码性能更好,执行起来需要更少的电量。劣势在于安装文件所需的空间和时间。在Android 6.0中, 大的应用需要数分钟才能安装完。
    但是在Android N开发者预览版包含了一个混合模式的运行时。应用在安装时不做编译,而是解释字节码,所以可以快速启动。ART中代码在执行期间被分析,分析结果保存起来。然后,当设备空转和充电的时候,ART会执行针 对“热代码”进行编译,生成app image文件,并且在启动时一次性把它们加载到缓存。

    https://www.jianshu.com/p/036085db2b23

    展开全文
  • JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对比

    万次阅读 多人点赞 2015-12-31 11:43:14
    简单介绍JAVA虚拟机,安卓Dalvik虚拟机和ART虚拟机,并做简单对比。

    1、什么是JVM?

    JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才能够运行Java程序,JAVA在编译后会生成类似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是,C编译成的汇编语言会直接在硬件上跑,但JAVA编译后生成的字节码是在JVM上跑,需要由JVM把字节码翻译成机器指令,才能使JAVA程序跑起来。
    JVM运行在操作系统上,屏蔽了底层实现的差异,从而有了JAVA吹嘘的平台独立性和Write Once Run Anywhere。根据JVM规范实现的具体虚拟机有几十种,主流的JVM包括Hotspot、Jikes RVM等,都是用C/C++和汇编编写的,每个JRE编译的时候针对每个平台编译,因此下载JRE(JVM、Java核心类库和支持文件)的时候是分平台的,JVM的作用是把平台无关的.class里面的字节码翻译成平台相关的机器码,来实现跨平台。


    2、什么是DVM,和JVM有什么不同?

    JVM是Java Virtual Machine,而DVM就是Dalvik Virtual Machine,是安卓中使用的虚拟机,所有安卓程序都运行在安卓系统进程里,每个进程对应着一个Dalvik虚拟机实例。他们都提供了对象生命周期管理、堆栈管理、线程管理、安全和异常管理以及垃圾回收等重要功能,各自拥有一套完整的指令系统,以下简要对比两种虚拟机的不同。

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

    ②Dalvik可执行文件体积更小
    以下是JVM规范中以C的数据结构表达的class文件结构,class文件被虚拟机加载到内存中后便是这样

    class文件中包含多个不同的方法签名,如果A类文件引用B类文件中的方法,方法签名也会被复制到A类文件中(在虚拟机加载类的连接阶段将会使用该签名链接到B类的对应方法),也就是说,多个不同的类会同时包含相同的方法签名,同样地,大量的字符串常量在多个类文件中也被重复使用,这些冗余信息会直接增加文件的体积,而JVM在把描述类的数据从class文件加载到内存时,需要对数据进行校验、转换解析和初始化,最终才形成可以被虚拟机直接使用的JAVA类型,因为大量的冗余信息,会严重影响虚拟机解析文件的效率。
    为了减小执行文件的体积,安卓使用Dalvik虚拟机,SDK中有个dx工具负责将JAVA字节码转换为Dalvik字节码,dx工具对JAVA类文件重新排列,将所有JAVA类文件中的常量池分解,消除其中的冗余信息,重新组合形成一个常量池,所有的类文件共享同一个常量池,使得相同的字符串、常量在DEX文件中只出现一次,从而减小了文件的体积。
    dx工具的转换过程和DEX文件的结构如下图所示。


    ③JVM基于栈,DVM基于寄存器
    JAVA虚拟机基于栈结构,程序在运行时虚拟机需要频繁的从栈上读取写入数据,这个过程需要更多的指令分派与内存访问次数,会耗费很多CPU时间。
    Dalvik虚拟机基于寄存器架构,数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式要快很多。

    public class Hello {
        public int foo(int a, int b) {
            return (a + b) * (a - b);
        }
    
        public static void main(String[] args) {
            Hello t = new Hello();
            System.out.print(t.foo(5, 3));
        }
    }



    以这段代码中的foo方法为例,编译成class文件后,反编译class文件查看JAVA字节码:
    Code:
             0: iload_1
             1: iload_2
             2: iadd
             3: iload_1
             4: iload_2
             5: isub
             6: imul
             7: ireturn



    同样代码的foo方法,编译生成dex文件后,查看Dalvik字节码:
            
             0000: add-int  v0, v3, v4
             0002: sub-int  v1, v3, v4
             0004: mul-int/2addr  v0, v1
             0005: return  v0


    由以上字节码对比,代码指令减少了,执行速度当然也会更快。
    下图为两种虚拟机分别执行自己的字节码的过程对比。



    3、什么是ART虚拟机,和JVM/DVM有什么不同?

    首先了解JIT(Just In Time,即时编译技术)和AOT(Ahead Of Time,预编译技术)两种编译模式。

    JIT以JVM为例,javac把程序源码编译成JAVA字节码,JVM通过逐条解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译,执行速度必然比C/C++编译后的可执行二进制字节码程序慢,为了提高执行速度,就引入了JIT技术,JIT会在运行时分析应用程序的代码,识别哪些方法可以归类为热方法,这些方法会被JIT编译器编译成对应的汇编代码,然后存储到代码缓存中,以后调用这些方法时就不用解释执行了,可以直接使用代码缓存中已编译好的汇编代码。这能显著提升应用程序的执行效率。(安卓Dalvik虚拟机在2.2中增加了JIT)
    相对的AOT就是指C/C++这类语言,编译器在编译时直接将程序源码编译成目标机器码,运行时直接运行机器码。

    Dalvik虚拟机执行的是dex字节码,ART虚拟机执行的是本地机器码

    Dalvik执行的是dex字节码,依靠JIT编译器去解释执行,运行时动态地将执行频率很高的dex字节码翻译成本地机器码,然后在执行,但是将dex字节码翻译成本地机器码是发生在应用程序的运行过程中,并且应用程序每一次重新运行的时候,都要重新做这个翻译工作,因此,及时采用了JIT,Dalvik虚拟机的总体性能还是不能与直接执行本地机器码的ART虚拟机相比。

    安卓运行时从Dalvik虚拟机替换成ART虚拟机,并不要求开发者重新将自己的应用直接编译成目标机器码,也就是说,应用程序仍然是一个包含dex字节码的apk文件。所以在安装应用的时候,dex中的字节码将被编译成本地机器码,之后每次打开应用,执行的都是本地机器码。移除了运行时的解释执行,效率更高,启动更快。(安卓在4.4中发布了ART运行时)

    ART优点:
    ①系统性能显著提升
    ②应用启动更快、运行更快、体验更流畅、触感反馈更及时
    ③续航能力提升
    ④支持更低的硬件

    ART缺点
    ①更大的存储空间占用,可能增加10%-20%
    ②更长的应用安装时间

    总的来说ART就是“空间换时间”
    展开全文
  • Dalvik虚拟机、Java虚拟机与ART虚拟机

    千次阅读 2018-08-22 19:50:33
    一、Java虚拟机 1. Java的是Java字节码。 传统的Java程序经过编译,生成Java字节码保存在class文件中,Java虚拟机通过解码class文件中的内容来运行程序。 2. Java虚拟机基于栈架构。 程序在运行时虚拟机需要...

    一、Java虚拟机

    1. Java的是Java字节码。

    传统的Java程序经过编译,生成Java字节码保存在class文件中,Java虚拟机通过解码class文件中的内容来运行程序。

    2. Java虚拟机基于栈架构。

    程序在运行时虚拟机需要频繁的从栈上读取或写入数据,这个过程需要更多的指令分派与内存访问次数,会耗费不少CPU时间。

    二、Dalvik虚拟机(Android 4.4以前)

    1. Dalvik虚拟机虚拟机运行的是Dalvik字节码。

    所有的Dalvik字节码由java字节码转换而来,并被打包到一个DEX(Dalvik Executable)可执行文件中,Dalvik虚拟机通过解析DEX文件来执行这些字节码。

    2. Dalvik可执行文件体积更小

    Android SDK中的dx工具负责将Java字节码转换为Dalvik字节码,并对Java类文件重新排列,消除在类文件中出现的所有冗余信息,从而减少了冗余和重复的解析。

    因为一般情况下,Java类文件中包含多个不同的方法签名,如果其他的类文件引用改该类文件的方法,方法签名也会被复制到其类文件中,也就是,多个不同的类会同时包含相同的方法签名,同样的,大量的字符串常量在多个类文件中也被重复使用。这些冗余信息会直接增加文件的体积,也会严重影响虚拟机解析文件的效率。

    3. Dalvik虚拟机基于寄存器架构。

    数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式要快很多。

    三、ART虚拟机(Android 5.0后)

    Dalvik虚拟机是执行的时候编译+运行,所以安装速度比较快,但是开启应用的时间较慢,应用占用空间小。(以空间换时间)

    ART虚拟机是安装的时候就编译好,执行的时候就直接运行编译好的代码,所以安装速度比较慢,但是开启应用的时间快,占用空间较大。(以空间换时间)

    apk包中除了一堆资源,还有一个重要文件classes.dex,此文件由java字节码优化打包而成,在Dalvik中,每次打开应用的时候,Dalvik会读取这个classes.dex并解释执行;而在ART环境下,当安装apk的时候,这个classes.dex文件就会被转换成本地机器码——后缀为oat的文件可直接供ART虚拟机使用,以后打开应用时直接读取oat文件执行即可。


    #### YunSoul技术分享,扫码关注微信公众号##
      ——只要你学会了之前所不会的东西,只要今天的你强过了昨天的你,那你就一直是在进阶的路上了。
    展开全文
  • Dalvik虚拟机是Google区Android平台开发的虚拟机,它是Adnroid4.4以前的应用的解释执行器。Dalvik虚拟机并不是Java虚拟机(JVM)的替代器。 Dalvik虚拟机与Java虚拟机最大的不同就是Dalvik是基于寄存器,而Java...
  • Dalvik是Google公司自己设计用于Android平台的Java虚拟机。Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为 .dex(即Dalvik Executable)格式的Java应用程序的运行...
  • 首先何为虚拟机 从本质上讲,虚拟机是个被构建来提供特定或通用目的服务环境的非实体计算机,Java虚拟机它是解决跨平台服务的载体,是字节码和底层平台之间的桥梁。主要负责完成对象生命周期管理、堆栈管理、线程...
  • Android ART虚拟机

    千次阅读 2018-08-02 16:26:21
    android的流畅性问题,有一部分原因就归结于它的应用程序和部分系统服务是运行虚拟机之上的,也就是运行在Dalvik虚拟机之上,而ios的应用程序和系统服务都是直接执行本地机器指令的。除了使用ATR替换Dalvik之...
  • 温馨提示请拖动到文章末尾,长按识别「抽奖」小程序。6.6*3 红包等你来拿。1「控件人生」公众号满月了,当了一个月的奶爸,真的不容易,眼里满含泪水,但内心却无比喜悦,终于...
  • art虚拟机分析

    2017-01-24 11:26:19
    art虚拟机将dex编译成ota后,生成oat文件,该文件结构包含如下几部分1 header 部分,记录一些meta信息(其实header是包含在oatdata部分的,可以通过导出部分找到对应的oatdata,也就可以找到队一个的header部分)2...
  • ART虚拟机笔记

    2018-04-30 12:59:30
    ...ART是Android版本4.4中引入的新的运行时,...Android的流畅性问题,有一部分原因就归结于它的应用程序和部分系统服务是运行虚拟机之上的,也就是运行在Dalvik虚拟机之上,而iOS的应用程序和系统服务都是直接执行本...
  • android ART虚拟机

    2014-09-28 19:11:11
    Android 4.4发布了一个ART运行时,准备用来替换掉之前一直使用的Dalvik虚拟机,希望籍此解决饱受诟病的性能问题。老罗不打算分析ART的实现原理,只是很有兴趣知道ART是如何无缝替换掉原来的Dalvik虚拟机的。毕竟在...
  • art虚拟机介绍

    2016-04-14 14:26:54
    Android 4.4提供了一种与Dalvik截然不同的运行环境ART(Android runtime)支持,ART源于google收购的Flexycore的公司。ART模式与Dalvik模式最大的不同在于,启用ART模式后,系统在安装应用的时候会进行一次预编译,将...
  • JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才能够运行Java程序,JAVA在编译后会生成类似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是,C编译成的汇编语言会直接在硬件上跑,但...
  • Android ART虚拟机和Dalvik虚拟机区别

    千次阅读 2017-12-27 17:01:12
    Android 从5.0开始默认使用ART虚拟机执行程序,抛弃了Dalvik虚拟机.加快了Android的运行效率,提高系统的流畅性原因是Dalvik虚拟机执行的是dex字节码,ART虚拟机执行的是本地机器码, Dalvik虚拟机有一个解释器,用来...
  • 1. 什么是JVM? JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才能够运行Java程序,JAVA在编译后会生成类似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是,C编译成的汇编语言会...
  • 目录1 概论1.1 JVM 1 概论 1.1 JVM     ...JVM是Java Virtual Machine的简称,本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才能够运行Java程序,JAVA在编译后会生成类似于汇编...
  • Android Dalvik虚拟机和ART虚拟机对比

    千次阅读 2016-12-06 00:07:27
    Android Dalvik虚拟机和ART虚拟机对比概述Android4.4以上开始使用ART虚拟机,在此之前我们一直使用的Dalvik虚拟机,那么为什么Google突然换了Android运行的虚拟机呢?答案只有一个:ART虚拟机更优秀。Dalvik vs ART ...

空空如也

1 2 3 4 5 ... 20
收藏数 1,578
精华内容 631
关键字:

art 虚拟机