一、组件化
组件化开发就是将一个app分成多个模块,每个模块都是一个组件(Module),开发的过程中我们可以让这些组件相互依赖或者单独调试部分组件等,但是最终发布的时候是将这些组件合并统一成一个apk,这就是组件化开发。
优点:
1.将APP业务模块分开开发和维护,有利于提高效率
2.一个业务分为一个组件,每个组件可以单独开发以实现并发开发,进一步提高效率
3.每个组件充分解耦
4.每个组件可以单独测试
5.架构灵活
组件化路由框架:
ARouter
A framework for assisting in the renovation of Android componentization (帮助 Android App 进行组件化改造的路由框架)
二、插件化
插件化架构下,每个业务模块都是一个独立可运行的APP,插件化顾名思义,更多是想把需要实现的模块或功能当做一个独立的提取出来,减少宿主的规模,当需要使用到相应的功能时再去加载相应的模块。
优点:
1.宿主与插件分开编译,互不影响
2.插件可独立运行,充分解耦
3.按需加载插件模块,减少宿主体积
4.动态更新插件模块
5.发版灵活:不用上架,不需用户主动更新
常用的插件化框架:
1.# RePlugin
360开源的RePlugin 是一套完整的、稳定的、适合全面使用的,占坑类插件化方案
2.# Shadow
腾讯出品的零反射全动态Android插件框架
3.# Small
Small,做最轻巧的跨平台插件化框架。
三、热修复
热修复和插件化有一定的相同之处,他们都是从系统加载器的角度出发,无论是采用hook方式,亦或是代理方式或者是其他底层实现,都是通过“欺骗”Android 系统的方式来让宿主正常的加载和运行插件(补丁)中的内容。插件化强调的是按需加载,动态更新。热修复则是从修复bug的角度出发,强调的是在不需要二次安装应用的前提下修复已知的bug。
原理:
1.类加载原理
将修复代码打包成补丁文件,然后通过这个补丁文件封装出一个Element对象,并将这个Element对象插到原有的dexElements数组的最前端,当DexClassLoader去加载类时,优先会从我们插入的这个Element中找到相应的类,虽然那个有bug的类还存在于数组中后面的Element中,但由于双亲加载机制的特点,这个有bug的类已经没有机会被加载了,这样一个bug就在没有重新安装应用的情况下修复了
2.# tinker方案
通过修复好的class.dex 和原有的class.dex比较差生差量包补丁文件patch.dex,在手机上这个patch.dex又会和原有的class.dex 合并生成新的文件fix_class.dex,用这个新的fix_class.dex 整体替换原有的dexPathList的中的内容。
**3.# AndFix方案
AndFix 提供了一种运行时在Native修改Filed指针的方式,实现方法的替换,达到即时生效无需重启,对应用无性能消耗的目的。