什么是dex文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是dex文件相关的知识,希望对你有一定的参考价值。
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
参考技术A dex是应用安装时生成的虚拟机可执行二进制文件,如果应用还存在,删除了下次手机开机时还会再次生成,卸载软件时会同时删除dex文件。所以没有必要手动删除dex文件。对于Android DEX文件进行优化,需要注意的一点是DEX文件的结构是紧凑的,但是我们还是要想方设法的进行提高程序的运行速度,我们就仍然需要对DEX文件进行进一步优化。
调整所有字段的字节序(LITTLE_ENDIAN)和对齐结构中的每一个域 验证DEX文件中的所有类 对一些特定的类进行优化,对方法里的操作码进行优化 。优化后的文件大小会有所增加,应该是原Android DEX文件的1-4倍。 优化发生的时机有两个:对于预置应用,可以在系统编译后,生成优化文件,以ODEX结尾。
这样在发布时除APK文件(不包含DEX)以外,还有一个相应的Android DEX文件;对于非预置应用,包含在APK文件里的DEX文件会在运行时被优化,优化后的文件将被保存在缓存中。
每一个Android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制,内存分配和管理,Mutex等等都是依赖底层操作系统而实现的。 参考技术B 这样做可以加快软件的启动速度,预先提取,减少对RAM的占用,因为没有odex的话,系统要从apk包中提取dex再运行。当Android启动时,DalvikVM监视所有的程序(APK文件)和框架,并且为他们创建一个依存关系树。DalvikVM通过这个依存关系树来为每个程序优化代码并存储在Dalvik缓存中。这样,所有程序在运行时都会使用优化过的代码。这就是当你刷一个新的ROM时,有时候第一次启动时间非常非常长的原因。当一个程序(或者框架库)发生变更,DalvikVM将会重新优化代码并且再次将其存在缓存中。在cache/dalvik- cache是存放system上的程序生成的dex文件,而data/dalvik-cache则是存放data/app生成的dex文件。准备工作:用Recovery进行一个备份,预防出现意外,不能开机。请确定你的电脑可以正常连接手机调试模式。请确定你的system有10-20M空余。说明:Android系统中运行的程序包主要分framework,system/app,data/app,三个路径,开机的时候启动内核后,就会逐个启动framework里的jar框架程序,再启动system/app的开机自启程序。如果你想把整个ROM都odex化,就必须先将framework的先做,因为在odex过程中,需要依赖framework进行。而且在 odex framework时,每个文件都要严格按照顺序,否则不能开机。如果你在其他app做了odex,Sorry,你不能odex framework。下载附件解压,执行odex.bat,选在你想要的操作,如果你想将整个ROM odex化,必须先选择framework,然后system,data,如果你不想odex framework,可以直接跳过,但是你以后都不能odex framework。【更新】odex framework更新自动删除dex文件。这个脚本更新可以重复使用,也就是你odex一遍后,自己添加了apk或者二级框架程序(jar,譬如google.map.jar),可以使用这个脚本单独对这些odex,不会影响其他已经odex的程序。本回答被提问者采纳 参考技术C 在Android系统中,dex文件是可以直接在Dalvik虚拟机中加载运行的文件。通过ADT,经过复杂的编译,可以把java源代码转换为dex文 件。 那么这个文件的格式是什么样的呢?为什么Android不直接使用class文件,而采用这个不一样文件呢?其实它是针对嵌入式系统优化的结 果,Dalvik虚拟机的指令码并不是标准的Java虚拟机指令码,而是使用了自己独有的一套指令集。如果有自己的编译系统,可以不生成class文件, 直接生成dex文件。dex文件中共用了很多类名称、常量字符串,使它的体积比较小,运行效率也比较高。但归根到底,Dalvik还是基于寄存器的虚拟机 的一个实现。 参考技术D 手机上用的(类似EXE),给好评哦!
【理论知识】Dex文件结构分析
参考技术A Dex文件就是Dalvik可执行文件,实际上它就是一个优化后的java字节码文件,因此构造这类文件需要先写个java文件Pino.java
然后编译
之后得到了Pino.class文件,之后我们用dx工具,该工具需要安装Android SDK才能有的工具
这样就得到了一个dex文件了,之后我们利用010editor工具来进行分析。
那我们从头开始分析
首先,我们来看一下Dex文件头的结构体
这里stringIdSize的值为0E,10进制就是14,也就是说这个dex文件的字符串的个数为14个,文件偏移是70,我们到70的位置看一下
蓝色部分就是DexStringId的内容了,每个字符串4字节,总共14个,我们先看一下第一组“76 01 00 00”,这个值并不是字符串的具体内容,而是字符串所在位置的文件偏移,我们去看一下176h这个位置
蓝色部分我一共选中了8个字节,其中第一个字节06代表的是之后多少个字节属于字符串,也就是“3C 69 6E 69 74 3E”,而最后一个字节的00其实是字符串结尾的空字节,但是计数的时候并没有算上而已,总结一下这个dex文件中所有的字符串如下:
先看一下第一个4字节的值“02 00 00 00 ”,对照之前我们整理的字符串的表格,就是LPino;即Pino类型的,整理一下所有的类型,如下
这里数量就是3,位置偏移为C4,跟过去看下
蓝色选中的部分就是所有的方法原型的结构了,这里又涉及到了一个新的数据结构
这三个属性分别是第一个是方法声明的字符串,第二个是方法的返回类型,第三个是方法的参数列表,其中DexTypeList是新的数据结构
回过头来看一下蓝色部分,12个字节,第一个4字节为8,说明DexStringId列表的索引是8,也就是V,第二个4字节是5,也就是V,最后一个是0,也就是没有参数,第一个方法就是void (),整理一下其他的如下:
也就是一个DexFieldId是8个字节
classIdx的值是4,也就是Ljava/lang/System;,typeIdx的值是1,也就是Ljava/io/PrintStream;,nameIdx的值是C,也就是out,总结一下字段如下:
也就是说每个DexMethodId占8个字节,第一个8字节中的classIdx的值是0,也就是LPino;,protoIdx的值也是0,也就是void(),第三nameIdx也是0,也就是<init>,综合起来就是void Pino.<init>(),整理一下所有的方法如下:
上面的数据结构28个字节,内容的话看注释也能看懂,我们直接上实例,在这里,classIdx是1,也就是LPino;,第二个accessFlags是1,也就是public,第三个superclassIdx是2,也就是父类是java.lang.Object,第四个interfacesOff是0,就是没有,第五个是sourceFileIdx是7,也就是Pino.java,第六个是annotationOff,是0,没有,第七个classData是22D,也就是DexClassData的偏移是22D,我们先来看看DexClassData的结构体
这里面又涉及到了其他三种结构体
这里需要注意的一点的就是这里的u4并不是值4字节,而是值uleb128的类型,具体是什么可以自行百度。
现在我们再去22D的位置看看
从这里可以判断姿态字段0个,实例字段0个,直接方法2个,虚方法0个。因为staticFields和instanceFields都是0个,所以直接从directMethods来看了,methodIdx为0,也就是void Pino.<init>(),accessFlags的值为“81 80 04”,这个是uleb128编码的,转换为16进制的话就是10001h,对照一下DexFile.h文件,知道方法是ACC_PUBLIC和ACC_CONSTRUCTOR
以上是关于什么是dex文件的主要内容,如果未能解决你的问题,请参考以下文章