一个好的热修复技术,将为你的App 助力百倍。本书将让你迅速拥有“驾着飞机修引擎”的能力!
1.热替换代码修复
2.冷启动代码修复
3.资源热修复技术
4.so库热修复技术
《深入探索Android热修复技术原理》系统介绍了 Android 热修复的核心技术原理,结合 Sophix 热修复开发实践过程,从代码修复、资源修复、so库修复三大方向进行了详细的技术剖析与解读。
通过《深入探索Android热修复技术原理》,读者会对 Android 热修复技术有更加深刻的认识,对于 Android 系统底层原理的理解和今后的开发工作都有很大帮助。通过阅读《深入探索Android热修复技术原理》,读者可以初步实现一个较为完善的热修复框架。
《深入探索Android热修复技术原理》适合对 Android 热修复技术感兴趣的技术人员阅读,也适合 Android进阶开发者参考。
2.3.6 switch case 语句编译
由于在实现资源修复方案热部署的过程中(第4 章将进行详解),要做新旧资源ID 的替换,我们竟然发现存在switch case 语句中的ID 不会被替换掉的情况,所以有必要来探索下switch case 语句编译的特殊性。
(1)switch case 语句编译规则
public void testContinue() {
int temp = 2;
int result = 0;
switch (temp) {
case 1:
result = 1;
break;
case 3:
result = 3;
break;
case 5:
result = 5;
break;
}
}
public void testNotContinue() {
int temp = 2;
int result = 0;
switch (temp) {
case 1:
result = 1;
break;
case 3:
result = 3;
break;
case 10:
result = 10;
}
}
看下testContinue/testNotContinue 方法编译出来有何不同。
# virtual methods
.method public testContinue()V
const/4 v1, 0x2
.local v1, "temp":I
const/4 v0, 0x0
.local v0, "result":I
packed-switch v1, :pswitch_data_0
:pswitch_0
return-void
:pswitch_1
const/4 v0, 0x1
:pswitch_2
const/4 v0, 0x3
:pswitch_3
const/4 v0, 0x5
:pswitch_data_0
.packed-switch 0x1
:pswitch_1
:pswitch_0
:pswitch_2
:pswitch_0
:pswitch_3
.end packed-switch
.end method
.method public testNotContinue()V
const/4 v1, 0x2
.local v1, "temp":I
const/4 v0, 0x0
.local v0, "result":I
sparse-switch v1, :sswitch_data_0
:sswitch_0
const/4 v0, 0x1
:sswitch_1
const/4 v0, 0x3
:sswitch_2
const/16 v0, 0xa
:sswitch_data_0
.sparse-switch
0x1 -> :sswitch_0
0x3 -> :sswitch_1
0xa -> :sswitch_2
.end sparse-switch
.end method
testContinue 方法的switch case 语句被编译成packed-switch 指令,testNotContinue 方法的switch case 语句被编译成sparse-switch 指令。比较两者间的差异,testContinue 的switch 语句的case 项是连续的几个比较相近的值1、3、5。所以被编译为packed-switch 指令,可以看到几个连续的数中间的差值用:pswitch_0 补齐,:pswitch_0 标签处直接return-void。testNotContinue的switch 语句的case 项分别是1、3、10, 很明显不够连续, 所以被编译为sparse-switch 指令。编译器会决定怎样的值才算是连续的case。
(2)热部署解决方案
一个资源ID 肯定是const final static 变量,此时恰好switch case 语句被编译成packed-switch 指令,所以这个时候如果不做任何处理就会存在资源ID替换不完全的情况。解决这种情况方案其实很简单,修改smali 反编译流程,碰到packed-switch 指令强转为sparse-switch 指令,:pswitch_N 等相关标签指令也需要强转为:sswitch_N 指令。然后做资源ID 的暴力替换,然后再回编译smali 为dex。再做类方法变更的检测,所以就需要经过反编译 → 资源 ID替换 → 回编译的过程,这也会使打补丁变得稍慢一些。
第1 章 热修复技术介绍 01
1.1 什么是热修复 02
1.2 基本概念 03
1.3 技术积淀 06
1.4 技术概览 08
1.5 本章小结 14
第2 章 热替换代码修复 15
2.1 底层热替换原理 16
2.2 突破底层差异的方法 25
2.3 编译期与语言特性的影响 36
2.4 本章小结 75
第3 章 冷启动代码修复 77
3.1 冷启动类加载原理 78
3.2 多态对冷启动类加载的影响 91
3.3 Dalvik 下完整dex 方案的新探索 99
3.4 入口类与初始化时机的选择 110
3.5 本章小结 119
第4 章 资源热修复技术 121
4.1 普遍的实现方式 122
4.2 资源文件的格式 128
4.3 运行时资源的解析 130
4.4 另辟蹊径的资源修复方案 134
4.5 更优雅地替换AssetManager 139
4.6 一个意料之外的资源问题 143
4.7 本章小结 158
第5 章 so 库热修复技术 159
5.1 so 库加载原理 160
5.2 so 库热部署实时生效的可行性分析 162
5.3 so 库冷部署重启生效实现方案 169
5.4 如何正确复制补丁so 库 173
5.5 本章小结 174
第6 章 其他优秀的热修复方案 175
6.1 Dexposed 浅析 176
6.2 AndFix 探索历程 185
6.3 Amigo 核心解读 193
6.4 腾讯系热修复方案简介 202
第7 章 热修复技术的未来展望 209
7.1 热修复的专业性 210
7.2 对Android 生态的影响 211
7.3 Android 与iOS 热修复的不同 212
7.4 未来,无限可能 213
附录A Sophix 方案比较 215
A.1 Sophix 方案纵向比较 216
A.2 Sophix 方案横向比较 217
温馨提示:请使用宁波大学园区图书馆的读者帐号和密码进行登录
2014 年至今,手机淘宝带领了业界 Android 系统组件化和热修复技术的风潮,后来者 Instant App 或多或少地也受到了国内技术的影响。今天看到团队成员将热修复技术认真系统地整理成书,非常欣喜。在这本书中,既能看到对热修复技术发展历史系统深入的总结,又能看到国内程序员在 Android 系统级技术持续突破上做出的不懈努力,更可以看到国内程序员坚持打造优秀专业移动技术产品的雄心壮志!
吴志华(天施)
——手机淘宝基础平台部负责人,阿里巴巴资深技术专家
业内少有的深度讲解Android系统热修复技术的书籍,对于原理、代码讲解得非常清晰和深入,值得Android工程师研读。
倪生华(玄黎)
——手机淘宝基础架构团队负责人,阿里巴巴资深技术专家
应用热修复是一项略带神秘而又颇具争议的技术,但是它的确赋予了应用开发者“驾着飞机修引擎”的能力。本书从Android系统应用热修复技术的原理及代码实现、多种方案进行比较的角度,系统地阐述了Android平台的应用热修复技术。对Android系统应用热修复技术有好奇心的技术人员,这本专题书不容错过。
潘爱民
—计算机技术领域作家,阿里巴巴飞猪事业部首席架构师
2015 年阿里无线在业界首次推出 Android 热修复技术 Dex posed,该技术为 Android 底层技术服务于业务痛点需求指明了一个崭新的方向,掀起了业界百花齐放的探索热潮。Sophix 的发布让我们再次看到了阿里无线在这个技术领域的自我迭代和锐意创新。这是一个技术改变格局的时代,同时也是一个能人辈出的时代!
冯森林
——安卓绿色联盟发起人,手机淘宝前架构师