Android插件框架机制研究

插件化的基本形式是将一个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 的更新频率通常比较低。

你可能感兴趣的:(Android插件框架机制研究)