Android学习笔记之插件化(未完成)
2018-11-06 本文已影响0人
sssssss_
概述
插件化就是在开发时将整个app拆分成很多模块,这些模块包括一个宿主和多个插件,每个模块都是一个apk(组件化的每个模块是个lib),最终打包的时候将宿主apk和插件apk分开或者联合打包。
插件化的背景
- 应用体积越来越大;
- 每次修改都需要重新发布版本,降低用户粘性。
- 新功能的加入对于用户需求的不确定性。
- 需要对新应用进行导流的同时也可以免安装使用。
插件化的好处
- 宿主和插件分开编译:编译时只需要编译宿主app,插件app是在编译好后下发到宿主app里的。
- 并发开发:宿主app什么时候发布版本跟插件app什么时候开发完没有关系,宿主app只要开发完并且为插件app提供一个入口就可以了。
- 动态更新插件:插件app在开发完后下发到宿主app里,点击相应的入口就可以跳转到最新版的插件app了。
- 按需下载模块。
- 解决方法数超过天花板(65536)。
插件化要解决的问题
1.动态加载apk
- 插件App需要在宿主App中进行插桩:ProxyActivity,专门用来加载插件App的Activity,并且在Manifest.xml中进行注册。
- 实际场景中插件apk(plugin.apk)肯定是由服务端下发后,保存到SD卡的某个文件夹下,在宿主App中去加载插件App到ProxyActivity。
- 由于插件App没有安装,使用DexClassLoader来加载apk,然后通过反射在运行时来实现获得方法和参数,这样就可以把Activity调用起来。
2.资源加载
- 用AssetManager的隐藏方法addAssetPath。
3.代码加载
- 类的加载可以使用Java的ClassLoader机制,但是对于Android来说,并不是说类加载进来就可以用了,很多组件都是有“生命”的;因此对于这些有血有肉的类,必须给它们注入活力,也就是所谓的组件生命周期管理;
插件化必要基础
1.ClassLoader类加载器
2.Java反射
3.插件资源访问
4.代理模式
插件化开源项目
- Dynamic-load-apk:任玉刚,原理是在宿主中埋一个代理Activity,更改ClassLoader后找到加载插件中的Activity,使用宿主中的Activity作为代理,回调给插件中Activity所以对应的生命周期。
- DroidPlugin:是张勇实现的一套插件化方案,它的原理是Hook客户端一侧的系统Api。
相关学习
- Droid Plugin 插件框架
- 《Android插件化开发指南》
- https://www.jianshu.com/p/d9a823e94fb7