《Android插件化开发指南》是一本非常实用的书籍,对于想要深入了解并应用Android插件化技术的开发者来说,是一本不可多得的指南。书中详细介绍了Android插件化开发的实现原理和方法,以及如何利用插件化技术修复线上的bug或者推出新功能,而不需要发布新版本。对于日活千万的App来说,这是非常重要的,能够极大地提升开发效率,节省时间和资源。通过阅读本书,开发者可以快速掌握插件化开发的技巧,从而更好地应用在移动开发中。
Android插件化开发指南
内容介绍
Android插件化技术广泛应用在移动开发中,通过插件化技术,AndroidApp可以不通过发布新版本而修复线上的bug或者推出新功能,这对于日活千万的App而言是非常重要的,可极大程度提升App开发效率和质量。本书详细介绍了插件化技术的原理、各种方案,及其在AndroidApp中的使用。在介绍插件化技术的同时,还详细介绍了Android底层知识,能帮助AndroidApp开发人员更好地掌握Android的开发技术。本书共22章,先介绍Android插件化技术的历史和现状,系统介绍了Android的底层知识以及反射、代理等技术;然后介绍插件化技术的基本知识,包括各类插件化解决方案及其对比;之后分析了一些插件化框架,如that、Zeus等,深入分析了资源及其在插件化中的应用,以及混淆、增量更新等周边技术的插件化解决方案。
目录
- 第一部分 预备知识
- 第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