热修复学习一:class文件和dex文件

目录

一、热修复

热修复的使用:

热修复解决的问题:

二、插件化

插件化的使用:

插件化解决的问题:

三、class文件详解

什么是class文件

如何生成一个class文件

class文件的作用

class文件格式详解

ClassFile 结构体

access_flags

constant_pool[ ]

class文件弊端

四、dex文件详解

什么是dex文件

如何生成一个dex文件

dex文件的作用

dex文件格式详解

dex文件头:

 五、class文件和dex文件的异同:

六、必知必会


一、热修复

热修复的使用:

目前市场上流行的两种方案,阿里系的和腾讯系的

热修复解决的问题:

  • 刚发布的应用就发现了比较严重的bug
  • 有一些小的功能想即时地推送给用户去使用

二、插件化

插件化的使用:

比较有代表性有三家:
美团、淘宝和酷狗,其中美团和淘宝使用的是自己的方案,酷狗使用的是一个开源方案。

插件化解决的问题:

  • 解决应用越来越大所带来的各种技术限制,比如:方法数超过了65535的限制
  • 解决应用越来越大带来的合作开发问题

三、class文件详解

什么是class文件

能够被JVM识别,加载并执行的文件格式

如何生成一个class文件

  • 通过IDE自动帮我们build
  • 手动通过javac(java compile Java编译)去生成class文件
  • 通过java命令执行class文件

class文件的作用

记录一个类文件的所有信息

class文件格式详解

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

jdk源码解析(六)——类(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中

Android Dex文件格式(一)

dex文件结构图:

dex文件头:

字段名称偏移量长度(byte)当前例子中字段值字段描述
magic0x00x8dex 035dex魔术字, 固定信息: dex\n035
checksum0x80x40x0F828C9Calder32算法, 去除了magic和checksum
字段之外的所有内容的校验码
signature0xc0x1458339636BED8A6CC826E
A09B77D5C3A620262CD
sha-1签名, 去除了magic、checksum和
signature字段之外的所有内容的签名
fileSize0x200x40x0000043C整个dex的文件大小
headerSize0x240x40x00000070整个dex文件头的大小 (固定大小为0x70)
endianTag0x280x40x12345678字节序 (大尾方式、小尾方式)
默认为小尾方式 <--> 0x12345678
linkSize0x2c0x40x00000000链接段的大小, 默认为0表示静态链接
linkOff0x300x40x00000000链接段开始偏移
mapOff0x340x40x0000039Cmap_item偏移
stringIdsSize0x380x40x00000019字符串列表中的字符串个数
stringIdsOff0x3c0x40x00000070字符串列表偏移
typeIdsSize0x400x40x00000009类型列表中的类型个数
typeIdsOff0x440x40x000000D4类型列表偏移
protoIdsSize0x480x40x00000006方法声明列表中的个数
protoIdsOff0x4c0x40x000000F8方法声明列表偏移
fieldIdsSize0x500x40x00000001字段列表中的个数
fieldIdsOff0x540x40x00000140字段列表偏移
methodIdsSize0x580x40x00000009方法列表中的个数
methodIdsOff0x5c0x40x00000148方法列表偏移
classDefsSize0x600x40x00000001类定义列表中的个数
classDefsOff0x640x40x00000190类定义列表偏移
dataSize0x680x40x0000028C数据段的大小, 4字节对齐
dataOff0x6c0x40x000001B0数据段偏移

 五、class文件和dex文件的异同:

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

六、必知必会

  • 如何生成class文件和dex文件
  • class文件和dex文件结构组成
  • dex与class相比它的优势 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值