欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何進(jìn)行Dalvik,ART與ODEX簡析

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

創(chuàng)新互聯(lián)是一家專業(yè)提供鎮(zhèn)沅企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、網(wǎng)站制作、HTML5建站、小程序制作等業(yè)務(wù)。10年已為鎮(zhèn)沅眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。

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

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

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

簡化流程如下:

如何進(jìn)行Dalvik,ART與ODEX簡析

打包安裝運(yùn)行簡化流程.png

這里參考的是

Android ART運(yùn)行時(shí)無縫替換Dalvik虛擬機(jī)的過程分析

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

android安裝過程源碼分析:

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

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

簡單來說,就是Android系統(tǒng)通過PackageManagerService來安裝APK,在安裝的過程,PackageManagerService會(huì)通過另外一個(gè)類Installer的成員函數(shù)dexopt來對(duì)APK里面的dex字節(jié)碼進(jìn)行優(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());  
    }  

    ......  
}

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

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

三.oat文件格式

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

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

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

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

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

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

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

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

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

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

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

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

ART優(yōu)缺

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

上述就是小編為大家分享的如何進(jìn)行Dalvik,ART與ODEX簡析了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享文章:如何進(jìn)行Dalvik,ART與ODEX簡析
URL地址:http://chinadenli.net/article14/ghoege.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)全網(wǎng)營銷推廣品牌網(wǎng)站設(shè)計(jì)企業(yè)網(wǎng)站制作移動(dòng)網(wǎng)站建設(shè)網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)