目录
一、热修复
热修复的使用:
目前市场上流行的两种方案,阿里系的和腾讯系的
热修复解决的问题:
- 刚发布的应用就发现了比较严重的bug
- 有一些小的功能想即时地推送给用户去使用
二、插件化
插件化的使用:
比较有代表性有三家:
美团、淘宝和酷狗,其中美团和淘宝使用的是自己的方案,酷狗使用的是一个开源方案。
插件化解决的问题:
- 解决应用越来越大所带来的各种技术限制,比如:方法数超过了65535的限制
- 解决应用越来越大带来的合作开发问题
三、class文件详解
什么是class文件
能够被JVM识别,加载并执行的文件格式
如何生成一个class文件
- 通过IDE自动帮我们build
- 手动通过javac(java compile Java编译)去生成class文件
- 通过java命令执行class文件
class文件的作用
记录一个类文件的所有信息
class文件格式详解
- 一种8位字节的二进制流文件
- 各个数据按顺序紧密的排列,无间隙
- 每个类或接口都单独占据一个class文件
ClassFile 结构体
每一个 Class 文件对应于一个如下所示的 ClassFile 结构体。
ClassFile 结构体中,各项的含义描述如下:
1,无符号数,以u1、u2、u4、u8分别代表1个字节、2个字节、4个字节、8个字节的无符号数
2,表是由多个无符号数或者其它表作为数据项构成的复合数据类型,所以表都以“_info”结尾,由多个无符号数或其它表构成的复合数据类型
每个部分出现的次数和数量见下表:
access_flags
访问标志,access_flags 是一种掩码标志,用于表示某个类或者接口的访问权限及基础属性。access_flags 的取值范围和相应含义见表 4.1 所示。
constant_pool[ ]
常量池,constant_pool 是一种表结构(这里需要列举一下表就会明白,这个在下面的例子中会有讲解这个结构,返回来在读就会明白),它包含 Class 文件结构及其子结构中引用的所有字符串常量、类或接口名、字段名和其它常量。常量池中的每一项都具备相同的格式特征——第一个字节作为类型标记用于识别该项是哪种类型的常量,称为“tagbyte”。常量池的索引范围是 1 至 constant_pool_count−1。
1常量池的项目类型
class文件弊端
- 内存占用大,不适合移动端
- 堆栈的加栈模式,加载速度慢
- 文件io操作多,类查找慢
四、dex文件详解
什么是dex文件
能够被DVM是被,加载并执行的文件格式
如何生成一个dex文件
- 通过IDE自动帮我们build
- 手动通过dx命令去生成dex文件
- 手动运行dex文件在手机上
dex文件的作用
记录整个工程中所有类文件的信息。
dex文件格式详解
- 一种8位字节的二进制流文件
- 各个数据按顺序紧密的排列,无间隙
- 整个应用中所有Java源文件都放在一个dex中
dex文件结构图:
dex文件头:
字段名称 | 偏移量 | 长度(byte) | 当前例子中字段值 | 字段描述 |
magic | 0x0 | 0x8 | dex 035 | dex魔术字, 固定信息: dex\n035 |
checksum | 0x8 | 0x4 | 0x0F828C9C | alder32算法, 去除了magic和checksum 字段之外的所有内容的校验码 |
signature | 0xc | 0x14 | 58339636BED8A6CC826E A09B77D5C3A620262CD | sha-1签名, 去除了magic、checksum和 signature字段之外的所有内容的签名 |
fileSize | 0x20 | 0x4 | 0x0000043C | 整个dex的文件大小 |
headerSize | 0x24 | 0x4 | 0x00000070 | 整个dex文件头的大小 (固定大小为0x70) |
endianTag | 0x28 | 0x4 | 0x12345678 | 字节序 (大尾方式、小尾方式) 默认为小尾方式 <--> 0x12345678 |
linkSize | 0x2c | 0x4 | 0x00000000 | 链接段的大小, 默认为0表示静态链接 |
linkOff | 0x30 | 0x4 | 0x00000000 | 链接段开始偏移 |
mapOff | 0x34 | 0x4 | 0x0000039C | map_item偏移 |
stringIdsSize | 0x38 | 0x4 | 0x00000019 | 字符串列表中的字符串个数 |
stringIdsOff | 0x3c | 0x4 | 0x00000070 | 字符串列表偏移 |
typeIdsSize | 0x40 | 0x4 | 0x00000009 | 类型列表中的类型个数 |
typeIdsOff | 0x44 | 0x4 | 0x000000D4 | 类型列表偏移 |
protoIdsSize | 0x48 | 0x4 | 0x00000006 | 方法声明列表中的个数 |
protoIdsOff | 0x4c | 0x4 | 0x000000F8 | 方法声明列表偏移 |
fieldIdsSize | 0x50 | 0x4 | 0x00000001 | 字段列表中的个数 |
fieldIdsOff | 0x54 | 0x4 | 0x00000140 | 字段列表偏移 |
methodIdsSize | 0x58 | 0x4 | 0x00000009 | 方法列表中的个数 |
methodIdsOff | 0x5c | 0x4 | 0x00000148 | 方法列表偏移 |
classDefsSize | 0x60 | 0x4 | 0x00000001 | 类定义列表中的个数 |
classDefsOff | 0x64 | 0x4 | 0x00000190 | 类定义列表偏移 |
dataSize | 0x68 | 0x4 | 0x0000028C | 数据段的大小, 4字节对齐 |
dataOff | 0x6c | 0x4 | 0x000001B0 | 数据段偏移 |
五、class文件和dex文件的异同:
- 本质上他们都是一样的,dex是从class文件演变而来的
- class文件存在许多冗余信息,dex会取出冗余,并整合
六、必知必会
- 如何生成class文件和dex文件
- class文件和dex文件结构组成
- dex与class相比它的优势