插件化实践

来源:互联网 发布:职业乞丐 数据 编辑:程序博客网 时间:2024/06/06 11:02

插件化介绍 
这里写图片描述

组件化开发就是将一个app分成多个模块,每个模块都是一个组件(Module),开发的过程中我们可以让这些组件相互依赖或者单独调试部分组件等,但是最终发布的时候是将这些组件合并统一成一个apk,这就是组件化开发。 
插件化开发和组件化开发略有不用,插件化开发时将整个app拆分成很多模块,这些模块包括一个宿主和多个插件,每个模块都是一个apk(组件化的每个模块是个lib),最终打包的时候将宿主apk和插件apk分开或者联合打包。


android工程的组件一般分为两种,lib组件和application组件 
application组件是指该组件本身就可以运行并打包成apk 
lib组件是指该组件属于app的一部分,可以供其它组件使用但是本身不能打包成apk


优点:不修改原本系统架构即可动态扩展功能;热插拔;

Bundle实际就是一个具有JAR格式的文件,其中包含了java的class文件和其他资源文件(比如图标,配置文件等等)。 
Bundle可以在自己的manifest文件中说明自己能够提供哪些java包。如果其它Bundle在自己的manifest文件中指定了需要这个包,那么它们之间就可能产生java包的依赖关系。这样多个Bundle之间就可以共享java包。 
Bundle同时支持插件化和非插件化两种应用场景,它不与OSGi框架耦合。 
Bundle的内容(一般是在一个JAR文件中)包括:清单列表 (Bundle元数据)、代码 (包中的类)、资源 (JAR文件中的其他文件)。


Bundle的主要内容就是类文件, 在Java里, 类被以包的形式来组织,在各个Bundle中的类的处理方面, OSGi框架采取了各个Bundle之间可以共享类的策略

一个Bundle可能处于以下六个状态: 
INSTALLED:安装完成,本地资源成功加载 
RESOLVED:依赖关系满足,这个状态意味着这个Bundle要么已经准备好运行,要么是被停止了。 
STARTING:Bundle正在被启动,BundleActivator的start()方法已经被调用但是还没有返回。 
STOPPING:Bundle正在被停止,BundleActivator的stop()方法已经被调用但是还没有返回。 
ACTIVE:Bundle 被成功启动并且在运行。 
UNINSTALLED:bundle被卸载并且无法进入其他状态。 

Bundle接口定义了getState()方法来返回Bundle的状态。



•服务是一个由Bundle注册到框架上的以便其他Bundles使用的对象。服务对象由一个Bundle拥有并在其中运行
服务可以被动态发现, 并可随时撤销
服务的生命周期的广泛的通知
服务拥有一个唯一的ID
在安全启用的情况下,服务可以要求服务许可检查, 这完全由操作者控制
服务关联了一些属性,可以通过强有力的查询语言可以找到合适的服务, Bundle可以动态的更新服务的属性
pOSGi定义了一系列标准的服务,  其他的组织也可以定义更多
服务接口的声明要尽可能少的带有实现的细节信息,


•Bundle之间可以通过服务对象、包共享等方式进行协同
•动态的注册表使得Bundle可以发现并跟踪服务对象
•框架对协同实行全面管理:依赖关系、安全等


先模块化再插件化

•模块化是插件化的前提,模块化应该贯穿项目运作的全过程,包括模块化架构、模块化开发、模块化发布
•接口与实现分离为不同的模块,以提高系统的灵活性。业务的变更往往是实现的变更,接口与实现的分离可方便地替换掉旧的实现。
•模块之间不能存在循环依赖。
•避免同一package分散到不同的模块中,package之间却还存在依赖关系。推荐以自注释的方式命名模块名和包名。
•模块之间不要有实现级的强依赖,推荐开发态接口依赖,运行态通过IOC的方式注入服务。
•尽量避免服务实例化过程中对其他服务的隐式依赖。比如,很多服务都依赖DAS进行数据库操作,但这些服务往往不会引用DASServer对象,只是在实现的时候进行了数据库操作。这样的场景就是一个典型的对DAS的隐式依赖。
•动态化要求高的模块,尽量减少对数据库的依赖。



原创粉丝点击