精华内容
下载资源
问答
  • 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就是“空间换时间”
    展开全文
  • Android Dalvik虚拟机和ART虚拟机对比

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

    Android Dalvik虚拟机和ART虚拟机对比

    概述

    Android4.4以上开始使用ART虚拟机,在此之前我们一直使用的Dalvik虚拟机,那么为什么Google突然换了Android运行的虚拟机呢?答案只有一个:ART虚拟机更优秀。

    Dalvik vs ART

    • Dalvik
      Android4.4及以前使用的都是Dalvik虚拟机,我们知道Apk在打包的过程中会先将java等源码通过javac编译成.class文件,但是我们的Dalvik虚拟机只会执行.dex文件,这个时候dx会将.class文件转换成Dalvik虚拟机执行的.dex文件。Dalvik虚拟机在启动的时候会先将.dex文件转换成快速运行的机器码,又因为65535这个问题,导致我们在应用冷启动的时候有一个合包的过程,最后导致的一个结果就是我们的app启动慢,这就是Dalvik虚拟机的JIT特性(Just In Time)。
    • ART
      ART虚拟机是在Android5.0才开始使用的Android虚拟机,ART虚拟机必须要兼容Dalvik虚拟机的特性,但是ART有一个很好的特性AOT(ahead of time),这个特性就是我们在安装APK的时候就将dex直接处理成可直接供ART虚拟机使用的机器码,ART虚拟机将.dex文件转换成可直接运行的.oat文件,ART虚拟机天生支持多dex,所以也不会有一个合包的过程,所以ART虚拟机会很大的提升APP冷启动速度。

    总结

    • ART优点:

      1. 加快APP冷启动速度
      2. 提升GC速度
      3. 提供功能全面的Debug特性
    • ART缺点:

      1. APP安装速度慢,因为在APK安装的时候要生成可运行.oat文件
      2. APK占用空间大,因为在APK安装的时候要生成可运行.oat文件
    展开全文
  • 本系列文章记录对ART虚拟机学习过程中的一些资料记录,及个人对虚拟机的一些理解。
  • 本文基于Android8.1系统进行... runtime-Start()启动虚拟机 五、其他参考文章 Android ART运行时无缝替换Dalvik虚拟机的过程分析 Android虚拟机art流程:从zygote开始梳理art的启动(1) 打赏 微信扫一扫,打赏作者吧~
  • ART虚拟机oat文件

    2018-12-07 19:03:09
    5.0以上android强制用art虚拟机 oat文件在安装过程中dex2oat系统工具将apk所有dex文件转成oat文件放在/data/dalvik-cache/arm目录下后缀还是以dex/odex结尾
  • Android ART虚拟机和Dalvik虚拟机区别原因是Dalvik虚拟机执行的是dex字节码,ART虚拟机执行的是本地机器码, Dalvik虚拟机有一个解释器,用来执行dex字节码, Android从2.2开始,通过JIT(Just-In-Time)进行Dalvik...
  • 深入理解ART虚拟机—虚拟机的启动

    千次阅读 2016-10-11 13:50:16
    art虚拟机也有一段时间了,是时候写点什么出来了。早先看art的时候,发现不是太能理解,所以就恶补了一下dalvik虚拟机,所以有了之前的dalvik系列,等再次回头看art的时候,确实轻松了不少。 art从Android L开始...
  • art虚拟机中的同步抽象 最近,准备做一个关于解析art虚拟机的解读。算是给自己一个记录 一、同步抽象架构 一图胜千言 二、解析 1、art虚拟机的实现,离不开互斥体,同步的因素。因为是多线程系统...
  • art虚拟机分析

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

    千次阅读 2018-10-15 11:13:27
    本会讲解Android上的ART虚拟机。 我的博客中,还有另外两篇关于Android虚拟机的文章也可以配套阅读: Android上的Dalvik虚拟机 Android上ART虚拟机 从Android 5.0(Lollipop)开始,Android Runtime(下文简称ART...
  • Android ART虚拟机

    2016-05-04 18:16:59
    Android ART虚拟机 2014-01-18 0 个评论  来源:yangwen123的专栏  收藏 我要投稿 Android 4.4提供了一种与Dalvik截然不同的运行环境ART(Android runtime)支持,ART源于google收购的Flexycore的公司。...
  • Android dalvik 虚拟机与ART虚拟机区别
  • Art虚拟机(2)–加载类流程 参考老罗博客整理Art虚拟机加载类流程。如下:
  • ART 虚拟机参数配置

    2019-01-04 22:36:35
    ART 虚拟机参数配置 针对 512M 和 1G 真实内存设备 推荐设置如下: dalvik.vm.heapstartsize = 4m dalvik.vm.heapminfree = 512k dalvik.vm.heapmaxfree = 8m dalvik.vm.heaptargetutilization = 0.75 #### ...
  • Art虚拟机(3)–初始化类流程 参考老罗博客整理Art虚拟机初始化类流程。如下:
  • ART 虚拟机 — Interpreter 模式

    千次阅读 2018-06-18 20:43:26
    ART 虚拟机执行 Java 方法主要有两种模式:quick code 模式和 Interpreter 模式; quick code 模式:执行 arm 汇编指令 Interpreter 模式:由解释器解释执行 Dalvik 字节码 本篇文章就来讲一下,...
  • Java方法在art虚拟机中的执行

    千次阅读 2018-12-19 09:36:15
    ART 虚拟机执行 Java 方法主要有两种模式:quick code 模式和 Interpreter 模式 quick code 模式:执行 arm 汇编指令 Interpreter 模式:由解释器解释执行 Dalvik 字节码 在之前的文章 ART 虚拟机 — ...
  • ART虚拟机特点与组件

    2017-08-09 16:53:59
    原文地址:ART虚拟机启动之image空间 接下来以Android-5.1.1-R14版本的源码介绍ART虚拟机的相关知识,本来不想对Dalvik多说的,可是发现Dalvik虽然已经退休了,但其影响力依然不小,ART中很多地方都引用了其中的...
  • Dalvik和ART虚拟机的区别

    千次阅读 2017-07-10 11:54:38
    Dalvik和ART虚拟机
  • ART虚拟机的简单介绍,它的运行时堆重点介绍了。 GC垃圾回收因为太费时间了,没有说。 区别主要集中介绍了编译的方式的转变,例如:JIT、AOT的引入,以及即时JIT的引入。 Dalvik虚拟机 1.DVM与JVM
  • Art虚拟机(1)–加载dex文件流程 参考老罗博客整理Art虚拟机加载dex文件流程。如下:
  • 1.概述 Android4.4以上开始使用ART虚拟机,在此之前我们一直使用的Dalvik虚拟机,那么为什么Google突然换了Android运行的虚拟机呢?答案只有一个:ART虚拟机更优秀。 2.Dalvik vs ARTDalvik Android4.4及以前使用...
  • 前面两篇文章介绍了ART的启动过程,而在启动之后,我们感兴趣的就是ART是怎么运行的。回顾一下虚拟机系列的前面几篇文章,我们可以理一下思路: ...参考文章《深入理解ART虚拟机—虚拟机的启动》 三,JavaVM创建之

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,776
精华内容 6,310
关键字:

art虚拟机