非小号appdex文件格式介绍
)是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 虚拟机代码的学习有极大的帮助。
猜你喜欢
- 05-26非小号美主权基金计划暂停XBIT去
- 05-22非小号氧化铝主力合约直线%
- 12-13非小号四川天奥空天信息技术申
- 05-28非小号BTS杀入机器人与无人机赛
- 05-27非小号“上海天然橡胶期货”合
- 05-15非小号Web3Caff 每日精选:融资项
- 05-10非小号Pump后时代:一文盘点七大
- 06-02非小号曝尤文拟续约伊尔迪兹至
- 12-07非小号北信源取得一种基于可信