插件化的基本形式是将一个apk 中的不同功能模块进行拆分,并打入到不同的dex文件或者apk 文件中,主工程只是一个空壳,提供了用来加载模块dex 或者apk 的框架。
插件化的好处
提升Android studio 工程的构建速度
提升应用的启动速度:
支持多团队并行开发
在线动态加载或者更新模块
按需加载不同的模块,实现灵活的功能配置
在android 中实现插件框架,需要解决的问题如下:
资源和代码的加载
android 生命周期的管理和组件的注册
插件Apk 和宿主Apk
基本概念
宿主和插件
宿主apk 实现了一套插件的加载和管理的框架,它作为应用的主工程存在,插件apk 都是依托于宿主apk 而存在的
插件apk 是每个独立的功能模块,可以通过在线配置和更新实现插件apk 在宿主apk 中的上线和下线,以及动态更新实现插件apk 在宿主中的上线和下线,以及动态更新等功能。
ClassLoader 机制
android 中的ClassLoader 机制主要用来加载dex 文件,系统提供了两个api 可供选择
PathClassLoader:只能加载已经安装到Android 系统中的apk 文件,因此不符合插件化的需求,不作考虑。
DexClassLoader: 支持加载外部的apk ,jar 或者dex 文件,整好符合插件化的需求,所有的插件化方案都是使用DexClassLoader 来加载插件apk 中的.dex 文件的。
开源框架介绍
android-pluginmgr
项目地址
实现原理是使用DexMaker 的动态部署更能来生成Activity ,让这个Activity 集成目标插件所在的activity。
主要优点
插件app 不需要设置任何规则或者限制
技术方法相对成熟稳定
主要特征
基于热部署实现,隐藏框架的稳定性有待 加强,OOM 问题叫突出
只支持activity ,不支持其它组件,通用性较差
dynamic-load-apk
项目地址
基于代理的方式实现插件框架,需要按照一定的规则来开发插件apk,插件中的组件需要实现经过改造后的Activity,FragmentActivity,Service等的子类。
主要特征
插件需要遵循一定的规则,因此安全方面更加可控。
方案简单,适用于自身少量代码的插件化改造
主要缺点
不支持通过this调用组件的方法,需要通过that 去调用
由于Apk 中的Activity 没有注册,不支持隐式调用APK 内部的Activity
插件编写和改造过程中,需要考虑兼容性问题比较多,联调起来会比较费时费力
DynamicAPK
项目地址
是携程实现的一种多APK/DEX 加载的插件框架解决方案,使用这个框架,我们可以实现android studio 多个module 工程并行开发模式,同时可以实现在线热修复功能。
主要特征
很少的修改即可实现插件化改造
提升工程的编译速度,更好的实现并行开发
按需下载和更新模块的代码和资源,实现在线热更新和热修复
提高app 启动速度
主要缺点
插件工程不支持Native 代码,例如不支持so 库
插件工程不支持对Library 工程、aar、maven 远程仓库的依赖
DroidPlugin
项目地址
是360 手机助手实现的一种插件化框架,它可以直接运行第三方的独立apk 文件,完全不需要对apk 进行修改或者安装。
主要特征
支持android 四大组件,而且插件中的组件不需要再宿主apk 中注册
支持android 2.3 及以上的系统,支持所有的系统api
插件与插件直接,插件与宿主直接的代码和资源是完全隔离的
实现了进程管理,插件的空进程会被及时回收,占用内存低
主要缺点
插件apk中无法注册具有特殊IntentFilter 的四大组件
插件apk 中不支持自定义资源的notification
缺乏对native 层的Hook 操作,对于某些带有Native 代码的插件apk 支持不好,可能无法正常运行
由于插件与插件,插件与宿主之间的代码完全隔离,因此,插件与插件,插件与宿主直接通信只能通过android 系统级别的通信方式。
Small
项目地址
Small 目的是实现最轻巧的跨平台插件化框架,它最低支持Android api level 8 和 ios 7.0.
主要特征
所有的插件支持内置于宿主包中
插件的编码和资源文件的使用与普通应用没有差别
通过设定 URI,宿主以及Nativie 应用插件,Web 插件,在线网页等能够方便的进行通信
支持android ,ios 和html5 ,三者可以通过同一套javascript 接口实现通信
Small 目前唯一的不足时暂不支持Service 的动态注册,不过这个可以通过Service 预先注册在宿主的AndroidManifest.xml 文件中进行规避,因为Service 的更新频率通常比较低。