爱奇艺开源轻量级插件化方案 Neptune

栏目: IT资讯 · 发布时间: 7年前

内容简介:爱奇艺近日开源了其轻量级插件化方案 Neptune,项目地址:https://github.com/iqiyi/Neptune 插件化框架可以在主程序不重新安装的情况下,针对单个业务模块进行动态加载达到模块更新的目的,整个加载更新过程,对...

爱奇艺近日开源了其轻量级插件化方案 Neptune,项目地址:https://github.com/iqiyi/Neptune

插件化框架可以在主程序不重新安装的情况下,针对单个业务模块进行动态加载达到模块更新的目的,整个加载更新过程,对用户来说也是无感知的。

在爱奇艺APP快速发展的历程中,需要插件化的原因,归结起来有以下几点:

  • 业务快速发展,代码膨胀,APP不可避免地遇到了65536的大坑

  • 代码量增大带来了APK包体积的增加,而爱奇艺APK包体积一直在竞品中保持领先地位

  • 模块耦合度高,协作开发困难,编译时间长

  • 应用频繁更新,用户粘性降低,新版本覆盖率和覆盖速度不满足业务需求

  • 新功能开发,需要支持动态升级,插件动态下发形式可以完成模块的热部署和实时更新

爱奇艺APP从2013年就开始了插件化技术的研究和改造,截止目前一共有20多个独立业务模块以插件化的方式运行和并行迭代,其中包括APP首页的奇秀、文学、电影票、漫画等业务。开发插件化框架的Demo并不是很难,但是要开发一款完善的插件化框架,兼容适配国产各种碎片化的ROM,同时满足业务需求,却不是那么容易。插件框架的稳定性和兼容性,从原有代码模块解耦到插件化的迁移成本、后期维护成本等方面都需要考虑到。本文将介绍插件化实现的技术原理,分享爱奇艺APP在插件化实践过程的解决方案。

Neptune是爱奇艺移动端研发的一套灵活,稳定,轻量级的插件化解决方案。经过不断的研发,迭代和线上验证,目前已经完全适配了Android P,能够在数亿的设备上动态加载和运行插件APK,为爱奇艺众多的垂直业务团队提供了稳定的服务。

Neptune的特性

功能完善,支持Activity/Service/Recevier,几乎支持所有Android原生特性。由于ContentProvider使用场景较少,暂时没有支持。

  • 四大组件无需在宿主Manifest中预先注册,组件具备完整的生命周期

  • Activity:支持显式和隐式调用,支持theme,luanchMode,taskAffinity,支持透明主题

  • Service:支持显式和隐式调用,支持start,stop,bind,unbind等操作

  • BroadcastReceiver:支持静态广播和动态广播

  • 支持共享宿主的代码和资源,实现资源分区

  • 支持插件之间存在相互依赖,代码共享

  • 插件ClassLoader和资源互相隔离,避免类冲突和资源重名

  • 宿主Activity容器支持加载插件中的Fragment和View

兼容性和稳定性

  • 几乎兼容市面上所有的Android设备

  • 极少的Hook,核心Hook点只有Instrumentation和AssetManager,没有binder hook

  • 插件可以运行在独立进程,与宿主完全隔离,互不干扰

  • 插件之间类是隔离的,不会出现重复类的问题

  • 插件使用自身的AssetManager,没有Hook宿主的Resources,无需适配小米,vivo等ROM

侵入性低

  • 插件开发和开发原生APP类似

  • 插件可以依赖宿主的代码和资源,也可以完全不依赖

  • 插件和宿主可以独立打包和编译,并行迭代

  • 插件依赖宿主的资源,通过Gradle插件自动完成资源适

    配和处理,对开发者透明

Neptune的架构图

爱奇艺开源轻量级插件化方案 Neptune

Neptune整个框架实现是非常轻量级的,没有包含插件下载/安装/版本管理的逻辑,提供了PluginClassLoader,PluginContextWrapper,ActivityProxy,ResourcesProxy等基础组件实现了全面插件化。更多细节欢迎访问Github,Read the fucking source code。

插件管理中心

在Neptune框架之上,爱奇艺APP针对插件业务,实现了一套完备的插件管理方案,负责插件的下载,安装,升级,版本管理,插件启动控制,插件与宿主之间的通信。由于这部分涉及具体APP业务的交互形态,且与后端数据结构关联,因此没有开源。

这里简单介绍下设计思路。对于每一个插件版本数据,在APP层是一个OnLineInstance实例,里面字段与后端数据结构保持一致,包含基本的插件包名,插件版本,插件依赖,还包含一些下载控制策略,patch升级策略等。APP层的OnLineInstance,对应于Neptune框架的PluginLiteInfo。由于一些插件可能会来自不同的地方或者配置不同的版本,如内置插件,本地缓存的旧版本插件,线上最新插件。因此在APP层一个插件业务会关联多个OnLineInstance,我们会选择最高版本的兼容插件进行升级,安装。

爱奇艺开源轻量级插件化方案 Neptune

插件实例状态机

一个插件OnLineInstance从初始状态(OriginalState)到可用状态(InstalledState)有一套严格的状态机演变。版本不兼容的插件实例会被下线,优先使用本地已安装版本,空闲时机下载升级最新的插件,尽量做到让用户使用无感知。

爱奇艺开源轻量级插件化方案 Neptune

插件增量更新

插件包体积越大,下载成功率和转化率越低,为了提高插件升级的覆盖率和成功率,我们采用了增量更新的机制。插件后台更新插件时,后台会基于历史版本插件生成增量的diff包。APP端在请求插件数据时,后端接口额外返回增量patch的url及生成patch所有的base插件版本。前端根据本地已安装插件的版本,选择使用patch增量合成新版本插件apk还是走全量下载新插件,优化网络下载流量。


【声明】文章转载自:开源中国社区 [http://www.oschina.net]


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web Development Recipes

Web Development Recipes

Brian P. Hogan、Chris Warren、Mike Weber、Chris Johnson、Aaron Godin / Pragmatic Bookshelf / 2012-1-22 / USD 35.00

You'll see a full spectrum of cutting-edge web development techniques, from UI and eye candy recipes to solutions for data analysis, testing, and web hosting. Make buttons and content stand out with s......一起来看看 《Web Development Recipes》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具