什么是dex文件

什么是dex文件,第1张

dex文件是Android系统的可执行文件,包含应用程序的全部 *** 姿圆备作指令以及运行时数据。

由于dalvik是一种针对嵌入式设备而特殊设计的java虚拟机,所以dex文件与标准的class文件在结构设计上有着本质的区别。

当java程序编译成class后,还需要使用dex工具将所有的class文件整合到一个dex文件,目的是其中各个类能够共享数据,在一定程度上降低了冗余,同时也是文件结构更加经凑,dex文件是传统jar文件大小的50%左右。

dex将原来class每个文件都有的共有信息合成一体,这样减少了class的冗余。

从宏观上来迹毁说dex的文件结果很简单,实际上是由多个不同结构的数据体以首尾相接的方式拼接而成。

扩展资料:

Android的系统架构和其 *** 作系统一样,采用了分层的架构。

从架构图看,Android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。

dex文件的作用:

dex文件的作用是记录整个工程(通常是一个Android工程)腔搏的所有类文件的信息。

dex文件的结构:

8位字节的二进制流文件;各个数据紧密排列,无间隙,减少了文件体积,加快加载速度;整个工程的类信息都存放在一个dex文件中(不考虑dex分包的情况下);同样地,可以通过010Editor来查看dex文件信息。

参考资料:百度百科-Android

Android 程序一般使用 Java 语言开发,但是 Dalvik 虚拟机并不支持直接执行 JAVA 字节码,扮正所以会对编译生成的 .class 文件进行翻译、重构、解释、压缩等处理,这个处理过程是由 dx 进行处理,处理完成后生成的产物会以 .dex 结尾,称为 Dex 文件。

Dex 文件格式是专为 Dalvik 设计的一种压缩格式。所以可以简单的理解为:Dex 文件是很多 .class 文件处理后的产物,最终可以在 Android 运行时环境执行。

Dex文件在auto.js脚本编写中的作用

加固脚本,防止反编译

能实现脚本热更新

能提高代码的运行速度

将JS转换为dex能在一定程度上保障源码安全,且具有更快的运行速度。

由于auto.js文档中,提供了runtime.loadDex(path)的方法,因此我们可以将js文件转换为dex文件进行调用,来提迹缺扰高打包后apk的安全性,避免被庖丁等某些快速反编译工具提取js源码。

本教程你将学到

js文件转换为dex的过程

auto.js调用dex内的函数

*** 作过程

js转dex的方法,在百度上能搜到的资料并不多。

最简单方法,你可以使用庖丁一键转换。美中不足的是,庖丁的转换过程,加密了js中的类名。这种设定,导致了每次转换,被调姿旦用的类名都会变化。并不利于热更新的实现。

另一方面,庖丁是一个闭源应用,用户无法确定该应用是否安全。

因此,飞云在这里就不介绍这种方法了。

我们来使用一种安全高效稳定的node.js脚手架,来转换dex文件。

该方法, *** 作比较简单。麻烦就麻烦在,初始化配置相对复杂,一些新手在配置的过程中,容易遇到各种问题,又没有系统的教程和异常问题处理方案,在最终解决问题的过程中,浪费许多时间和精力。

本教程是飞云在mac系统下编写的。如果你的电脑是windows系统,个别细节可能会有差异。例如,windows系统,没有mac的终端。安装脚手架是在命令行工具里进行的。

以下基于 Android_4.0.4源码进行分析。

先丢一张虚拟机用到的数据结构。我们的起点在

native private static int openDexFile(String sourceName, String outputName, int flags) throws IOException @ DexFile.java

重点 1

重点 2

@DvmDex.cpp

//根据 DexFile 的信息填销物宽充 DvmDex

static DvmDex* allocateAuxStructres(DexFile* pDexFile){

DvmDex* pDvmDex

const DexHeader* pHeader

u4 stringCount, classCount, methodCount, fileCount

pDvmDex = (DvmDex*) calloc(1, sizeof(DvmDex))

pDvmDex->pDexFile = pDexFile

pDvmDex->pHeader = pDexFile->pHeader

pHeader = pDvmDex->pHeader

stringCount = pHeader->stringIdsSize

classCount = pHeader->typeIdsSize

methodCount = pHeader->methodIdsSize

filedCount = pHeader->fileIdsSize

//根据实际的数量分配内存

pDvmDex->pResStrings = (struct StringObject ) calloc(stringCount, sizeof(struct stringObject ))

pDvmDex->pResClasses = (struct ClassObject ) calloc(ClassObject, sizeof(struct ClassObject ))

pDvmDex->pResMethods = (struct Method ) calloc(methodCount, sizeof(struct Method ))

pDvmDex->pResFilds = (struct Field ) calloc(fieldCount, sizeof(struct Field ))

...

pDvmDex->pInterfaceCache = dvmAllocAtomicCache(DEX_INTERFACE_CACHE_SIZE)

}

* 从上面看出来,DvmDex 包含 DexFile,DexFile 包含 DexHeader。通过解析 DexHeader,将常量亏亮池,方法区,字段等信息在内存的首地址存入 DexFile;然后通过 DexFile 的信息在 DvmDex 中分配合适的内存。于是 Dex 文件便初步解析完成了,蚂孙并且保存在了内存。在进行类加载的时候,一个类的信息在内存中以 ClassObject 的结构保存。同时在 DexFile 中有一个 ClassLookup* pClassLookup 作为一个哈希表作为缓存保存已经加载了的类。

另外native private static int openDexFile(String sourceName, String outputName, int flags)的返回值是一个 int。明显这个 int 是对应 native 中一个对象的句柄。那么来看 Dalvik_dalvik_system_DexFile_openDexFile()@dalvik_system_DexFile.cpp 中的返回值是 DexOrJar。

于是在 DexFile 中的 cookie 保存的便是这个 DexOrJar 的地址。

https://github.com/Wi1ls/DexParse


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12152210.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存