当前位置: 首页 > news >正文

在应用开发中,网易云音乐如何兼顾质量和效益

在应用开发中,质量和效益是非常关键的因素。网易云音乐作为用户人数突破4亿,成就移动音乐传奇的应用,是如何在开发中兼顾质量和效益的?网易云音乐Android负责人梁建将为您解读。

框架赋能

典型的开发框架从上往下分为三层,分别是业务层、服务层、能力层,三者之间是垂直依赖的关系,且业务层之间的水平模块不互相依赖,这样的分层有助于不同APP和同一APP间进行代码互用。

能力层跟业务逻辑完全没有关系,可以直接迁移,服务层可以按需定制,最上面的业务层则是开发者最熟悉的业务模块。

插件化

插件属于业务层的组件,行业中的设计方案很多,网易云音乐在插件设计时主要考虑三点因素:

设计简单

开箱即用、用完即止,最好是原生方案。

维护成本

当一个APP有非常多插件的时候,维护成本是非常重要的问题。有些插件可能依赖宿主的代码或资源,会对应用造成很大的不确定性。

性能

要求插件具有很好的运行效率。

网易云音乐插件设计实现:

首先,插件主体载体是Fragment,非常轻量,可以嵌在任何一个Activity里面。只要预埋一个Activity,就可以启动任何一个插件模块。网易云音乐把UI组件和代码冗余打包到插件包中,这样虽然增加插件体积,但会减少维护成本。

对于图片、网络这些能力层的功能,网易云音乐则使用服务接口来提供。这样一方面是为了减少依赖,另一方面可以让开发者在插件开发时保持和传统APP开发相同的习惯。

服务接口主要使用两种方式,一种是路由,一种是服务注册。为了尽可能避免进行对象的序列化和反序列化,网易云音乐把Meta层下沉到底部,开发者可以直接面向接口编程,同时建议插件尽量不依赖代码,也尽量不要固定宿主的资源ID或者修改插件的ID前缀,以免造成冗杂。

得益于非常轻量的原生插件实现,网易云音乐运行效率非常高。

组件化

上层业务组件水平模块之间不相互依赖,也为组件化提供了很好的支持。如上图,在开放一个动态功能时,只需将动态业务组件和核心业务组件打包在一起,便形成了一个动态业务壳;开发评论组件时,同样是把评论组件和核心业务组件打包在一起。这样的设计可以支持热拔插,提高业务线的并行开发效率,同时可以极大地减少编译速度。

全链路开发流程

全链路开发流程作为一个平台,串起了开发过程中的很多节点。那么,这套流程是如何保证开发效率的呢?

卡点

开发流程被分配到每个节点,每个节点都有各自的任务和责任。通过节点分配,将节点痛点逐一击破,极大地提高开发效率。

自动化

自动化是整个平台的核心,所有的自动化测试都是为了质量而生。自动化有一个非常重要的应用场景——自动打点,这是开发者的痛点,打点占用了开发太多时间。云音乐通过编译期进行代码注入自动生成打点,极大地提高了效率,减少了人工出错的可能性。

闭环

无论是版本数据,还是上线以后对数据指标的监控,云音乐通过数据发展趋势反哺于开发质量形成闭环。

以网络治理为例:客户端的网络问题非常复杂,云音乐通过观察线上网络指标来辅助策略的调整。通过ABTest实验,以观察网络连通性是否提升,再通过观察数据,调整网络优化策略,以此往复,形成闭环。

思考和建议

1.警惕拿来主义

不同方案适用于不同公司的问题,直接拿过来使用可能会有一些不良反应,所以一定要结合各APP的实际情况来仔细分析。

2.简单设计

简单设计意味着很多,更简单的设计意味着更高效的运行、更少的维护成本,简约往往并不简单。

3.量化指标

没有数据就没有话语权,没有数据就会失去方向,只有有了量化指标,才能呈现一个闭环。

4.勤思考 多沟通

需要开发者勤思考,多与他人沟通交流。例如在 “分享图标”的设计上,不同的应用会做一些差异化的设计。但如果设计过度,导致与其他大部分应用有较大差异,使用户无法识别出“分享图标”时,会造成分享率降低的后果。

*本文根据梁建讲师在安卓绿色联盟开发者大会现场的议题分享整理而成。

想了解更多,请点击观看讲师精彩现场视频>>>>

v.qq.com/x/page/o080…

安卓绿色联盟会根据每期技术沙龙议题输出精彩技术干货文章,分享讲师PPT,为未能现场参加技术沙龙的您提供另一个干货学习机会。

相关文章:

  • 高级软件工程第八次作业:“两只小熊队”团队作业-5
  • JS基础(一)dom小实例
  • GitHub文件的克隆与上传
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Git同时提交到多个远程仓库
  • 如果2020年出5G网络了,现在的手机是不是都被淘汰了?
  • 近似推断---高斯的变分混合
  • css教程
  • JSTL、EL、ONGL、Struts标签的区别与使用
  • 简单易用的leetcode开发测试工具(npm)
  • vue 轮播图插件 Vue-Awesome-Swiper
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 示例vue 的keep-alive缓存功能的实现
  • API Test WebApiTestClient工具安装及使用
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ES10 特性的完整指南
  • Git的一些常用操作
  • Javascript基础之Array数组API
  • JavaWeb(学习笔记二)
  • Java到底能干嘛?
  • Java小白进阶笔记(3)-初级面向对象
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Python十分钟制作属于你自己的个性logo
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • TCP拥塞控制
  • ubuntu 下nginx安装 并支持https协议
  • 扑朔迷离的属性和特性【彻底弄清】
  • 前端相关框架总和
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 突破自己的技术思维
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 一个SAP顾问在美国的这些年
  • 以太坊客户端Geth命令参数详解
  • ​业务双活的数据切换思路设计(下)
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #if 1...#endif
  • (1)常见O(n^2)排序算法解析
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (3)nginx 配置(nginx.conf)
  • (WSI分类)WSI分类文献小综述 2024
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (三) diretfbrc详解
  • (四) Graphivz 颜色选择
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转载)从 Java 代码到 Java 堆
  • .“空心村”成因分析及解决对策122344
  • .NET 常见的偏门问题
  • .NET 发展历程
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?