非小号动态

非小号appdex文件格式介绍

新闻 2025-06-07 07:43

  )是Android平台源代码文件(java,kotlin)经过编译、重构、重排、压缩、混淆后的字节码文件,是对传统的class 文件再处理。dex 更适合于资源有限的嵌入式设备使用,和class 文件比,dex 明显的优势主要表现在下面两个方面

  1)体积更小,dex 在class的基础上,将多个class 文件特征进行统一处理,通过重排,压缩,和class 文件比,体积明显变小

  IO 量明显减少,dex 将大量class文件整合成一个文件,在程序执行的过程中可以一次载入,避免多次小文件的IO 读取。

  dex 文件是通过d8(在 28.0.1之前为dx)命令将class 文件进行处理后生成的文件。

  --classpath 编译项目的DEX 文件时可能需要使用的类路径资源

  Leb128(Little-Endian Base 128),u 表示unsigned ,s表示signed ,p1 是dalvik 独有的编码格式(后面说明),是一种变长的整数压缩编码形式,通常有1-5byte组成,由于一个int 值在机器中占有4Byte。为了实现变长存储,节省空间,在Leb128 格式中每个byte 的最高位作为后续byte 是否有效的标志位,1表示还有后续字节,0表示结束,后面7bits是有效数据,所以一个整数最大需要5byte 存储。

  将无符号整数写成二进制形式,从低位到高位每7个bits作为一个整体组合成一个组,最高字节不足7bit 用0 填充到7bit,在每组最高位填入是否有高字节的标识,构成一个完整的字节,然后将所有字节小端序排列。

  sleb128 格式和uleb 128 格式类似,正数的处理和uleb128 完全一致,负数在机器中通过补码标识,若某一byte 第7位和前面的高位都为1 时则停止:

  是uleb128 的一种变体,为了能标识-1 和非负数而设计,则相同编码表示的值uleb128 比uleb128p1 大1,如下例:

  为了更方便的分析dex 文件格式,建议安装010 Editor,可以下载试用版本。

  通过对struct Header 结构体进行分析,该结构体的占用内存大小为112byte。GetVersion函数占用内存不计算在内。下面详细分析各字段:

  annotations_off_描述从文件开头到该类所包含注解列表的偏移量

  从类列表的解析看,DexDemo 类关联数据段在该文件中的偏移为02D5h:

  从类列表的解析看,DexDemo 静态数据段在该文件中的偏移为02E9h:

  从Header 的map_off_的字段可以得出,map_list从02f0h 开始,该列表是对文件中所有分类的信息概览,

  在指令格式文档中,列出了所有用到的指令类型。bytecode 格式文档中定义了每个指令的详细格式,

  从两个文档分析,第一条占用4个字节,即6201 01 00;其中op:62,VAA:01, 01;

  dexdump 是用于解析dex 文件的工具,通过文本的方式展示了dex 文件中的文件头、类信息、field信息、method信息、指令信息、注解信息、等。

  这里特别提一下-d 参数,该参数除了会列出dex 的基本结构外还对方法中bytecode所对应的指令详情进行了说明,为进一步分析代码的执行逻辑提供便利。

  Dex 文件格式作为art 虚拟机的执行码载体,与class 字节码相比在嵌入式设备中有着明显的优势,其包含的信息量很大,本文只从DexDemo 简单的实例对各部分做了分析,在实际项目中的情况会更加复杂。但通过该文档的学习,可以了解dex 的整个结构,对关键的header,类,方法,field等的组织形式有清晰的认识,对art 虚拟机代码的学习有极大的帮助。

上一篇:权志龙方否认与Sana恋情辟谣原因曝光粉丝心疼哥

下一篇:保姆级教程怎样使用去中心化交易所(DEX)

猜你喜欢