爱奇艺近日开源了其轻量级插件化方案 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整个框架实现是非常轻量级的,没有包含插件下载/安装/版本管理的逻辑,提供了PluginClassLoader,PluginContextWrapper,ActivityProxy,ResourcesProxy等基础组件实现了全面插件化。更多细节欢迎访问Github,Read the fucking source code。

插件管理中心

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

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

插件实例状态机

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

插件增量更新

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

爱奇艺开源轻量级插件化方案 Neptune相关推荐

  1. 爱奇艺开源的组件化跨进程通信解决方案

    /   今日科技快讯   / 近日,特斯拉首席执行官埃隆·马斯克来到中国上海,亲自向客户交付中国制造的Model 3,并透露了有关Model Y的更多信息,特斯拉股价继续保持着近三个月来的飙涨势头,目 ...

  2. 爱奇艺如何设置最小化显示在托盘

    相信很多朋友都有在使用爱奇艺,那么大家对食物爱奇艺的过程当中如何设置最小化显示在托盘呢?关于这个问题小编就和大家分享一下我的经验,希望能够帮助到大家. 爱奇艺会员活动2020_爱奇艺如何设置最小化显示 ...

  3. LiveVideoStack线上交流分享 (十六) —— 爱奇艺剧场直播云端混流方案

    如今网络直播如火如荼,剧场直播是其一个应用分支,主播在观看点播视频时的同时做出评述,观众端同步观看点播和主播评述的混合视频流.今晚 7:30 ,LiveVideoStack线上交流分享第十六期,我们邀 ...

  4. 推荐爱奇艺开源的高性能网络安全监控引擎!

    QNSM(IQIYI Network Security Monitor) 是一个旁路部署的全流量,实时,高性能网络安全监控引擎,基于DPDK开发,集成了DDOS检测和IDPS模块. DDOS检测 DD ...

  5. 爱奇艺插件化之Neptune

    2019独角兽企业重金招聘Python工程师标准>>> 爱奇艺APP从2013年就开始了插件化技术的研究和改造,截止目前一共有20多个独立业务模块以插件化的方式运行和并行迭代,其中包 ...

  6. linux系统怎么安装爱奇艺_爱奇艺插件化之Neptune

    爱奇艺APP从2013年就开始了插件化技术的研究和改造,截止目前一共有20多个独立业务模块以插件化的方式运行和并行迭代,其中包括APP首页的奇秀.文学.电影票.漫画等业务.开发插件化框架的Demo并不 ...

  7. 开源 | 爱奇艺网络流量分析引擎QNSM及其应用

    ▌导读 一定业务规模的互联网公司的基础设施的网络边界通常都呈现一定程度的复杂多分区的情况,如何进行有效的安全防护和控制会成为安全体系建设的重点和难点.面对这一挑战,爱奇艺安全团队自研了网络流量分析引擎 ...

  8. 爱奇艺数据中台建设方案.ppt

    大家好,今天给大家分享下爱奇艺数据中台建设时间方案,本文主要内容包含以下几部分: 数据中台的产生:数据工作的痛点.数据中台的产生.中台的实质 爱奇艺数据中台的定义:理解数据中台.数据中台的发展历程.输 ...

  9. 爱奇艺知识WEB前端组件化实践

    组件化作为一种开发模式,其在代码复用,提高开发效率上的效果被广泛认可.组件化思想适用于移动端.Web前端.PC端.TV端等多种类型的客户端和前端开发. 本文主要讲述爱奇艺知识 WEB 前端团队如何结合 ...

最新文章

  1. linux内核调优参考
  2. ef6+mysql的bug
  3. [数据库基础]——索引详解
  4. Facebook Libra不会和主权货币竞争
  5. 非确定性算法_使用最坏情况提高基于MPC的避障算法对参数不确定性的鲁棒性
  6. Codeforces
  7. SICP~计算机程序的构造和解释~ 1.12 c++实现
  8. Matconvnet 学习笔记
  9. 从今天开始学习iOS开发(iOS 7版)-- 构建一款App之App开发过程 (二)
  10. java中随机生成汉字
  11. Vue:axios中POST请求传参问题
  12. MacOS Monterey 12.5.1 (21G83) OC 0.8.4 / Cl 5148 / PE 三分区原版黑苹果镜像
  13. list转json的时候,关于date转换的问题
  14. 软件测试中期答辩,中期答辩材料创新张颖
  15. 深入理解MyBatis缓存
  16. 【图像融合】基于多模态实现CT图像无缝融合附matlab代码
  17. 个人空间岁末大回报活动12月16日获奖名单
  18. 用ffmpeg把yuv格式转化为mpeg格式
  19. 靶向肿瘤代谢,助力攻克癌症
  20. 超级爆笑:2008高考各省零分作文大全

热门文章

  1. C++之yaml-cpp开源库的使用笔记
  2. spring 两次进入拦截器_spring mvc 拦截器一次请求拦截两次?
  3. guid主分区表损坏_固态硬盘用mbr还是guid
  4. 模拟黑洞图像_黑洞“真容”今晚将被公布,先马约你一起见证~
  5. linux查看是哪个端口,linux 查看哪个端口使用情况
  6. kafka 的pom文件_Flink 消费 Kafka 数据
  7. python ant_('python,-ANT--编程字典',)
  8. mysql用大白话解释_大白话 golang 教程-22-关系型数据库访问
  9. leetcode刷题:LRU缓存淘汰算法
  10. 计算机教师的幸福,如何成为一名幸福信息技术教师