FSA全栈行动 FSA全栈行动
首页
  • 移动端文章

    • Android
    • iOS
    • Flutter
  • 学习笔记

    • 《Kotlin快速入门进阶》笔记
    • 《Flutter从入门到实战》笔记
    • 《Flutter复习》笔记
前端
后端
  • 学习笔记

    • 《深入浅出设计模式Java版》笔记
  • 逆向
  • 分类
  • 标签
  • 归档
  • LinXunFeng
  • GitLqr

公众号:FSA全栈行动

记录学习过程中的知识
首页
  • 移动端文章

    • Android
    • iOS
    • Flutter
  • 学习笔记

    • 《Kotlin快速入门进阶》笔记
    • 《Flutter从入门到实战》笔记
    • 《Flutter复习》笔记
前端
后端
  • 学习笔记

    • 《深入浅出设计模式Java版》笔记
  • 逆向
  • 分类
  • 标签
  • 归档
  • LinXunFeng
  • GitLqr
  • AndroidUI

  • Android第三方SDK

  • Android混淆

  • Android仓库

  • Android新闻

  • Android系统开发

  • Android源码

  • Android注解AOP

  • Android脚本

  • AndroidTv开发

  • AndroidNDK

  • Android音视频

  • Android热修复

    • 热修复与插件化基础 - dex与class
      • 一、dex/class 浅析
        • 1、class 与 dex 对比
        • 2、生成 class 与 dex 文件的指令
      • 二、class 文件结构深入
        • 1、class 文件结构:
        • 2、class 文件结构的详解:
        • 3、class 文件弊端:
      • 二、dex 文件结构深入
        • 1、dex 文件结构:
        • 2、dex 文件结构的详解:
        • 3、dex 头文件
        • 4、dex 文件的优势
      • 三、dex 与 class 两者的异同
      • 四、其他
        • 1、配置 Android 及 dx 环境变量
    • 热修复与插件化基础 - Java与Android虚拟机
    • 热修复与插件化基础 - Java与Android的类加载器
    • 热修复 - 深入浅出原理与实现
    • 热修复 - Tinker的集成与使用
    • 热修复 - Bugly让热修复变得如此简单
    • 热修复 - Tinker多渠道加固配置
  • Android性能优化

  • Android云游戏

  • Android插件化

  • iOSUI

  • iOS工具

  • iOS底层原理与应用

  • iOS组件化

  • iOS音视频

  • iOS疑难杂症

  • iOS之Swift

  • iOS之RxSwift

  • iOS开源项目

  • iOS逆向

  • Flutter开发

  • 移动端
  • Android热修复
GitLqr
2018-05-13
目录

热修复与插件化基础 - dex与class

欢迎关注微信公众号:[FSA全栈行动 👋]

# 一、dex/class 浅析

# 1、class 与 dex 对比

类型 class 文件 dex 文件
定义 能够被 jvm 识别、加载并执行的文件格式 能够被 dvm 识别、加载并执行的文件格式
如何生成 使用 java 命令(javac) 使用 java 命令、dx 命令
作用 记录一个类文件的所有信息 记录整个工程中所有类文件的信息

# 2、生成 class 与 dex 文件的指令

生成并运行 class 文件对于我们而言实在太熟悉了,这里只演示 dex 文件的生成与运行。

以 Hello World 为例:

public class Hello {
    public static void main(String[] args){
        System.out.println("Hello LQR!");
    }
}

# 1)生成 dex 文件

生成 dex 文件需要用到 dx 指令,与 java 指令一样,也是对应一个对应的程序来执行的,最好配置到环境变量中,具体可看文章末尾。

生成 dex 文件之前需要先生成 class 文件,所需指令如下:

javac -target 1.6 -source 1.6 Hello.java
dx --dex -- output Hello.dex Hello.class

# 2)运行 dex 文件

class 文件的运行需要依赖 jvm,同理,dex 文件的运行需要依赖 dvm,所以 dex 文件需要在 Android 上才能运行。所需指令如下:

adb push Hello.dex /storage/emulated/0
adb shell
dalvikvm -cp /sdcard/Hello.dex Hello

使用 adb 将 dex 文件放送到 Android 手机的 SD 卡目录之后,再使用 adb 进入 shell,运行 dvm 指令即可。

# 二、class 文件结构深入

# 1、class 文件结构:

  • 一种 8 位字节的二进制流文件
  • 各个数据按顺序紧密的排列,无间隙
  • 每个类或接口都单独占据一个 class 文件

# 2、class 文件结构的详解:

一个 class 文件,包含下面表格的所有字段,

类型 名称 数量 说明
u4 magic 1 魔数,0xCAFEBAB
u2 minor_version 1 次版本号
u2 major_version 1 主版本号
u2 constant_pool_count 1 常量池中常量个数
cp_info constant_pool constant_pool_count-1 表类型数据集合,即常量池中每一项常量都是一个表,共有 11 种结构各不相同的表结构数据
u2 access_flags 1 访问标志,用于识别类或接口层次的访问信息
u2 this_class 1 类索引,用于确定这个类的全限定名
u2 super_class 1 父类索引,用于确定这个类父类的全限定名
u2 interfaces_count 1 接口索引计数器
u2 interfaces interfaces_count 接口索引集合,用来描述这个类实现了哪些接口
u2 fields_count 1 字段表计数器,即字段表集合中的字段表数据个数
field_info fields fields_count 字段表集合,用于描述接口或类中声明的变量,包括类级别(static)和实例级别变量,不包括在方法内部声明的变量
u2 methods_count 1 方法表计数器,即方法表集合中的方法表数据个数
method_info methods methods_count 方法表集合,方法表结构和字段表结构一样
u2 attributes_count 1 属性订数器
attribute_info attributes attributes_count 在 Class 文件、属性表、方法表中都可以包含自己的属性表集合,用于描述某些场景的专有信息

1,无符号数,以 u1、u2、u4、u8 分别代表 1 个字节、2 个字节、4 个字节、8 个字节的无符号数 2,表,以“_info”结尾,由多个无符号数或其它表构成的复合数据类型

源自:JVM 笔记 5:Class 文件结构 (opens new window)

# 3、class 文件弊端:

由 class 文件结构(第 3 点)所导致

  • 内存占用大,不适合移动端
  • 堆栈的加载模式,加载速度慢
  • 文件 IO 操作多,类查找慢

基于以上几个 class 文件的特点,又因为移动端运存较小(以当年的移动端手机为标准),class 并不适合直接在移动端设备上运行。

# 二、dex 文件结构深入

# 1、dex 文件结构:

  • 一种 8 位字节的二进制流文件
  • 各个数据按顺序紧密的排列,无间隙
  • 整个应用中所有 java 源文件都放在一个 dex 中

# 2、dex 文件结构的详解:

dex 文件与 class 文件的结构有很大的不同,如下图所示:

对应的字段说明如下表所示:

数据名称 解释
header dex 文件头部,记录整个 dex 文件的相关属性
string_ids 字符串数据索引,记录了每个字符串在数据区的偏移量
type_ids 类似数据索引,记录了每个类型的字符串索引
proto_ids 原型数据索引,记录了方法声明的字符串,返回类型字符串,参数列表
field_ids 字段数据索引,记录了所属类,类型以及方法名
method_ids 类方法索引,记录方法所属类名,方法声明以及方法名等信息
class_defs 类定义数据索引,记录指定类各类信息,包括接口,超类,类数据偏移量
data 数据区,保存了各个类的真实数据
link_data 连接数据区

# 3、dex 头文件

下面是 dex 头文件中字段详解,与 class 文件的结构有部分相同的地方,但因为一个 dex 文件中包含 n 个 class 文件,在头文件中需要对所有 class 进行标记及记录相关信息,故会多出一些不同的字段。

字段名称 偏移值 长度 说明
magic 0x0 8 魔数字段,值为"dex\n035\0"
checksum 0x8 4 校验码
signature 0xc 20 sha-1 签名
file_size 0x20 4 dex 文件总长度
header_size 0x24 4 文件头长度,009 版本=0x5c,035 版本=0x70
endian_tag 0x28 4 标示字节顺序的常量
link_size 0x2c 4 链接段的大小,如果为 0 就是静态链接
link_off 0x30 4 链接段的开始位置
map_off 0x34 4 map 数据基址
string_ids_size 0x38 4 字符串列表中字符串个数
string_ids_off 0x3c 4 字符串列表基址
type_ids_size 0x40 4 类列表里的类型个数
type_ids_off 0x44 4 类列表基址
proto_ids_size 0x48 4 原型列表里面的原型个数
proto_ids_off 0x4c 4 原型列表基址
field_ids_size 0x50 4 字段个数
field_ids_off 0x54 4 字段列表基址
method_ids_size 0x58 4 方法个数
method_ids_off 0x5c 4 方法列表基址
class_defs_size 0x60 4 类定义标中类的个数
class_defs_off 0x64 4 类定义列表基址
data_size 0x68 4 数据段的大小,必须 4k 对齐
data_off 0x6c 4 数据段基址

源自:Dex 文件格式详解 (opens new window)

对于 class 文件及 dex 文件的结构 都可以使用 “010 editor” 这个神器进行查看验证,网上也有相关的文章说明,有兴趣的道友可自行百度 或 访问如下 2 篇文章进行查阅了解,这里便不再啰嗦:

  • JVM 笔记 5:Class 文件结构 (opens new window)
  • Dex 文件格式详解 (opens new window)

# 4、dex 文件的优势

dex 文件的头文件与索引区部分,保存了所有类及类中数据的索引,因此,dvm 可通过这两部分快速查找到对应类及数据,相对于直接运行 class 文件而言,效率上提升了不少。

# 三、dex 与 class 两者的异同

经过上面对 class 文件与 dex 文件的结构进行大概的了解之后,我们可以得出如下几个结论:

  • 本质上都是一样的,dex 是从 class 文件演变而来的。
  • class 文件存在许多冗余信息,dex 文件会去除冗余,并整合。

# 四、其他

# 1、配置 Android 及 dx 环境变量

以 mac 为例,windows 请百度。

  1. 到用户目录下:
cd ~
  1. 打开.bash_profile 文件
open -e .bash_profile

如果当前用户目录下没有.bash_profile,可以使用 touch .bash_profile 自行创建

export ANDROID_HOME=/Users/lqr/Library/Android/sdk
export PATH=${PATH}:${ANDROID_HOME}/tools
export PATH=${PATH}:${ANDROID_HOME}/platform-tools
export PATH=${PATH}:${ANDROID_HOME}/build-tools/27.0.3

ANDROID_HOME 与 build-tools 的值需要根据电脑的情况修改。

  1. 配置生效
source .bash_profile
  1. 测试

在终端输入 adb 或 dx 命令看是否有命令反应即可。

#热修复#虚拟机#dex#class
Android音视频 - MediaCodec编码mp4踩坑记录
热修复与插件化基础 - Java与Android虚拟机

← Android音视频 - MediaCodec编码mp4踩坑记录 热修复与插件化基础 - Java与Android虚拟机→

最近更新
01
Flutter - Xcode16 还原编译速度
04-05
02
AI - 免费的 Cursor 平替方案
03-30
03
Android - 2025年安卓真的闭源了吗
03-28
更多文章>
Theme by Vdoing | Copyright © 2020-2025 FSA全栈行动
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×