下面来分析这个函数代码,如下:
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函数读取相应的类数据到内存,并返回给虚拟机。
分享到:
相关推荐
Android中dump出dex文件
生成dex源码
android运行时生成dex文件,动态加载运行
通过封装Dalvik_dalvik_system_DexFile_openDexFile_bytearray函数,可以在解密出dex文件的byteArray数组后,不需要保存到文件系统的路径上,直接通过4.0的函数在内存中读取。
Android_DEX_文件格式详解
Android内存加载运行DEX文件示例代码。 解决自定义CLassLoader加载文件不安全的问题
这是关于打包工具的文档,为广大的移动开发用户提供多 dex打包方法
Android反编译工具dex2jar,用于加.dex反编译成.class文件
Android系统应用程序DEX文件保护方法研究.pdf
AndroidKiller小插件,多dex转java源码,无需重启AndroidKiller直接打开jdgui即可看代码,无需手动反编译dex2,3,4,5,省时省力。 ps: 这是解决多dex编译源码的小工具,需要解决编译卡死的,请看我另一个帖子...
Android中内存加载dex
《APK+Dex文件反编译及回编译工具》 简称:APKDB 是一款,针对Android OS系统的APK程序,直接反编译修改的工具。 APKDB集合了当今最强悍,最犀利的APK及Dex文件编译工具; 正常安装后,它直接在【鼠标右键】创建...
把classes.dex文件,放入dex2jar文件夹,然后打开终端,输入命令进行去壳操作: cd dex2jar文件夹 sh dex2jar.sh classes.dex
利用androidStudio打包Jar的方法,DEX,打包单个类,多个类
Android 反编译工具 ,dex2jar ,Android 反编译工具Android 反编译工具 ,dex2jar ,Android 反编译工具
标 题: 【原创】Android dex文件通用自动脱壳器 作 者: zyqqyz 时 间: 2015-09-01,13:03:30 链 接: http://bbs.pediy.com/showthread.php?t=203776 之前做了一个Android dex的通用脱壳器,主要思想是以AOP的模式对...
TurboDex: Fast load dex in memory 中文 It is generally known that load an unoptimized Dex file at runtime in Android (especially in ART mode) would take a long time. When your App is using MultiDex ...
非常方便汉化工作者对APK或Dex文件的编译操作; 本工具箱集合了,当今最强悍,最犀利的APK\Dex反编译工具; 【注意:反编译文件名称 不能用中文,否则无法回编译。】 _____________________________________...
DEX文件格式分析
首先将apk文件后缀改为zip并解压,得到其中的classes.dex,它就是java文件编译再通过dx工具打包而成的,将classes.dex复制到dex2jar.bat所在目录dex2jar 文件夹。 在命令行下定位到dex2jar.bat所在目录,运行 dex2...