为什么要使用Android插件化框架?
写软件时,软件的扩展性至关重要。而软件的扩展性跟其代码的解耦程度相关。解耦程度大,就是模块化强。解耦程度小,即模块化弱。
插件化框架RePlugin,所做的就是将软件解耦,实现了代码的模块化。这对软件本身的后续开发、功能添加等,是十分有利的。大大降低了扩展软件的成本,代码的清晰度也提高了。
RePlugin带来的好处不止这些,它还给应用提供了“不用更新APP,直接更新、添加功能”的能力。能帮助我们以更低的用户成本,更加快速的进行迭代。
Android插件化框架要解决什么问题?
从Android的FrameWork结构来看,Android插件化都要解决基本的三个问题:
- 资源管理,比如drawable、string等资源
- 四大组件的生命周期,主要是activity、service组件
- ClassLoader类加载
目前已经开源的Android插件化框架
开源的插件化框架:
- Atlas(阿里 点击访问GitHub)
- VirtualAPK(滴滴 点击访问GitHub)
- RePlugin(360 点击访问GitHub)
其中,Atlas主要概念是组件化。RePlugin的优点是只hook了一处——ClassLoader。所以稳定性极强,适配十分简单。
RePlugin 两个主要概念
RePlugin分为宿主和插件的概念。一个APP由 1个宿主 + n个插件组成。宿主的主要功能是管理插件的安装、卸载、更新;插件权限管理等等(当然也可以将管理功能作为一个插件)。那APP下的每一个模块就可以对应一个插件。当你需要添加功能、更新功能的时候,直接把新的插件或更新后的插件发布到线上即可。
RePlugin 宿主配置教程
-
添加 RePlugin Host Gradle 依赖
在项目根目录的 build.gradle中添加 replugin-host-gradle 依赖:
buildscript { dependencies { classpath 'com.qihoo360.replugin:replugin-host-gradle:2.2.1' ... } }
-
添加 RePlugin Host Library 依赖
在 app/build.gradle 中应用 replugin-host-gradle 插件,并添加 replugin-host-lib 依赖:
android { // 要配置applicationId defaultConfig { applicationId "com.qihoo360.replugin.sample.host" ... } ... } // apply语句必须放置到android标签之后,以读取applicationId属性 apply plugin: 'replugin-host-gradle' dependencies { compile 'com.qihoo360.replugin:replugin-host-lib:2.2.1' ... }
-
配置 Application 类
让工程的 Application 直接继承自 RePluginApplication。
public class MainApplication extends RePluginApplication { }
在AndroidManifest中配置这个Application。
<application android:name=".MainApplication" ... />
只需三步就把RePlugin的宿主配置好了,之后即可在宿主的代码中调用RePlugin相关api,启动、管理插件。
注:如果插件需要使用宿主的依赖库,需要在宿主的Application类中加入以下代码把"插件使用宿主类"选项打开,默认是关闭
rePluginConfig.setUseHostClassIfNotFound(true);
RePlugin 插件配置教程
- 项目根目录的build.gradle,添加以下代码
buildscript { dependencies { classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.2.1' ... } }
- 在app/build.gradle中,添加以下代码
apply plugin: 'replugin-plugin-gradle' dependencies { implementation 'com.qihoo360.replugin:replugin-plugin-lib:2.2.1' ... }
两步即可将插件配置好。编写插件代码之后,将插件工程导出apk,改名为 [PluginName].jar 放到宿主工程的assets/plugins文件夹,启动APP即可。
注:
- 配置插件别名时,在插件的AndroidManifest.xml中,添加以下内容即可(和activity标签并列)
<meta-data android:name="com.qihoo360.plugin.name" android:value="[你的插件别名]" />
- 插件的版本号即app/build.gradle中配置的 versionCode
- 更新插件时迭代插件版本号,重启应用,框架会自动重载、更新插件(RePlugin是这样设计的,但是有bug,解决方法见下,新版本的RePlugin已解决此bug但未发布,可自行去官网下载编译)
- 当前版本的RePlugin框架的bug:更新插件后,重启应用不会自动加载插件。要解决这个bug,需要在APP关闭时,同时将:GuardService进程(这是插件管理进程,默认启动)关闭即可。
- compileOnly(provide) : 库只用于编译期,不会打入apk中;implement(compile) : 会打入apk中。在插件使用宿主的依赖库时,只需使用compileOnly即可,可以减小包的体积
扫码关注微信公众号版权声明
本文首发自简书:搜索作者 QinGeneral
无需授权即可转载,甚至无需保留以上版权声明;
转载时请务必注明作者。
网友评论