如何实现一个插件化?
插件化的原理?为什么使用插件化开发?插件化的出现有哪些优势?如何去实现一个插件化?怎样学好插件化,今天我们来说说这些问题。
一丶它的原理:
首先,我们来了解插件化的原理;我们将一个app拆分成很多模块,而这些模块包括一个宿主和多个插件,每一个插件都是一个apk,最后打包的时候将宿主apk和插件apk分开或者联合打包。
而插件化的概念就是由宿主APP去加载以及运行插件APP。
二丶为什要使用插件化:
1.因为业务的发展;业务越来越丰富,但不期望逻辑越来越臃肿。
;支撑业务快速试错,但不期望频繁升级的叨扰用户。程度改变程序架构,但不能停止需求迭代。
2.职位要求,能力的分水岭。从普通程序员转架构师,插件化、组件化是必须要掌握的核心技能。
3.进入大厂的必备技能,插件化是安卓高级开发很难避开的一个模块; 插件化的运用却通常只在一线的互联网公司中 。
三丶插件化的优势何在:
插件化技术最初源于免安装运行 apk 的想法。
1.容易维护: 当一个系统功能修改或发现Bug, 希望更新最小粒度的模块。 一是解决维护的成本, 二是将修改后的功能对其它完整功能带来的影响降到最低。
2.便于团队开发:一个产品开发出来后,中间肯定经手多人;而插件化会 降低或减少团队中个人之间的沟通和协作势必提高软件产品的质量。
3.产品功能的填充:任何软件产品都是需要维护需求的,为了保障产品的运营周期, 需要不断的将新的功能注入到现有的软件产品。插件化的系统架构为扩展新功能提供了更好的方便性。
4.插件化的技术支撑:
随着计算机编程语言的发展, 当今流行的Java和C#语言等都提供了新的特性来更方便地支持插件化的系统实现, 在C#中主要依靠接口和类的反射机制两种技术:接口和反射。
5.快速应用程序主框架:
应用程序主框架至少包含描述插件行为的接口定义和插件管理器两个部分。 当用户操作这些控件时,插件管理器又负责快速地 检索相应地插件对象并调用其的业务逻辑。
6.插件配置文档:
由于应用程序主框架加载各个插件时通过类反射机制创建对象,这就要求主框架必须 识别插件类所在程序集的名称字符串和类。插件配置文档用来存储这些信息。
四丶如何学习实现一个插件化:
下面来用图文来说明插件化框架实现方式:
框架初始化流程图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AHepRRWj-1650800833459)(D:\桌面\素\微信图片_20220413164543.jpg)]
框架初始化后,就启动插件了 。插件启动流程:
这个步骤主要是初始化插件的运行环境,利用宿主的Context改造成插件的Context。
接下来是插件启动Activity的流程:
该步骤主要是用宿主的Activity包装插件的Activity。通过上面的几个流程图,我们得知插件框架的基本原理如下:
● 利用DexClassLoader来实现动态加载插件中的class。
● 通过反射替换ContextImpl中的mResources,mPackageInfo,并替换插件Activity中的相关属性,来实现加载插件中的资源文件。
● 通过WidgetContext和WidgetInstrumentation来拦截startActivity的操作。
● 通过启动HostActivity来代替插件Activity,也就是说一个HostActivity对应一个插件Activity。
知道了启动插件Activity的原理后,我们思考下如何支持启动插件Service:
由于Android系统中同一个Service只会存在一个实例,这点与Activity不同,所以考虑用框架模拟Android系统来维护插件的Service。
Service本质上分为两种,运行在独立进程和非独立进程的,所以宿主应用至少需要启动两个Service,用来装载插件的不同Service。
启动Service的实现方式和Activity有些不同,下面是框架管理Service的类图:
了解了框架支持Service的基本结构,我们看下启动插件非独立进程Service的流程:
启动独立进程插件Service要麻烦一些,请看流程图:
图片看不清可以放大;插件化的好处有很多:解除代码耦合,插件支持热插拔,静默升级,从根本上解决65K属性和方法的bug等等。
学到这里是不是对插件化有所熟悉了呢。有不懂的可以在评论区留言。欢迎点赞收藏方便学习!
自己也是从事Android开发5年有余了;整理了一些Android开发技术核心笔记,关于更多Android开发技术点击:
https://shimo.im/docs/5rk9dyvKa4Fz1Kqx/ ,免费领取《免费Android技术丶面试题纲丶核心笔记资料》
想有收获必须有努力,知识在于积累。不进则退。