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

这里写图片描述

猜你喜欢

转载自blog.csdn.net/uytrrfg/article/details/83988126
66
今日推荐