首页>参考读物>计算机科学与技术>计算机网络

Android插件化开发指南
作者 : 包建强 著
丛书名 : 移动开发
出版日期 : 2018-08-03
ISBN : 978-7-111-60336-8
定价 : 79.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 351
开本 : 16
原书名 :
原出版社:
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

本书详细介绍了插件化技术的原理、各种方案,及其在Android App中的使用方法。本书在介绍插件化技术的同时,还详细介绍了Android 系统的底层知识,有助于App开发人员深入理解Android系统,从而写出更健壮的代码。
全书分为三大部分,共22章。第1部分“预备知识”包括第1~5章,是进行Android插件化编程的准备知识,先介绍Android插件化技术的历史和现状,系统介绍了Android的底层知识以及反射、代理等技术。第2部分“解决方案”包括第6~16章,详细介绍并分析了插件化编程的各种解决方案,以及一些插件化框架的实现原理,如that、Zeus等。第3部分“相关技术”包括第17~21章,介绍插件化编程的周边技术,包括降级、混淆、增量更新等,并对纷繁复杂的插件化技术进行了总结。

图书特色

Android 插件化技术的集大成之作。
以浅显易懂的图文讲解Android系统的底层知识,详细介绍DroidPlugin、DL、Small、Zeus框架的设计思想和代码实现,探究插件混淆、so插件化、HTML 5降级等诸多被遗忘的角落。

图书前言

这是一本什么书
如果只把本书当作纯粹介绍Android插件化技术的书那就错了。本书在研究Android插件化之余,还详细介绍了Android系统的底层知识,包括Binder和AIDL的原理、四大组件的原理、App的安装和启动流程、Context和ClassLoader的家族史。没有罗列大量的Android系统中的源码,而是以一张张UML图把这些知识串起来。
本书详细介绍了Android中的资源机制,包括aapt命令的原理、resource文件的组成以及public.xml的使用方式,顺带还提及了如何自定义一个Gradle插件化。
此外,本书还介绍了so的加载原理,尤其是动态加载so的技术,可以帮助App进行瘦身;探讨了HTML5降级技术,可以实现任何一个原生页面和HTML5页面的互换;介绍了反射技术,以及jOOR这个有趣的开源框架;介绍了Android中的动态代理技术Proxy.newProxyInstance方法。
如果读者能坚持把这本书从头到尾读完,那么不仅掌握了插件化技术,而且也把上述所有这些知识点全都系统地学习了一遍。也许Android插件化会随着Google的限制而有所变化甚至消亡,但我在本书中介绍的其他知识,仍然是大有用武之处的。
如何面对Android P的限制
写作这本书的时候,Google推出了Android P preview的操作系统,会限制对@hide api的反射调用。目前会通过log发出警告,用户代码仍然能够获取到正确的Method或Field,在后续版本中获取到的Method或Field极有可能为空。
但是道高一尺,魔高一丈。Google对这次限制,很快就被技术极客们绕过去了,有两种解决方法:
1)把通过反射调用的系统内部类改为直接调用。具体操作办法是,在Android项目中新建一个库,把要反射的类的方法和字段复制一份到这个库中,App对这个库的引用关系设置为provided。那么我们就可以在App中直接调用这个类和方法,同时,在编译的时候,又不会把这些类包含到apk中。
其实早在2015年,hoxkx就在他的插件化框架中实现了这种技术。但是这种解决方案,仅限于Android系统中标记为public的方法和字段,对于protected和private就无能为力了。比如AssetsManager的addAssetPath方法,ActivityThread的currentActivityThread方法。
2)类的每个方法和字段都有一个标记,表明它是不是hide类型的。我们只要在jni层,把这个标记改为不是hide的,就可以绕过检查了。
然而,魔高一丈,道高一丈二。Google在Android P的正式版中势必会推出更严厉的限制方案,到时候,又会有新的解决方案面世,让我们拭目以待。
其实,开发者是无意和Google进行技术对抗的,这是毫无意义的。泛滥成灾的修改导致了App大量的崩溃,Google实在看不下去了,所以才搞出这套限制方案;另一方面,插件化技术是刚需,尤其在中国的互联网行业,App崩溃会直接影响使用,很可能导致经济损失,所以开发者才会不惜一切代价走插件化这条路。
再回到限制方案来,Google也不是清一色不要开发者使用系统底层的标记为hide的API,而是推出了一组黑灰名单,如下所示:
名  单 影  响
light-greylist 浅灰名单 仅打印警告日志,Google尽可能在未来版本提供 public API
dark-greylist 深灰名单 第三方App不能访问,开发者可以申请把这份清单中的某些API加入到浅灰名单
blacklist 黑名单 第三方App不能访问
所以,另一种应对策略是,在插件化中使用浅灰名单中的API,比如说ActivityThread的currentActivityThread方法。
Google的这组清单还在持续调整中,据我所知,给各大手机厂商的清单与其在社区中发布的清单略有出入。在Android P的正式版本中,这份清单会最终确定下来。所以现在中国的各个插件化框架的开发人员,都在等Android P的正式版本发布后再制定相应的策略。留给中国队的时间不多了。
这本书的来龙去脉
这是一本酝酿了3年的书。
早在2015年Android插件化技术百家争鸣时,我就看好这个技术,想写一本书介绍这个技术,但当时的积累还不够。那年,我在一场技术大会上发表了《Android插件化从入门到放弃》演讲,四十五分钟介绍了插件化技术的皮毛。后来这个演讲内容被整理成文章发布到网上,流传很广。
2017年1月,有企业要我去讲2天Android插件化技术。为此,我花了一个月时间,准备了四十多个例子。这是我第一次系统地积累了素材。
2017年6月,我在腾讯课堂做Android线上培训,为了宣传推广我的课程,我写了一系列文章《写给Android App开发人员看的Android底层知识》,共8篇,没列太多代码,完全以UML图的方式向读者普及Binder、AIDL、四大组件、AMS、PMS的知识。本书的第2章就是在这8篇文章的基础之上进行扩充的。
2018年1月,我父亲住院一周。我当时在医院每天晚上值班。老爷子半夜打呼噜,吵得我睡不着,事后我才知道,我睡着了打呼噜声音比他还大。半夜睡不着时就开始了本书的写作,每晚坚持写到凌晨两三点。直到父亲出院,这本书写了将近五分之一。
碰巧的是,这一年5月底我结婚,促使我想在5月初完成这本书的一稿,为此,我宅在家里整整写了3个月。仅以此书作为新婚礼物献给我亲爱的老婆,感谢你的理解,这本书才得以面世。
这两年我在忙什么
2016年5月写完《App研发录》后不久,我就从一线互联网公司出来,开始了长达两年的App技术培训工作。一改之前十几年在办公室闷头研究技术的工作方式,开始在全中国飞来飞去,给各大国企、传统公司、手机商的Android和iOS团队进行培训。这两年去过了近百家公司,有了很多与过去十几年不一样的感受。
App开发人员的分布也呈金字塔型,在金字塔尖的自然是那些一线互联网的开发人员,他们掌握Android和iOS最先进的技术,比如组件化、插件化等技术,但这些人毕竟是少数。而位于金字塔底端的开发人员则是大多数,他们大都位于创业公司或者传统行业,相应的App侧重于业务的实现,对App的高端技术,用得不多,需要不断补充新知识。另外,我在腾讯课堂讲了几个月App开发课程的过程中,认识了很多学员,有几千粉丝,同样面临需要不断学习新知识。
写作这本书的目的,是向广大Android开发人员普及插件化技术。
这本书里讲些什么
战战兢兢写下这本书,有十几万字,仍不能覆盖Android插件化的所有技术。因为插件化技术千头万绪,流派众多,我想从最基本的原理讲起,配合大量的例子,希望能帮助完全不懂Android插件化技术的小白,升级为一个精通这类技术的高手。
面对业内各种成熟的插件化框架,我只选取了具有代表意义的DroidPlugin、DL、Small和Zeus进行介绍,这几个框架基本覆盖了插件化编程的所有思想,而且非常简单,像Zeus只有11个类,就支撑起掌阅App的插件化。而对于后期推出的VirtualApk、Atlas、Replugin等,在本书中并没有介绍,主要是因为这些框架都是大块头,代码量很多,我没有精力再去研究和学习了。但这些企业级插件化框架所用的技术,本书都有涉及。
本书的结构及内容
全书分为三大部分,共22章。第1部分“预备知识”包括第1~5章,是进行Android插件化编程的准备知识。第2部分“解决方案”包括第6~16章,详细介绍并分析了插件化编程的各种解决方案。第3部分“相关技术”包括第17~21章,介绍插件化编程的周边技术,并对纷繁复杂的插件化技术进行了总结。
第1章介绍的是Android插件化的历史,可以当作小说来读,茶余饭后,地铁站中就可以读完。
第2章介绍Android底层知识,涉及那些与Android插件化相关的知识,比如Binder和AIDL,Android App的安装流程和启动流程,ActivityThread,LoadedApk,Android四大组件的运行原理。这一章篇幅较多,需要仔细研读。其中,讲到一个音乐播放器的例子,帮助大家更加深刻地认识Android的四大组件。
第3章讲反射,详细介绍了构造函数、方法、字段、泛型的反射语法。这章介绍了Java领域很火的一个开源库jOOR,可惜,它对Android的支持并不是很好,所以这章还介绍了我们自己封装的RefInvoke类,这个类将贯穿本书,基本上所有源码例子都会使用到它。
第4章讲代理模式。这个模式在Android中最著名的实现就是Proxy.newProxyInstance方法。基于此,我们Hook了AMS和PMS中的一些方法。
第5章是第4章的延续,仍然是基于Proxy.newProxyInstance方法,Hook了Activity的启动流程,从而可以启动一个没有在AndroidManifest中声明的Activity,这是插件化的核心技术之一。
第6章介绍了如何加载插件App,以及如何对插件化项目的宿主App和插件App同时进行调试。说到插件化编程,离不开面向接口编程的思想,这章也花了很多笔墨介绍这个思想,以及具体的代码实现。
第7章介绍了资源的加载机制,包括AssetManager和Resources,并给出了资源的插件化解决方案,从而为Activity的插件化铺平了道路。另外还介绍了换肤技术的插件化实现。
第8章介绍了最简单的插件化解决方案,通过在宿主App的AndroidManifest中事先声明插件中的四大组件。为了能让宿主App随意加载插件的类,这章介绍了合并dex的技术方案。
第9章到第12章介绍了Android四大组件的插件化解决方案。四大组件的生命周期各不相同,所以它们各自的插件化解决方案也都不同。
第13章、第14章介绍了Android插件化的静态代理的解决方案。这是一种“牵线木偶”的思想,我们不用Hook太多Android系统底层的代码。
第15章再次讲到资源,这次要解决的是宿主和多个插件的资源id值冲突的问题。这一章介绍了多种解决方案,包括思路分析、代码示例。
第16章介绍一种古老的插件化解决方案,通过动态替换Fragment的方式。
第17章介绍了App的降级解决方案。一旦插件化方案不可用,那么我们仍然可以使用H5,来替换任何一个App原生页面。
第18章介绍了插件的混淆技术。有时候宿主App和插件App都会引用MyPluginLibrary这个类库,这个公用类库是否要混淆,相应有两种不同的混淆方案。
第19章介绍了增量更新技术。这是插件化必备的技术,从而保证插件的升级,不需要从服务器下载太大的包。
第20章介绍了so的插件化解决方案。这章详细介绍了so的加载原理,以及从服务器动态加载so的方案,基于此,有两种so的插件化解决方案。
第21章介绍了gradle-small这个自定义Gradle插件。这章是对第15章的补充,是另一种解决插件资源id冲突的方案。
第22章作为整本书的结尾,系统总结了Android插件化的各种解决方案。如果读者能坚持读到这最后一章,可以帮助读者巩固这些知识。
关于本书名词解释
本书有很多专业术语,刚接触Android插件化的读者可能不容易理解。有一些专业术语还有别称或者简称,我在这里罗列出最常见的一些术语:
HostApp,本书中有时也写作“宿主App”。用于承载各种插件App,是最终发版的App。我们从Android市场上下载的都是HostApp。
Plugin,本书中有时也写作“插件”、“插件App”。
Receiver,是BroadcastReceiver的简称,Android四大组件之一。
AndroidManifest,也就是AndroidManifest.xml。
Hook,就是使用反射修改Android系统底层的方法和字段。
AMS,是ActivityManagerService的简称,在App运行时和四大组件进行通信。
PMS,是PackageManagerService的简称,用于App的安装和解析。
关于本书的源码
本书精心挑选了70多个例子,都可以直接下载使用,正文中都列出了代码名称,在相应网站可以找到。附录B还列出了所有源码对应的章节。
致谢
几乎所有的书都千篇一律地感谢很多人,却不写为什么要感谢他们。我在这里一定要把感谢的理由说清楚。
首先,感谢我那古灵精怪的老婆郭曼云。谢谢她在我人生迷惘的时候及时出现,陪我玩王者荣耀,带我骑小黄车去散心,看电影时一起八卦剧情然后被坐在旁边的观众出声制止。她每天要我做不一样的饭菜给她吃,把我锻炼成厨房小能手,我现在已经习惯于每天傍晚五点半就放下手中所有的活儿,愉快地投入买菜做饭的工作。
感谢张勇、任玉刚、罗迪、黄剑、林光亮、邓凡平、王尧波、田维术等Android领域的朋友们,我在写作这本书的时候,经常会遇到各种疑惑,每次问到他们,他们都会不厌其烦地给我详细解答。
在这里,尤其感谢田维术,他的技术博客(weishu.me)“介绍插件化的一系列文章”对我的影响很大,可惜没写完,只讲了Binder原理和四大组件的插件化方案。本书的部分章节参考了他的博客文章,对他提供的一些代码例子进行了二次加工。经过他本人同意后,收入这本书中。代码中的很多类上都标注了作者是weishu,以表达对他的感谢。
感谢任正浩、霹雳娇娃、赵越、Dinosaur等这群狐朋狗友的陪伴,我从互联网公司出来转型做App技术培训的过程中,整理了半年PPT教程后才开始陆陆续续接到单子,在这半年时间里,我就跟这帮学弟学妹厮混在一起,爬山、撕名牌、唱K、密室逃脱、狼人杀,还有一阵时间沉迷于你画我猜。那是我最惬意的一段时光。
感谢我爸我妈以及咱爸咱妈,你们的女儿我一定照顾好。虽然北京与天津距离那么近,很抱歉还是不能常回家看看,我永远是那么忙,忙着去追求事业的成功,距离财务自由还很远,但是我一直在努力。
最后,感谢曹洪伟等21位社区朋友的辛勤劳动,把这本书翻译为英文,限于篇幅,这里就不一一致谢了。接下来,这本书的英文版本会在国外网站社区逐篇发布,乃至出版成书,让全世界的Android开发人员看到中国工程师们的智慧结晶。

包建强
2018年6月于北京

上架指导

计算机\网络

封底文字

现在市面上有各种各样的开源插件化框架,其中很多都已经在各大公司自己的产品中长期稳定使用,满足了各种现实的需求,它们的稳定性、可用性都还是不错的。包老师在这本书中对其中很多插件进行了介绍剖析。
如果我们不满足于业务研发,希望可以了解一些Android底层知识,研读这些开源框架的源码则大有裨益。当然,包老师的这本书是国内第一本介绍插件化技术的书籍,作为我们学习插件化技术的入门书籍,则相当合适。
—— 张勇 DroidPlugin的作者

我从工作以来,有一半时间都在从事插件化相关的开发工作。我喜欢 Android,也喜欢插件化。最开始我对插件化技术只是兴趣使然,在工作之余我喜欢做一些研究,所以有了dynamic-load-apk,我很荣幸能为国内插件化技术的发展贡献自己微薄的力量。
今天,包老师把插件化的发展历程和技术细节出版成书,也是为插件化技术多年的发展做了一个完美的总结,感谢包老师这本书,可以让更多人了解插件化技术。
—— 任玉刚 《Android开发艺术探索》的作者

作者简介

包建强 著:作者简介
包建强 毕业于复旦大学数学系。先后在多家互联网公司担任无线部门技术总监,现在从事区块链技术领域的研究,在Android、iOS、ReactNative等多门无线技术中跋涉过,在App的项目管理上也有多年的实践经验。他曾经出版了《App研发录》,并有一个坚持写了10年的技术博客:http://jax.cnblogs.com/,他的GitHub地址:https://github.com/BaoBaoJianqiang。

图书目录

序一
序二
序三
前言
第一部分 预备知识
第1章 插件化技术的昨天、今天与明天2
1.1 插件化技术是什么2
1.2 为什么需要插件化3
1.3 插件化技术的历史3
1.4 插件化技术的用途到底是什么8
1.5 更好的替代品:React Native8
1.6 只有中国这么玩吗9
1.7 四大组件都需要插件化技术吗10
1.8 双开和虚拟机10
1.9 从原生页面到HTML 5的过渡11
1.10 本章小结12
第2章 Android底层知识13
2.1 概述13
2.2 Binder原理14
2.3 AIDL原理16
2.4 AMS20
2.5 Activity工作原理21
2.5.1 App是怎么启动的21
2.5.2 启动App并非那么简单21
2.6 App内部的页面跳转32
2.7 Context家族史34
2.8 Service工作原理36
2.8.1 在新进程启动Service36
2.8.2 启动同一进程的Service39
2.8.3 在同一进程绑定Service39
2.9 BroadcastReceiver工作原理41
2.9.1 注册过程43
2.9.2 发送广播的流程44
2.9.3 广播的种类45
2.10 ContentProvider工作原理46
2.10.1 ContentProvider的本质49
2.10.2 匿名共享内存(ASM)49
2.10.3 ContentProvider与AMS的通信流程50
2.11 PMS及App安装过程52
2.11.1 PMS简介52
2.11.2 App的安装流程52
2.11.3 PackageParser53
2.11.4 ActivityThread与PackageManager54
2.12 ClassLoader家族史55
2.13 双亲委托57
2.14 MultiDex57
2.15 实现一个音乐播放器App59
2.15.1 基于两个Receiver的音乐播放器59
2.15.2 基于一个Receiver的音乐播放器63
2.16 本章小结68
第3章 反射70
3.1 基本反射技术70
3.1.1 根据一个字符串得到一个类70
3.1.2 获取类的成员71
3.1.3 对泛型类的反射75
3.2 jOOR77
3.2.1 根据一个字符串得到一个类78
3.2.2 获取类的成员78
3.2.3 对泛型类的反射79
3.3 对基本反射语法的封装80
3.3.1 反射出一个构造函数81
3.3.2 调用实例方法81
3.3.3 调用静态方法82
3.3.4 获取并设置一个字段的值82
3.3.5 对泛型类的处理83
3.4 对反射的进一步封装84
3.5 本章小结88
第4章 代理模式89
4.1 概述89
4.1.1 远程代理(AIDL)90
4.1.2 保护代理(权限控制)92
4.1.3 虚代理(图片占位)92
4.1.4 协作开发(Mock Class)92
4.1.5 给生活加点料(记日志)93
4.2 静态代理和动态代理94
4.3 对AMN的Hook95
4.4 对PMS的Hook97
4.5 本章小结98
第5章 对startActivity方法进行Hook99
5.1 startActivity方法的两种形式99
5.2 对Activity的startActivity方法进行Hook100
5.2.1 方案1:重写Activity的startActivityForResult方法102
5.2.2 方案2:对Activity的mInstrumentation字段进行Hook102
5.2.3 方案3:对AMN的getDefault方法进行Hook104
5.2.4 方案4:对H类的mCallback字段进行Hook107
5.2.5 方案5:再次对Instrumentation字段进行Hook109
5.3 对Context的startActivity方法进行Hook111
5.3.1 方案6:对ActivityThread的mInstrumentation字段进行Hook111
5.3.2 对AMN的getDafault方法进行Hook是一劳永逸的113
5.4 启动没有在AndroidManifest中声明的Activity113
5.4.1 “欺骗AMS”的策略分析114
5.4.2 Hook的上半场115
5.4.3 Hook的下半场:对H类的mCallback字段进行Hook118
5.4.4 Hook的下半场:对ActivityThread的mInstrumentation字段进行Hook119
5.4.5 “欺骗AMS”的弊端121
5.5 本章小结121
第二部分 解决方案
第6章 插件化技术基础知识124
6.1 加载外部的dex124
6.2 面向接口编程126
6.3 插件的瘦身129
6.4 对插件进行代码调试131
6.5 Application的插件化解决方案133
6.6 本章小结134
第7章 资源初探135
7.1 资源加载机制135
7.1.1 资源分类135
7.1.2 剪不断理还乱:Resources和AssetManager136
7.2 资源的插件化解决方案137
7.3 换肤141
7.4 殊途同归:另一种换肤方式149
7.5 本章小结149
第8章 最简单的插件化解决方案150
8.1 在AndroidManifest中声明插件中的组件150
8.2 宿主App加载插件中的类151
8.3 启动插件Service152
8.4 加载插件中的资源152
8.5 本章小结154
第9章 Activity的插件化解决方案155
9.1 启动没有在AndroidManifest中声明的插件Activity155
9.2 基于动态替换的Activity插件化解决方案159
9.2.1 Android启动Activity的原理分析159
9.2.2 故意命中缓存160
9.2.3 加载插件中类的方案1:为每个插件创建一个ClassLoader164
9.2.4 为了圆一个谎言而编造更多的谎言164
9.3 加载插件中类的方案2:合并多个dex166
9.4 为Activity解决资源问题169
9.5 对LaunchMode的支持169
9.6 加载插件中类的方案3:修改App原生的ClassLoader172
9.7 本章小结174
第10章 Service的插件化解决方案175
10.1 Android界的荀彧和荀攸:Service和Activity175
10.2 预先占位176
10.3 startService的解决方案178
10.4 bindService的解决方案183
10.5 本章小结185
第11章 BroadcastReceiver的插件化解决方案186
11.1 Receiver概述186
11.2 动态广播的插件化解决方案187
11.3 静态广播的插件化解决方案187
11.4 静态广播的插件化终极解决方案189
11.5 本章小结193
第12章 ContentProvider的插件化解决方案194
12.1 ContentProvider基本概念194
12.2 一个简单的ContentProvider例子195
12.3 ContentProvider插件化197
12.4 执行这段Hook代码的时机199
12.5 ContentProvider的转发机制200
12.6 本章小结201
第13章 基于静态代理的插件化解决方案:that框架202
13.1 静态代理的思想202
13.2 一个最简单的静态代理的例子203
13.2.1 从宿主Activity跳转到插件Activity203
13.2.2 ProxyActivity与插件Activity的通信204
13.2.3 插件Activity的逻辑206
13.3 插件内部的页面跳转206
13.4 从“肉体”上消灭that关键字207
13.5 插件向外跳转209
13.6 面向接口编程在静态代理中的应用211
13.7 对LaunchMode的支持216
13.8 本章小结221
第14章 that框架对Service和BroadcastReceiver的支持222
14.1 静态代理的思想在Service的应用222
14.2 对BindService的支持227
14.3 Service的预先占位思想229
14.4 Service插件化的终极解决方案:动静结合231
14.4.1 解析插件中的Service231
14.4.2 通过反射创建一个Service对象232
14.4.3 ProxyService与ServiceManager234
14.4.4 bindService的插件化解决方案240
14.5 静态代理的思想在BroadcastReceiver的应用245
14.6 本章小结248
第15章 再谈资源249
15.1 Android App的打包流程249
15.2 修改AAPT251
15.2.1 修改并生成新的aapt命令251
15.2.2 在插件化项目中使用新的aapt命令254
15.3 public.xml固定资源id值256
15.4 插件使用宿主的资源258
15.5 本章小结259
第16章 基于Fragment的插件化框架261
16.1 AndroidDynamicLoader概述261
16.2 最简单的Fragment插件化例子262
16.3 插件内部的Fragment跳转263
16.4 从插件的Fragment跳转到插件外部的Fragment264
16.5 本章小结266
第三部分 相关技术
第17章 降级268
17.1 从Activity到HTML 5269
17.2 从HTML 5到Activity273
17.3 对返回键的支持278
17.4 本章小结278
第18章 插件的混淆279
18.1 插件的基本混淆279
18.2 方案1:不混淆公共库MyPluginLibrary280
18.3 方案2:混淆公共库MyPluginLibrary282
18.3.1 配置multidex283
18.3.2 配置proguard285
18.3.3 移除Plugin1.apk中的冗余dex286
18.4 本章小结287
第19章 增量更新288
19.1 如何使用增量更新288
19.2 制作插件的增量包289
19.3 App下载增量包并解压到本地289
19.4 App合并增量包290
19.5 本章小结291
第20章 so的插件化解决方案292
20.1 编写一个最简单的so292
20.2 使用so296
20.3 so的加载原理298
20.4 基于System.load的插件化解决方案301
20.5 基于System.loadLibrary的插件化解决方案304
20.6 本章小结305
第21章 对App的打包流程进行Hook306
21.1 自定义Gradle插件306
21.1.1 创建Gradle自定义插件项目306
21.1.2 Extension又是什么308
21.1.3 修改打包流程309
21.2 修改resources.arsc311
21.2.1 Android是怎么查找资源的311
21.2.2 aapt都干了什么312
21.2.3 gradle-small的工作原理313
21.2.4 怎么使用gradle-small313
21.2.5 gradle-small中的Plugin家族313
21.2.6 gradle-small中的Editor家族317
21.3 本章小结318
第22章 插件化技术总结319
22.1 插件的工程化319
22.2 插件中类的加载319
22.3 哪些地方可以Hook320
22.4 Activity插件化的解决方案320
22.5 资源的解决方案321
22.6 Fragment是哪门哪派322
22.7 Service、ContentProvider、BroadcastReceiver插件化的通用解决方案322
22.8 特定于Service的插件化解决方案322
22.9 特定于BroadcastReceiver的插件化解决方案323
22.10 特定于ContentProvider的插件化解决方案323
22.11 本章小结323
附录
附录A 常用工具326
附录B 本书代码索引328

教学资源推荐
作者: Michaet J.Palmer
作者: Michael P. Papazoglou 著
作者: (美)拉里·彼得森(Larry Peterson);(美)卡梅隆·卡斯克尼(Carmelo Cascone);(美)布莱恩·欧康纳(Brian O''''''''onnor);(美)托马斯·瓦丘斯卡(Thomas Vachuska);(美)布鲁斯·戴维(Bruce Davie) 著
参考读物推荐
作者: (美)Lydia Ash
作者: 吴功宜 吴英 编著
作者: [美] 彼得·亚沃斯基(Peter Yaworski) 著