模块化
主要是重用,使用module,不强调单独编译,通信方式为intent路由,也可以用阿里路由框架。
组件化
主要是解藕,功能拆分,使用module,debug环境下apply plugin 切换为application,强调单独编译,通信方式为intent路由,也可以用阿里路由框架。
模块化与组件化的差别在于颗粒度,模块相对于组件的粒度较大,组件分的更细。一个模块可以由很多个组件构成。
插件化
不同的业务模块都做成一个apk,点击对应的业务模块就去动态加载对应的apk,可以并行开发,插件化本身是不同进程,通信需要用binder机制。
热修复
是为了做到解决修复某个bug或者增加某个小功能而不用去频繁发布版本。做法是打出差异包补丁,发布到第三方平台,重启软件后会下载修复文件,并且与基础包进行合并,实现应用的修复。
说起热修复就不得不提类的加载机制,和常规的JVM类似,在Android中类的加载也是通过ClassLoader来完成,具体来说就是PathClassLoader 和 DexClassLoader 这两个Android专用的类加载器,这两个类的区别如下:
- PathClassLoader:只能加载已经安装到Android系统中的apk文件(/data/app目录),是Android默认使用的类加载器。
- DexClassLoader:可以加载任意目录下的dex/jar/apk/zip文件,也就是我们一开始提到的补丁。是实现热修复的重点。
而这两个加载器都是继承BaseDexClassLoader,在BaseDexClassLaoder中有个DexPathList对象,它有一个dexElements集合,储存的是dex文件,而类的加载,就是遍历这个集合,如果找到了这个类就返回。热修复就是将修复后的dex文件放在dexElements中的第一个位置,这样一旦加载到了修复后的类,就不会再加载之前旧的类。
腾讯的tinker用的就是类加载技术实现的,阿里的andFix用的是native实现的。
插件化和热修复的相同点就是都用到了动态加载技术,插件化是宿主apk动态加载插件apk,热修复是app动态加载修复补丁。
增量更新
是将新旧apk生成的字节码文件进行对比,生成差分包,然后将差分包合并到旧apk中,生成新版本的apk。
步骤1:生成差分包
这一步需要在服务器端来实现,一般来说,每当apk有新版本需要提示用户升级,都需要运营人员在后台管理端上传新apk,上传时就应该由程序生成与之前所有旧版本们与最新版的差分包。
例如: 你的apk已经发布了3个版,V1.0、V2.0、V3.0,这时候你要在后台发布V4.0,那么,当你在服务器上传最新的V4.0包时,服务器端就应该立即生成以下差分包:
V1.0 ——> V4.0的差分包;
V2.0 ——> V4.0的差分包;
V3.0 ——> V4.0的差分包
步骤2:使用旧版apk与差分包,在客户端合成新apk
需要在手机客户端实现,ApkPatchLibrary 工程封装了这个过程。
步骤3:校验新合成的apk文件
在执行patch之前,需要先读取本地安装旧版本APK的MD5或SHA1,判断当前安装的文件是否为合法版本,同样,patch得到新包之后,也需要对它进行MD5或SHA1校验,校验失败,说明合成过程有问题。