结合动态加载系列文章的分析,如今开始设计并开发一个Android的插件化框架,命名为Frontia。Frontia有“前端”的意思,寓意着Android插件能像前端开发那样动态发版,同时,这一词出自Macross动画系列,有“繁星”的意思,“咱们的征途是星辰大海 KIRA!!(<ゝω·)☆”。前端
Frontia是一个Android的插件化框架(基于ClassLoader的动态加载技术),相比其余开源项目,Frontia 的特色是扩展性强,更加专一于插件的下载、更新、安装、管理,以及插件和宿主之间的交互。在深刻介绍Frontia以前,咱们先想一想开发一个插件化框架须要考虑的问题有哪些。android
如今的插件化需求有许多花样,首先,有的只须要将一些特定的类(或者接口的实现类)插件化,好比一些游戏的SDK,须要把登陆功能和支付功能的实现插件化,这样SDK就能实现动态升级。其次,有一些业务须要将so库给作成插件化,由于一些so库须要同时内置多个CPU类型(x86/arm64等)的版本,因此会占用很是可观的体积,若是这些so库并非核心的业务,彻底能够作成插件,等到须要的时候再动态加载。再则,也有一些相对独立的业务须要独立升级,而不但愿随着APP一块儿发版。好比“游戏广场”这样的一个业务,APP只提供一个入口启动游戏广场,启动后接下来就无论了,这样的业务能够作成插件,插件能够动态升级(游戏广场能够自由设计本身的界面,甚至增长新的页面),也能够在多个APP之间使用同一插件业务(许多APP都有游戏广场的推广业务)。git
考虑到种种需求,咱们的插件有时只须要加载一些普通的类,有时候须要加载res资源,有时候须要加载so库,有时候须要加载新的组件类(Activity、Service等)甚至调用宿主APP的某些功能(好比获取用户帐号信息)。所以,咱们的插件化框架在处理插件加载的具体过程时,应该可以灵活地扩展,以知足以上以及未来的各类插件需求。github
除了处理插件的加载问题外,插件化框架还须要处理插件的更新问题,要否则插件化开发就没有意义了。加载插件前,咱们须要从服务器下载插件,或者判断是否须要从服务器下载新的插件版本,下载新版本插件失败的时候,咱们有又须要判断本地是否有可用的旧版本。所以,插件化框架须要提供一个完善的插件更新策略,以从服务器的插件版本列表和本地的缓存插件版本列表中,挑选出最佳的插件版本(目标插件)。缓存
当咱们插件的某个版本出现严重问题的时候,咱们但愿全部的下载过这个版本的插件的APP都要抛弃这个插件,因此插件化框架须要有“及时吊销”功能。当咱们插件的最新版本更新了某些重要的功能,咱们但愿全部的APP都马上升级到这个插件版本,若是下载最新版本插件失败,须要从新下载或者直接抛弃插件,而不能使用旧版本的插件,也就是说框架须要“强制升级”功能。安全
同一个版本的插件只须要下载一次就能够了,不能重复下载。插件化框架须要将下载下来的插件须要存放到指定的目录(咱们能够把这个过程看成是“安装插件”),以便于知道当前APP已经安装了哪些插件,以及这些插件有哪些版本,这样咱们才能够判断需不须要从服务器下载新版本的插件。服务器
同时,存放在本地文件系统上的插件是不安全的,可能被其余人恶意修改,但插件被加载进宿主APP后,它就是APP程序的一部分,能够访问APP的全部内存数据,插件化框架还须要提供对本地已安装插件的安全校验功能。框架
上面谈到的问题大体能够归类成插件的更新、安装以及加载问题,这些都是插件化框架应该解决的基本问题。固然除了这些问题以外,在将插件化开发引入实际生产的项目中的时候,还有一些问题不得不考虑,好比在开发插件的时候如何快捷地调试和构建插件,当插件出现BUG的时候如何快速定位问题(由于一个插件的BUG多是由“具体的设备型号 + 具体的宿主APP版本号 + 具体的插件版本号”致使的,这也是插件化开发的诟病,尽可能不要吧频繁变更的业务插件化),如何作好数据上报统计以评估插件的工做效果,固然,必不可少的,咱们还须要一个可靠的服务器来托管咱们插件(理想的情景是,咱们调试完把代码推到构建系统,构建系统构建完把插件入库并把插件的版本信息上传到服务器,服务器更新新插件版本的可用信息,整个过程不须要手动操做)。工具
相似以前谈到的Android动态加载技术须要解决的两个主要问题,插件化开发投入生产须要解决的问题大体可概括以下:动画
插件的更新、安装、加载策略;
插件的安全性校验;
插件与宿主的通信(互调)方式,甚至插件间互相调用的方式;
插件调试和构建的方法;
出现BUG时定位问题的方法;
插件数据统计;
插件托管的服务器(插件的持续集成);
一言以蔽之,插件化开发不只仅须要解决一个开发框架的问题,从总体上来看更像是须要解决一个开发平台的问题,除了解决代码的问题(粗体部分),还需解决生产工具或者效率的问题。
Frontia项目致力于解决以上问题,最后,放上项目的地址:android-frontia 。