您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    爱奇艺开源轻量级插件化方案 Neptune
    时间:2018-09-29 12:43 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    【新品产上线啦】51CTO播客,随时随地,碎片化学习

    爱奇艺近日开源了其轻量级插件化方案 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还是走全量下载新插件,优化网络下载流量。

    【编辑引荐】

    苹果的3D Touch技术为何惨淡收场?

    毕业3年,为何技术才能相差越来越大?

    Google 开源图形着色器测试框架 GraphicsFuzz

    技术转管理,我做了什么来挽救本人?

    Facebook 开源 Skip,面向对象+函数式编程言语

    (责任编辑:admin)