冥王生活

您现在的位置是:首页 > 科技生活 > 正文

科技生活

dex是什么文件(如何看懂dex文件)

admin2023-02-15科技生活110

什么是dex文件

dex文件是Android平台上可执行文件的类型。

对于Android DEX文件进行优化,需要注意的一点是DEX文件的结构是紧凑的,但是我们还是要想方设法的进行提高程序的运行速度,我们就仍然需要对DEX文件进行进一步优化。

调整所有字段的字节序(LITTLE_ENDIAN)和对齐结构中的每一个域 验证DEX文件中的所有类 对一些特定的类进行优化,对方法里的操作码进行优化 。优化后的文件大小会有所增加,应该是原Android DEX文件的1-4倍。 优化发生的时机有两个:对于预置应用,可以在系统编译后,生成优化文件,以ODEX结尾。

这样在发布时除APK文件(不包含DEX)以外,还有一个相应的Android DEX文件;对于非预置应用,包含在APK文件里的DEX文件会在运行时被优化,优化后的文件将被保存在缓存中。

每一个Android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制,内存分配和管理,Mutex等等都是依赖底层操作系统而实现的。

【理论知识】Dex文件结构分析

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

sd卡里面的dex文件是干什么用的?

这个是个隐藏文件

,在你使用的用户家目录下的

是csh

这个shell的配置文件,你对csh的更改都会记录在这个文件中,下次你再启动csh的时候会读取这个文件,在linux下有很多这种文件的

比如

.bash_profile

.vimrc

.gnomerc

dex重新划分有什么用

结构设计的作用。dex文件是Android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据,由于dex是一种针对嵌入式设备而特殊设计的java虚拟机,所以dex文件结构设计上有着本质的作用。

Android手机的apk文件中的class.dex文件是什么?是做什么用的呢?

简单说就是优化后的android版.exe。每个apk安装包里都有。相对于PC上的java虚拟机能运行.class;android上的Davlik虚拟机能运行.dex。

作用

让dalvik能够运行。

dex好处

可以直接用DexClassLoader类加载,动态加载。于是只要在dex上加壳,在程序运行时脱壳,就可以规避静态反编译的风险。

扩展资料

使用dex文件的原因

在Android系统中,一个App的所有代码都在一个Dex文件里面。Dex是一个类似Jar的包,存储了很多Java编译字节码的归档文件。

因为Android系统使用Dalvik虚拟机,所以需要把使用Java Compiler编译之后的class文件转换成Dalvik能够执行的class文件。

Android中什么是Dex文件

在明白什么是Dex文件之前,要先了解一下JVM,Dalvik和ART。JVM是JAVA虚拟机,使用运行JAVA字节码程序。Dalvik是Google设计的用于Android平台的运行时环境,适合移动环境ART即Android Runtime,是Google为了替换Dalvik设计的新Android运行时环境,在Android 4.4启动。ART比Dalvik的性能更好。Android程序一般使用Java语言开发,但是Dalvik虚拟机并不支持直接执行JAVA字节码,因此要进行编译生成的.class文件进行翻译,解释,压缩等处理,这个处理过程是由dx进行处理,处理完成后生成的生成会以.dex结尾,称为Dex文件。Dex文件格式是专为Dalvik设计的一种压缩格式。所以可以简单的理解为:Dex文件是很多.class文件处理后的纹理,最终可以在Android运行时环境中执行。

还可以看看下面这边文章,加深理解:

今天的分享结束了,再见~

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~