溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何進行Dalvik,ART與ODEX簡析

發(fā)布時間:2021-12-09 10:03:56 來源:億速云 閱讀:226 作者:柒染 欄目:大數(shù)據(jù)

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)如何進行Dalvik,ART與ODEX簡析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

一:Dalvik和ART的區(qū)別

Dalvik: Dalvik是Google公司自己設(shè)計用于Android平臺的Java虛擬機它可以支持已轉(zhuǎn)換為 .dex(即Dalvik Executable)格式的Java應(yīng)用程序的運行,.dex格式是專為Dalvik設(shè)計的一種壓縮格式,適合內(nèi)存和處理器速度有限的系統(tǒng)。執(zhí)行的是字節(jié)碼,它是依靠Just-In-Time (JIT)機制去解釋字節(jié)碼
ART:即Android Runtime,google為了替代Dalvik專門為Android研發(fā)的。Android KK為開發(fā)者推出,L版本正式上線。比替代品更高效省電,執(zhí)行的是本地機器碼(也就是linux的ELF文件格式),依靠Ahead-Of-Time (AOT)機制

二.在不同平臺DEX轉(zhuǎn)化為ODEX的過程

簡化流程如下:

如何進行Dalvik,ART與ODEX簡析

打包安裝運行簡化流程.png

這里參考的是

Android ART運行時無縫替換Dalvik虛擬機的過程分析

http://blog.csdn.net/luoshengyang/article/details/18006645

android安裝過程源碼分析:

Android應(yīng)用程序進程啟動過程的源代碼分析

http://blog.csdn.net/luoshengyang/article/details/6747696

簡單來說,就是Android系統(tǒng)通過PackageManagerService來安裝APK,在安裝的過程,PackageManagerService會通過另外一個類Installer的成員函數(shù)dexopt來對APK里面的dex字節(jié)碼進行優(yōu)化:

public final class Installer {  
    ......  

    public int dexopt(……) {  
        StringBuilder builder = new StringBuilder("dexopt");  
        builder.append(' ');  
        builder.append(apkPath);  
        builder.append(' ');  
        builder.append(uid);  
        builder.append(isPublic ? " 1" : " 0");  
        return execute(builder.toString());  
    }  

    ......  
}

這個函數(shù)定義在文件frameworks/base/services/java/com/android/server/pm/Installer.java中。Installer通過socket向守護進程installd發(fā)送一個dexopt請求,這個請求是由installd里面的函數(shù)dexopt來處理的。詳細過程請移步Android ART運行時無縫替換Dalvik虛擬機的過程分析

int dexopt(const char ……

函數(shù)定義在frameworks/native/cmds/installd/commands.c中 函數(shù)dexopt首先是讀取系統(tǒng)屬性persist.sys.dalvik.vm.lib的值,接著在/data/dalvik-cache目錄中創(chuàng)建一個odex文件。這個odex文件就是作為dex文件優(yōu)化后的輸出文件。再接下來,函數(shù)dexopt通過fork來創(chuàng)建一個子進程。如果系統(tǒng)屬性persist.sys.dalvik.vm.lib的值等于libdvm.so,那么該子進程就會調(diào)用函數(shù)run_dexopt來將dex文件優(yōu)化成odex文件。另一方面,如果系統(tǒng)屬性persist.sys.dalvik.vm.lib的值等于libart.so,那么該子進程就會調(diào)用函數(shù)run_dex2oat來將dex文件翻譯成oat文件,實際上就是將dex字節(jié)碼翻譯成本地機器碼,并且保存在一個oat文件中。
函數(shù)run_dexopt通過調(diào)用/system/bin/dexopt來對dex字節(jié)碼進行優(yōu)化,而函數(shù)run_dex2oat通過調(diào)用/system/bin/dex2oat來將dex字節(jié)碼翻譯成本地機器碼。注意,無論是對dex字節(jié)碼進行優(yōu)化,還是將dex字節(jié)碼翻譯成本地機器碼,最終得到的結(jié)果都是保存在相同名稱的一個odex文件里面的,但是前者對應(yīng)的是一個dey文件(表示這是一個優(yōu)化過的dex),后者對應(yīng)的是一個oat文件(實際上是一個自定義的elf文件,里面包含的都是本地機器指令)。通過這種方式,原來任何通過絕對路徑引用了該odex文件的代碼就都不需要修改了。

三.oat文件格式

借助羅大神的圖我們可以知道,OAT文件本質(zhì)上是一個ELF文件,因此在最外層它具有一般ELF文件的結(jié)構(gòu),例如它有標(biāo)準(zhǔn)的ELF文件頭以及通過段(Section)來描述文件內(nèi)容。

OAT文件包含有兩個特殊的段oatdata和oatexec,前者包含有用來生成本地機器指令的dex文件內(nèi)容,后者包含有生成的本地機器指令,它們之間的關(guān)系通過儲存在oatdata段前面的oat頭部描述。

APK安裝過程中生成的OAT文件的輸入只有一個DEX文件,也就是來自于打包在要安裝的APK文件里面的classes.dex文件。實際上,一個OAT文件是可以由若干個DEX生成的。這意味著在生成的OAT文件的oatdata段中,包含有多個DEX文件。詳細分析請移步Android運行時ART加載OAT文件的過程分析

四.multidex加載odex,multidex和oat的關(guān)系

MultiDex在dalvik虛擬機上的簡要安裝過程:
將/data/app/apkName.apk路徑下解壓得到的classes2.dex, …, classesN.dex,依次寫入到/data/data/pkgName/code_cache/secondary-dexes/apkName.apk.classes2.zip等zip文件的classes.dex中,并返回這個zip列表。然后針對這個zip列表執(zhí)行安裝過程,具體過程是,將這個要安裝的zip列表加入BaseDexClassLoader的pathList實例的dexElements數(shù)組中,其中會針對各dex文件進行dex2opt優(yōu)化。一旦加入到了dexElements數(shù)組中,程序啟動的時候,ClassLoader會加載dexElements數(shù)組中的元素,從而實現(xiàn)multi dex的安裝。

上面提到OAT文件可以由若干個dex生成,也就是不需要multidex去進行安裝,但是multidex是application中
進行Install的,跟虛擬機關(guān)系不大。

@Override
   attachBaseContext(……) {    super.attachBaseContext(base);    MultiDex.install(this); }

在install函數(shù)中在執(zhí)行從提取dex文件列表前會做一些校驗操作,其中包含檢查APK是否已安裝,若APK已安裝,則不進行后續(xù)操作。檢查SDK版本號,版本號大于20不能保證MultiDex可正常Work

 Set var2 = installedApk;
 synchronized(installedApk) {                  
 String apkPath = e.sourceDir;                  
if(installedApk.contains(apkPath)) {                        
      return;    }

所以multidex在ART上不會影響程序的邏輯,它和ART沒有關(guān)系。

從安裝過程上來看
Java的代碼實際上需要兩次“轉(zhuǎn)換”才可以在android設(shè)備上運行
一.PC端:.class->.dex->.apk
二.phone:dex->odex

區(qū)別在于第二步。
ART : .dex->.odex(機器碼)(AOT  Ahead-Of-Time)
Dalvik: .dex->.odex(字節(jié)碼)(JIT Just-In-Time)
機器碼可直接執(zhí)行,而字節(jié)碼每次啟動都需要執(zhí)行將優(yōu)化過的odex字節(jié)碼再轉(zhuǎn)換成機器碼

ART優(yōu)缺

系統(tǒng)性能大幅提升
App啟動、運行更快
減少每次啟動的編譯增加電池續(xù)航
存儲占用更大
安裝時間更長

上述就是小編為大家分享的如何進行Dalvik,ART與ODEX簡析了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI