成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Android源碼分析-Dalvik虛擬機創(chuàng)建過程

更多完整項目下載。未完待續(xù)。源碼。圖文知識后續(xù)上傳github。
可以點擊關于我?聯(lián)系我獲取

創(chuàng)新互聯(lián)從2013年成立,先為白沙黎族等服務建站,白沙黎族等地企業(yè),進行企業(yè)商務咨詢服務。為白沙黎族企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。

一. 介紹Dalvik

1.java的運行需要JVM,同樣android中使用了java語言,也需要一個VM。針對手機處理器和內(nèi)存等硬件資源不足而推出來的一款VM,為android運行提供環(huán)境,叫DVM。

2.Dalvik虛擬機允許多個instance的存在。實際上android中的每一個app都是運行在自己VM實例之中(沙盒)。每一個VM實例在linux中又是一個單獨的進程,所以可以認為是同一個概念。運行在自己的DVM進程之中,不同的app不會相互干擾,且不會因為一個DVM的崩潰導致所有的app進程都崩潰。這點來說,Android dvm的進程和Linux的進程, 應用程序的進程 概念類似。

3.與JVM的區(qū)別:

  •  1.基于架構的不同。JVM是基于棧的架構,而DVM是基于寄存器架構。
  • 2.jvm運行的是字節(jié)碼文件,而dvm運行自己定義的dex文件格式。

    JVM編譯過程 java->class->jar
    DVM編譯過程java->class->dex

總結dvm與jvm區(qū)別:

區(qū)別一:dvm執(zhí)行的是.dex格式文件 jvm執(zhí)行的是.class文件 android程序編譯完之后生產(chǎn).class文件,然后,dex工具會把.class文件處理成.dex文件,然后把資源文件和.dex文件等打包成.apk文件。apk就是android package的意思。 jvm執(zhí)行的是.class文件。
區(qū)別二:dvm是基于寄存器的虛擬機 而jvm執(zhí)行是基于虛擬棧的虛擬機。寄存器存取速度比??斓亩啵琩vm可以根據(jù)硬件實現(xiàn)最大的優(yōu)化,比較適合移動設備。
區(qū)別三:.class文件存在很多的冗余信息,dex工具會去除冗余信息,并把所有的.class文件整合到.dex文件中。減少了I/O操作,提高了類的查找速度

一張圖了解dvm主要做的事:
Android 源碼分析-Dalvik 虛擬機創(chuàng)建過程

二.Dalvik啟動過程

//AndroidRuntime.cpp
int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote)
{
    JavaVMInitArgs initArgs;
    char propBuf[PROPERTY_VALUE_MAX];
    char stackTraceFileBuf[sizeof("-Xstacktracefile:")-1 + PROPERTY_VALUE_MAX];
    char jniOptsBuf[sizeof("-Xjniopts:")-1 + PROPERTY_VALUE_MAX];
    char heapstartsizeOptsBuf[sizeof("-Xms")-1 + PROPERTY_VALUE_MAX];
    char heapsizeOptsBuf[sizeof("-Xmx")-1 + PROPERTY_VALUE_MAX];
    char heapgrowthlimitOptsBuf[sizeof("-XX:HeapGrowthLimit=")-1 + PROPERTY_VALUE_MAX];
    char heapminfreeOptsBuf[sizeof("-XX:HeapMinFree=")-1 + PROPERTY_VALUE_MAX];
    char heapmaxfreeOptsBuf[sizeof("-XX:HeapMaxFree=")-1 + PROPERTY_VALUE_MAX];
    char usejitOptsBuf[sizeof("-Xusejit:")-1 + PROPERTY_VALUE_MAX];
    char jitmaxsizeOptsBuf[sizeof("-Xjitmaxsize:")-1 + PROPERTY_VALUE_MAX];
    char jitinitialsizeOptsBuf[sizeof("-Xjitinitialsize:")-1 + PROPERTY_VALUE_MAX];
    char jitthresholdOptsBuf[sizeof("-Xjitthreshold:")-1 + PROPERTY_VALUE_MAX];
    char useJitProfilesOptsBuf[sizeof("-Xjitsaveprofilinginfo:")-1 + PROPERTY_VALUE_MAX];
    char jitprithreadweightOptBuf[sizeof("-Xjitprithreadweight:")-1 + PROPERTY_VALUE_MAX];
    char jittransitionweightOptBuf[sizeof("-Xjittransitionweight:")-1 + PROPERTY_VALUE_MAX];
    char gctypeOptsBuf[sizeof("-Xgc:")-1 + PROPERTY_VALUE_MAX];
    char backgroundgcOptsBuf[sizeof("-XX:BackgroundGC=")-1 + PROPERTY_VALUE_MAX];
    char heaptargetutilizationOptsBuf[sizeof("-XX:HeapTargetUtilization=")-1 + PROPERTY_VALUE_MAX];
    char cachePruneBuf[sizeof("-Xzygote-max-boot-retry=")-1 + PROPERTY_VALUE_MAX];
    char dex2oatXmsImageFlagsBuf[sizeof("-Xms")-1 + PROPERTY_VALUE_MAX];
    char dex2oatXmxImageFlagsBuf[sizeof("-Xmx")-1 + PROPERTY_VALUE_MAX];
    char dex2oatXmsFlagsBuf[sizeof("-Xms")-1 + PROPERTY_VALUE_MAX];
    char dex2oatXmxFlagsBuf[sizeof("-Xmx")-1 + PROPERTY_VALUE_MAX];
    char dex2oatCompilerFilterBuf[sizeof("--compiler-filter=")-1 + PROPERTY_VALUE_MAX];
    char dex2oatImageCompilerFilterBuf[sizeof("--compiler-filter=")-1 + PROPERTY_VALUE_MAX];
    char dex2oatThreadsBuf[sizeof("-j")-1 + PROPERTY_VALUE_MAX];
    char dex2oatThreadsImageBuf[sizeof("-j")-1 + PROPERTY_VALUE_MAX];
    char dex2oat_isa_variant_key[PROPERTY_KEY_MAX];
    char dex2oat_isa_variant[sizeof("--instruction-set-variant=") -1 + PROPERTY_VALUE_MAX];
    char dex2oat_isa_features_key[PROPERTY_KEY_MAX];
    char dex2oat_isa_features[sizeof("--instruction-set-features=") -1 + PROPERTY_VALUE_MAX];
    char dex2oatFlagsBuf[PROPERTY_VALUE_MAX];
    char dex2oatImageFlagsBuf[PROPERTY_VALUE_MAX];
    char extraOptsBuf[PROPERTY_VALUE_MAX];
    char voldDecryptBuf[PROPERTY_VALUE_MAX];
    ...

    /*
     * Initialize the VM.
     *
     * The JavaVM* is essentially per-process, and the JNIEnv* is per-thread.
     * If this call succeeds, the VM is ready, and we can start issuing
     * JNI calls.
     */
    if (JNI_CreateJavaVM(pJavaVM, pEnv, &initArgs) < 0) {
        ALOGE("JNI_CreateJavaVM failed\n");
        return -1;
    }

    return 0;
}

void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)
{

    /* start the virtual machine */
    JniInvocation jni_invocation;
    jni_invocation.Init(NULL);
    JNIEnv* env;
    if (startVm(&mJavaVM, &env, zygote) != 0) {
        return;
    }
    onVmCreated(env);

    /*
     * Register android functions.
     */
    if (startReg(env) < 0) {
        ALOGE("Unable to register all android natives\n");
        return;
    }

}

     //Dalvik虛擬機在Zygote進程中的啟動過程,這個啟動過程主要就是完成了以下四個事情:
        //1. 創(chuàng)建了一個Dalvik虛擬機實例;
        //2. 加載了Java核心類及其JNI方法;
        //3. 為主線程的設置了一個JNI環(huán)境;
        //4. 注冊了Android核心類的JNI方法。

Zygote 啟動Dalvik作用:

    1. Zygote進程為Android系統(tǒng)準備好了一個Dalvik虛擬機實例,以后Zygote進程在創(chuàng)建Android應用程序進程的時候,就可以將它自身的Dalvik虛擬機實例復制到新創(chuàng)建Android應用程序進程中去,從而加快了Android應用程序進程的啟動過程。
  • 2.Java核心類和Android核心類(位于dex文件中),以及它們的JNI方法(位于so文件中),都是以內(nèi)存映射的方式來讀取的,因此,Zygote進程在創(chuàng)建Android應用程序進程的時候,除了可以將自身的Dalvik虛擬機實例復制到新創(chuàng)建的Android應用程序進程之外,還可以與新創(chuàng)建的Android應用程序進程共享Java核心類和Android核心類,以及它們的JNI方法,這樣就可以節(jié)省內(nèi)存消耗。

  • 3.Zygote進程為了加快Android應用程序進程的啟動過程,犧牲了自己的啟動速度,因為它需要加載大量的Java核心類,以及注冊大量的Android核心類JNI方法。Dalvik虛擬機在加載Java核心類的時候,還需要對它們進行驗證以及優(yōu)化,這些通常都是比較耗時的。又由于Zygote進程是由init進程啟動的,也就是說Zygote進程在是開機的時候進行啟動的,因此,Zygote進程的犧牲是比較大的。不過畢竟我們在玩手機的時候,很少會關機,也就是很少開機,因此,犧牲Zygote進程的啟動速度是值得的,換來的是Android應用程序的快速啟動。

    更多完整項目下載。未完待續(xù)。源碼。圖文知識后續(xù)上傳github。
    可以點擊關于我?聯(lián)系我獲取

分享名稱:Android源碼分析-Dalvik虛擬機創(chuàng)建過程
標題URL:http://jinyejixie.com/article12/peoddc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供ChatGPT、品牌網(wǎng)站制作、面包屑導航、標簽優(yōu)化響應式網(wǎng)站、電子商務

廣告

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

網(wǎng)站優(yōu)化排名
金寨县| 霸州市| 雷山县| 鄂尔多斯市| 玛沁县| 得荣县| 新宁县| 青海省| 昌江| 沾化县| 安泽县| 东乌珠穆沁旗| 扎赉特旗| 汾阳市| 易门县| 五莲县| 五莲县| 互助| 宜宾县| 密山市| 蓬安县| 兴和县| 大渡口区| 东海县| 砀山县| 镇康县| 北京市| 长丰县| 确山县| 中江县| 尼木县| 普兰县| 建昌县| 津南区| 探索| 根河市| 南宫市| 喀喇沁旗| 嘉荫县| 兴隆县| 泸定县|