第二章 Android动态加载、热更新、热修复、插件化系列文章 之 认识class与dex
第二章 android 热修复系列文章 之 认识class与dex
目录
1. 前言
2. class文件结构
3. 3. class文件的弊端
4. dex文件结构
5. class和dex文件对比
1. 前言
android本身就是java的延伸,对比java开发技术我们很容易掌握android开发技术,整个编译流程也不例外
2. class文件结构
-什么是class文件
可以被jvm识别,加载并执行的文件格式
-class文件是如何生成
要求电脑安装jdk环境,并通过javac 命令编译生成的
-格式
-
一种8位字节的二进制流文件
-
各个数据按顺序紧密排列紧密的排列,无间隙
-
每个类或接口都单独占据一个class文件
> class 文件结构
每一个 class 文件的都记录这个类或接口的完整信息,并包含以下目录结构
对应描述
字段名称 | 作用 | 备注 |
---|---|---|
magic | 加密段,主要防止class字节码文件被篡改 | |
minor_version | 描述class 文件最小可以被哪个版本的jdk加载,即最小适配版本 | |
majar_version | 描述当前class文件是由jdk哪个版本变音产生的 | |
constant_pool_count | 内存中常量池的数量 | 通常数量下内存中常量池唯一 |
constant_pool | 内存中常量池 | 长度constant_pool_count-1 |
access_flag | 当前class文件作用域标识 | |
this_class | 当前类或接口 | |
super_class | 父类 | |
interfaces_count | 当前类直接继承的接口,间接继承不在这里统计 | |
interfaces | 当前类直接继承的接口,间接继承不在这里统计 | interfaces_count-1 |
fields_count | 标记当前class文件所有成员变量的数量 | |
fields | 标记当前class文件所有成员变量 | field_info是一个结构体,结构体里面包含了成员变量的name,所处的类以及他的类型 |
methods_connt | 记录class文件中所有的方法的数量 | |
methods | 记录class文件中所有的方法 | methods_connt-1 |
attribute_count | 记录当前class文件中所有其他的属性的数量 | |
attribute | 记录当前class文件中所有其他的属性 | attribute_count-1 |
其中access_flags
constant_pool中包含的内容(这里仅列举几种)
字段名称 | 作用 | 备注 |
---|---|---|
CONSTANT_Integer_info | 存储所有int类型的参数 | |
CONSTANT_Long_info | 存储所有long类型的参数 | |
CONSTANT_String_info | 存储所有String类型的参数 | |
CONSTANT_Class_info | 记录class文件中类的相关信息同时记录了应用类的信息 | |
CONSTANT_fieldref_info | 记录class文件中field的相关信息 | |
CONSTANT_Methodref_info | 记录class文件中method的相关信息 |
- 总结每一种基本数据结构都会有一种常量结构与之对应
3. class文件的弊端
- 每个class文件都会记录这个类加载搜需要的全部信息,冗余信息大,内存占用大不适合移动端
- 堆栈加载模式,加载速度慢
- 文件IO操作多,类加载慢(每个class只记录单个class的信息,需要加载的文件多)
4. dex文件结构
什么是dex文件
dex是Android平台上可执行文件的类型,是一种紧凑格式文件,记录整个工程(通常是一个Android工程)的所有类文件的信息。
如何生成一个dex文件
这个我在前面的博客中已经详细描述了,感兴趣的可以再看一下 Adroid ADB实现执行任意代码及完成apk上传安装
dex文件的作用
dex文件的作用是记录整个工程(通常是一个Android工程)的所有类文件的信息。
dex文件格式详解
需要注意的是:
-
文件头包含了dex文件的信息,所有数据的大致分布情况
-
索引区则是记录了字符串、类型、方法原型、作用域、方法的索引
-
数据区:分为普通数据区, 链接数据区
- 链接数据区:主要记录了引入so库的索引,这也是为什么apk在运行时会报错.so找不到
dex文件头信息的详细信息如下:
5. class和dex文件对比
-
本质上都是一样的,都是二进制流文件格式,dex文件是从class文件演变而来的
-
class文件存在冗余信息,dex文件则去掉了冗余,并且整合了整个工程的类信息。
为了更加清晰这里用图的方式来表现
更多相关文章
- Android 文件路径详解
- Android的APK包里的文件类型都是什么?
- 教你如何在 Android 使用多线程下载文件
- Android 文件操作详解及简单实例
- Android下 读写文件
- Android中经常用到的方法--SDcard下文件的操作
- Android 将被依赖的库项目打包成aar(非jar)文件
- android中实现多个apk文件
- Android 文件系统移植总结