Android JIT与AOT编译

Android JIT与AOT编译,android,compilation,jit,Android,Compilation,Jit,这个问题与安卓系统有关。 Dalvik VM使用了JIT概念,这意味着当您第一次运行应用程序时,Dalvik VM将其编译并加载到RAM。我理解这个概念。但名为ART的新虚拟机使用了AOT方法ART在安装应用程序后(或安装时?)编译应用程序。这意味着什么?由ART编译的应用程序与已编译的应用程序(如C应用程序)相同,但运行在与其他操作系统分开的单独进程中? 有人能更透彻地给我解释一下这个概念吗。我必须做一些介绍,这里提到了这一点,但我不理解这个概念,如果有人问我这方面的问题,我不想显得愚蠢:)

这个问题与安卓系统有关。 Dalvik VM使用了JIT概念,这意味着当您第一次运行应用程序时,Dalvik VM将其编译并加载到RAM。我理解这个概念。但名为ART的新虚拟机使用了AOT方法ART在安装应用程序后(或安装时?)编译应用程序。这意味着什么?由ART编译的应用程序与已编译的应用程序(如C应用程序)相同,但运行在与其他操作系统分开的单独进程中? 有人能更透彻地给我解释一下这个概念吗。我必须做一些介绍,这里提到了这一点,但我不理解这个概念,如果有人问我这方面的问题,我不想显得愚蠢:)
抱歉英语不好,如果有人能稍微修改一下问题就好了。

我不太清楚Android上的Dalvik JIT在实践中是如何工作的,因为JIT有几个选项如何工作

第一个选项是,JIT在应用程序启动时将所有字节码转换为CPU指令。此选项在应用程序启动之前和启动之后花费了一些时间,应用程序可以作为本机运行。问题是,在启动期间,翻译后的应用程序必须保存在内存中,这是不好的

第二种选择是,JIT实时工作,这意味着在即将启动时转换代码块。整个应用程序在启动时不会被翻译,但只有主功能在启动时被翻译,然后在运行期间被翻译,当使用某些代码块(函数等)时。此选项消耗更少的内存,但应用程序在运行期间要慢得多

根据我发现的信息,Android使用第一种选择。应用程序在启动时进行翻译,然后以“几乎”本机方式运行。这个“几乎”是JIT和AOT之间的主要区别

当您即将启动某些应用程序时,JIT只有有限的时间将所有字节码编译为CPU指令,以使启动延迟“可接受”很长。这意味着,它只能执行基本的优化。然而,当你安装一些应用程序时,你通常会浪费更多的时间,而且你只做一次,而不是每次启动。这意味着AOT编译器有更多的时间找到优化应用程序的技巧。结果代码应该更“高效”。第二个好处是,编译后的应用程序存储在缓存中,启动时只能将其中的一部分加载到内存中。这意味着操作系统没有将整个代码保存在内存中,可以保存它。这就是主要的区别

问题的最后一部分-Android上的ART将在安装时执行编译(在将apk保存到/data/app/之后)。然而,如果您擦除缓存,或者从Dalvik切换到ART,它将在第一次引导时编译所有已安装的应用程序,这可能需要10分钟甚至更长时间


我也很抱歉我的英语不好,我是捷克人:-)

我不懂艺术。所有应用程序都被编译并保存到缓存中,对吗?然后它们在本地运行?只是不要试图理解AOT(像Art)和JIT(像Dalvik)完全不同的东西。他们真的很相似。AOT/JIT主要是某些编译器行为的名称。在某些情况下,可以像设置中的选项一样选择ART/JIT行为(这不是ART/Dalvik的情况,但有大量编译器)。AOT和JIT编译器可以毫无问题地共享95%的核心代码。但是,这两种行为都有其特定的优化,这两种行为之间不可交换,但这些优化是可选的。AOT编译和现在大多数应用程序的编译方式并没有什么区别。Delphi、C++、C等都使用了这种编译。这完全是一回事。但在android上,应用程序不是通过源代码共享的,而是通过预编译字节码共享的。它介于源代码和本机应用程序之间。关键字、变量等被转换为符号字节,不相关的冗余信息被去除(空格、变量名,有时甚至是类/函数名)。这使得字节码比源代码小得多,而且修改它更困难,因为可读性是。。。。。。受剥离注释、变量名等的负面影响。启动或编译字节码比解释源代码快得多。像PHP这样的语言也在启动前将源代码转换为字节码(如果您感兴趣,可以称之为Zend Engine 2操作码)。回到你的问题上来。。。AOT和JIT没有使用解释方法,这意味着两者都必须发出本机代码。主要区别在于此代码何时被执行(运行时之前或期间的JIT),并且JIT有一些开销,因为它通常在应用程序运行期间运行并分析/编译它……是的,AOT将所有应用程序编译为本机代码,并将此本机代码保留在缓存中。这种本机代码通常更大(谷歌表示,Dalvik使用的缓存字节码约占10-20%)。