1. 程式人生 > >Android培訓班 66 dex檔案開啟流程

Android培訓班 66 dex檔案開啟流程

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

下面來分析這個函式程式碼,如下:

intdexZipPrepArchive(int fd, const char* debugFileName, ZipArchive*pArchive)

{

這個函式輸入檔案控制代碼、檔名稱、壓縮檔案物件。


   MemMapping map;

   int err;


   map.addr = NULL;

   memset(pArchive, 0, sizeof(*pArchive));


   pArchive->mFd = fd;

這行程式碼是儲存檔案控制代碼。


   if (sysMapFileInShmem(pArchive->mFd,&map) != 0) {

       err = -1;

       LOGW("Map of '%s' failed\n",debugFileName);

       goto bail;

    }


   if (map.length < kEOCDLen) {

       err = -1;

       LOGV("File '%s' too small to be zip(%zd)\n", debugFileName,map.length);

       goto bail;

    }

這段程式碼對映檔案資料到記憶體。



   if (!parseZipArchive(pArchive, &map)) {

       err = -1;

       LOGV("Parsing '%s' failed\n",debugFileName);

       goto bail;

    }

這段程式碼是分析zip檔案。


   /* success */

   err = 0;

   sysCopyMap(&pArchive->mMap, &map);

   map.addr = NULL;

這段程式碼拷貝到對映位置。


bail:

   if (err != 0)

       dexZipCloseArchive(pArchive);

   if (map.addr != NULL)

       sysReleaseShmem(&map);

   return err;

}


函式dexZipPrepArchive的處理,主要就是先儲存檔案控制代碼,然後建立檔案記憶體對映,呼叫parseZipArchive函式來分析zip的所有入口點,並記錄到相應的hash表裡,最後呼叫sysCopyMap函式來儲存到zip檔案物件結構裡。


由上面分析可知,dex檔案是壓縮成zip檔案,這樣可以減少佔用空間。dex檔案在系統裡是怎麼樣開啟的過程呢?其它經過下面的過程:

1)系統初始化虛擬機器時,會初始化原始方法gDvmNativeMethodSet集合。

2)在原始方法集合裡有一個函式集合dvm_dalvik_system_DexFile,註冊它為Ldalvik/system/DexFile串,當虛擬機器呼叫DexFile相關函式時,就會呼叫這些函式來處理Dex檔案。

3)在處理Dex檔案時,會呼叫函式集合:dvm_dalvik_system_DexFile,這個函式集合裡,主要有如下函式:

constDalvikNativeMethod dvm_dalvik_system_DexFile[] = {

    {"openDexFile",       "(Ljava/lang/String;Ljava/lang/String;I)I",

       Dalvik_dalvik_system_DexFile_openDexFile},

    {"closeDexFile",       "(I)V",

       Dalvik_dalvik_system_DexFile_closeDexFile},

    {"defineClass",       "(Ljava/lang/String;Ljava/lang/ClassLoader;ILjava/security/ProtectionDomain;)Ljava/lang/Class;",

       Dalvik_dalvik_system_DexFile_defineClass},

    {"getClassNameList",   "(I)[Ljava/lang/String;",

       Dalvik_dalvik_system_DexFile_getClassNameList},

    {"isDexOptNeeded",     "(Ljava/lang/String;)Z",

       Dalvik_dalvik_system_DexFile_isDexOptNeeded},

    {NULL, NULL, NULL },

};


openDexFile方法對應的原始函式是Dalvik_dalvik_system_DexFile_openDexFile,它是開啟Dex檔案函式。

closeDexFile方法對應的原始函式是Dalvik_dalvik_system_DexFile_closeDexFile,它是關閉已經開啟的Dex檔案函式。


4)在Dalvik_dalvik_system_DexFile_openDexFile函式裡,呼叫函式dvmJarFileOpen開啟JAR或者ZIP壓縮的檔案。

5)在dvmJarFileOpen函式裡,呼叫dexZipOpenArchive來處理ZIP檔案,呼叫dexZipFindEntry函式讀取ZIP解壓的檔案,呼叫dvmDexFileOpenFromFd函式讀取相應的類資料到記憶體,並返回給虛擬機器。

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述