描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787121343896丛书名: 阿里技术丛书系列
一个好的热修复技术,将为你的App 助力百倍。本书将让你迅速拥有“驾着飞机修引擎”的能力!
1.热替换代码修复
2.冷启动代码修复
3.资源热修复技术
4.so库热修复技术
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
热修复技术,可以看作 Android平台发展成熟至一定阶段的必然产物。随着移动端业务复杂程度的增加,传统的版本更新流程显然无法满足业务和开发者的需求,热修复技术的推出在很大程度上改善了这一局面。热修复技术近年来的飞速发展,尤其是在 InstantRun方案推出后,各种热修复技术百花齐放,国内大部分成熟的主流 App都拥有自己的热更新技术,像手淘、支付宝、微信、QQ、饿了么、美团等。可以说,一个好的热修复技术,将为你的 App助力百倍。对于每一个想在 Android开发领域有所造诣的开发者,掌握热修复技术更是的素质。
虽然方案很多,但是深入系统地讲解热修复技术细节的书籍基本没有,市场上国内外的各种 Android书籍大部分只是泛泛地囊括Android开发的基础知识,基本都没有包含热修复技术的章节,多只是一笔带过。即使有很多开源的热修复方案,要自己硬啃代码还是要花费不少时间和精力。如果只有开源代码就足够的话,为什么还需要这么多技术书籍和文档呢?与其看一个晦涩难懂的项目,不如找一本专业翔实的书,这将会帮助你更系统、全面地理解这项技术涉及的难点与关键点。
出于回馈业界的考虑,我们把阿里移动热修复方案 Sophix开发过程中的技术细节进行了整理归纳,在 2017年 6月发布了《深入探索 Android热修复技术原理》一书的免费电子版,与广大Android开发者进行了分享。
电子版发布以后得到了很好的反响,广大开发者下载如潮,很多读者希望我们能够推出纸质版,来进行更加方便的研读。基于这个呼吁,我们对电子版内容做了认真的整理和校对,对全书内容进行了全面的充实,特此推出这本《深入探索 Android热修复技术原理》。
本书结合了这半年来我们的一些新的探索和思考,特别是对资源修复和冷启动修复技术进行了一些扩充。并新增了一章,全面介绍了其他热修复技术方案,其中特别邀请了 Andfix的作者黎三平(董炼师)与 Amigo的作者曹玉斌(夜沧),来专门为这两大优秀的热修复方案撰写相关章节,里面包含了两位作者分别在支付宝和饿了么的工程开发实践中,对于热修复技术的实际思考和研究,相信读者一定会获益不少。
本书结构
本书各章节是以热修复所涉及的各个技术点进行编排的,结构分明、循序渐进。推荐以章节顺序进行阅读,当然如果对某些方面感兴趣,也可进行跳读。对于日常工作中遇到的问题,也可以通过阅读本书来寻求答案。
第 1章 热修复技术介绍
热修复技术的演进与技术发展,Sophix方案的简介。
第 2章 热替换代码修复
详细解析了底层替换热修复的实现原理。
第 3章 冷启动代码修复
对冷启动修复技术进行了深入的剖析。
第 4章 资源热修复技术
资源修复的技术细节与思考。
第 5章 so库热修复技术
so库修复的探索与实践。
第 6章 其他优秀的热修复方案
介绍了 Android平台上涌现的其他优秀热修复技术方案。
第 7章 热修复技术的未来展望
对于热修复技术未来的畅想与期盼。
你将得到什么
读完本书,你将会对 Android热修复技术有更加深刻的认识,不仅能提高工作效率,而且可加深对系统底层原理的理解,给日常的 Android开发工作带来很大帮助。并且,目前热修复原理还是很多高级 Android技术岗位的面试常客,对付它们你也将得心应手。你还可以通过本书的知识自己初步实现一个较为完善的热修复框架,当然,想直接使用可以访问阿里移动热修复 Sophix官方地址 ①,马上就能够拥有安全可靠的全方位热修复功能。
致谢
Sophix的推出与本书的发行是阿里巴巴许多开发者共同努力的成果,集团技术发展部对于本书的出版提供了极大的支持。
在这里首先要感谢团队领导所为,还有其他共同为 Sophix的研发和推广做出贡献的悟二、查郁、泽胤、潇衍、荻朵,以及之前在百川项目里共同参与热修复项目开发的其他手机淘宝开发者。还要特别感谢阿里云事业部的同学们的合作,是你们提供了强有力的技术支持并不断开拓新市场。
对于本人而言,我还要对前东家小米科技 MIUI部门的各位朋友和前同事表示诚挚的谢意。我个人的技术成长离不开你们曾经的帮助。
甘晓霖
淘宝(中国)软件有限公司
2014 年至今,手机淘宝带领了业界 Android 系统组件化和热修复技术的风潮,后来者 Instant App 或多或少地也受到了国内技术的影响。今天看到团队成员将热修复技术认真系统地整理成书,非常欣喜。在这本书中,既能看到对热修复技术发展历史系统深入的总结,又能看到国内程序员在 Android 系统级技术持续突破上做出的不懈努力,更可以看到国内程序员坚持打造优秀专业移动技术产品的雄心壮志!
吴志华(天施)
——手机淘宝基础平台部负责人,阿里巴巴资深技术专家
业内少有的深度讲解Android系统热修复技术的书籍,对于原理、代码讲解得非常清晰和深入,值得Android工程师研读。
倪生华(玄黎)
——手机淘宝基础架构团队负责人,阿里巴巴资深技术专家
应用热修复是一项略带神秘而又颇具争议的技术,但是它的确赋予了应用开发者“驾着飞机修引擎”的能力。本书从Android系统应用热修复技术的原理及代码实现、多种方案进行比较的角度,系统地阐述了Android平台的应用热修复技术。对Android系统应用热修复技术有好奇心的技术人员,这本专题书不容错过。
潘爱民
—计算机技术领域作家,阿里巴巴飞猪事业部首席架构师
2015 年阿里无线在业界首次推出 Android 热修复技术 Dex posed,该技术为 Android 底层技术服务于业务痛点需求指明了一个崭新的方向,掀起了业界百花齐放的探索热潮。Sophix 的发布让我们再次看到了阿里无线在这个技术领域的自我迭代和锐意创新。这是一个技术改变格局的时代,同时也是一个能人辈出的时代!
冯森林
——安卓绿色联盟发起人,手机淘宝前架构师
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替换 → 回编译的过程,这也会使打补丁变得稍慢一些。
评论
还没有评论。