热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

听阿里云短视频SDK工程师谈谈如何开发一个优秀的SDK

作者简介:德胜现任阿里视频云团队资深开发工程师,多年移动端音视频经验,现在从事业务架构设计、客户技术支持等相关工作。越来越多的开发者选择使

作者简介:德胜 现任阿里视频云团队资深开发工程师,多年移动端音视频经验,现在从事业务架构设计、客户技术支持等相关工作。

越来越多的开发者选择使用SDK来辅助开发,作为一种工具,它可以帮助你快速建立应用软件,而省去了编写硬件代码和基础代码架构的过程。我们团队一直致力于移动视频领域SDK的开发,踩过坑趟过河,遇到了很多问题也总结了一些经验,下面是我们总结的一个好的SDK应该具备的特质,分享给大家:

易用性,稳定性,轻量,灵活,优秀的支持.

图片描述

一、易用性

因为工作的关系我接触了很多的开发者,其中有行业知名的公司的开发者,也有极小的个人开发者.有一个现象很有意思,不管是能力较强的开发者还是能力一般的开发者,他们都会不停的对你的SDK吐槽.因为他们对于好用的标准是不一样的,所以你必须要将你的SDK易用性考虑到极致,不然后续的技术支持将是一个十分痛苦的事情.

  • 不要过度设计,过度设计是程序员常常犯的错误,如果只是一个演示demo,应该尽量的简单,简单到最基础的程序员都能够看懂.

  • 接口尽量的见名知义.

  • 要相信绝大多数的开发者都是不看文档的.于是根据开发者的直觉去设计API,这样听起来是不是太靠谱?事实上比如你的SDK的生命周期设计方法跟系统差异性不大,比如你的播放器的接口设计跟系统播放器相差不大,那对开发者来讲就是福音.

  • 接口能够统一的尽量统一,比如iOS和Android的接口,应该尽量的统一.

  • 尽量多的默认参数,这里面有一些小的技巧,以下我提一个小的例子,比如我们的SDK,我们有一个跳转录制的接口,事实上就是将一堆的参数给到下一个SDK页面,让SDK接收参数,我们选择给一个结构体暴露给用户,如下:

    AliyunVideoParam recordParam = new AliyunVideoParam.Builder().setResulutionMode(resolutionMode) //设置录制分辨率,目前支持360p,480p,540p,720p.setRatioMode(ratioMode) //设置视频比例,目前支持1:1,3:4,9:16.setRecordMode(RecorderDemo.RECORD_MODE_AUTO) //设置录制模式,目前支持按录,点录和混合模式.setFilterList(eff_dirs) //设置滤镜地址列表.setBeautyLevel(80) //设置美颜度.setBeautyStatus(true) //设置美颜开关.setCameraType(CameraType.FRONT) //设置前后置摄像头.setFlashType(FlashType.ON) // 设置闪光灯模式.setNeedClip(true) //设置是否需要支持片段录制.setMaxDuration(max) //设置最大录制时长.setMinDuration(min) //设置最小录制时长.setVideQuality(videoQuality) //设置视频质量.setGop(gop) //设置关键帧间隔.build();AliyunVideoRecorder.startRecordForResult(this,REQUEST_RECORD,recordParam);

    这样有什么好处呢,我们事实上可以预制N个参数。这样用户调用一个录制功能只需要做什么呢?,如下:

    AliyunVideoParam recordParam = new AliyunVideoParam.Builder().build();AliyunVideoRecorder.startRecordForResult(this,REQUEST_RECORD,recordParam);

  • 上面还说了开发者对于易用性的标准是不一样的,面向的需求也是不一样的,上面的需求只能满足最基础的简单需求,如果要自定义界面,这个时候就需要暴露更加深的接口.于是我们将我们的接口设计分为多层.这样就基本能够满足用户最初级的要求和自定义属性的要求.

    DEMO--->AliyunVideoRecorder(第一层接口)---->AliyunIRecorder(第二层接口)

二 、稳定性

如何保证一个SDK的稳定性?自动化测试、适配测试、API的稳定、代码审查、内存检测、可测试性都缺一不可.

  • 自动化测试:依赖系统的自动化测试工具就可以完成人工绝大多数的自动化UI测试.能够解放黑盒测试的双手,这个时候如果有使用Jenkins之类的持续集成的系统,你还能够让你的开发者及时的能够发现问题、解决问题。

  • 适配测试:一个安卓永远的痛,现在基本没有很多好的方法,只有去找一些规律找机器适配,但是做多了就会发现还是有规律可循的,比如GPU的型号,系统版本,使用的硬件差异,甚至品牌.早期我们也是按CPU,GPU型号去买机器的.

    • API的稳定: 一个好的SDK设计的API应该从一开始就需要考虑扩展性,尽量多的考虑将来可能的需求,尽量将这些需求包进来.我见过很多开发者懊恼如果让我再设计一次一定能够将这个接口设计的更好一些 :)

    • 代码审查:一个好的团队在代码质量上会下很大的功夫,所以不让代码审查沦为形式是一个好leader应该考虑的事情.大团队会做一些交叉review,开启git的pull request,写单元测试等都是不错的方式

三、轻量

现如今手机App的大小直接决定用户买单不买单(16G的iPhone哭晕在厕所),在我接触客户中发现越是大公司越在乎对App的大小增加,因为他们的应用已经非常庞大了,像微信,手淘,支付宝这样的大体量他们都对大小有着极其严苛的态度,产品和技术团队会直接评估大小增加对用户的影响.所以你的SDK是否轻量直接决定用户是不是选择你的SDK.那如何做到轻量?

  • 尽量少的使用第三方库,如果非要使用这个库需要考虑这个库中的源码是否能够裁剪,有必要时需要产品一起评估这个功能对大小的增加,有必要时要求产品干掉这个功能

  • 代码耦合度尽量的低,比如用户只要一个录制功能,这个时候就需要评估你的录制模块是否独立,能不能单独的抽离.你应该尽量的让你的代码耦合度低

    • 第三方库需要暴露实现给用户.特别是非常常见的库,比如你一个json解析的代码。你应该定义一些接口,然后实现的类直接暴露给用户.如果用户有强烈的替换第三方库要求,应该让用户有权利去替换

    • SDK不要包含view层实现和资源,如果有必要,将view层的实现暴露出去.比如:我们在做SDK的时候我们始终在考虑怎么样让用户尽量简单的接入我们的SDK,尽量少的让用户接入的成本低,尽量少的让用户少写代码.这样就不可避免需要做一些应用层的事情,于是我们就将View层的所有实现都暴露给用户,然后让用户只修改UI即可.这样资源用户也可以替换,十分方便.

四、灵活

灵活包括几个点:API灵活可扩展,API的可测试性,API的健壮性性要强. 要做到以上任何一点都需要经验的支持,绝对不要想当然,尽量的从开发者的角度去设计,会让自己收获很多.

  • API可扩展:在业务过程中我们总是面对产品不断的需求压迫,但是从设计开始的时候就需要尽可能的考虑多的业务需求的可能性,这里有一个技巧,如果你不能确定你未来的需求增加,你应该保证尽量少的接口支持尽可能多的业务,不然到后期你会发现你的对外接口越来越多,一堆冗余接口.:)

  • 接口可测试性,一些小的技巧可以让你的SDK具备可测试性

    • 为了测试,有时我们需要进行模拟,模拟(mock)类作为真实类的仿制类,它没有真实操作,并且允许被重写调用和验证.

    • 如果有些类是final的就很难模拟,并且是一个基于状态的单例的话,就比较恶心了,这时候我们就需要考虑考虑在设计上尽量的规避.比如尽量避免单例,避免final.

    • 需要有测试用例,不管是开发人员还是测试开发人员都需要根据测试用例编写.

  • API的健壮性

    • 大多数的开发者经常都是不耐烦的,他们看到很长时间都找不到出错的原因是会有非常负面的情绪的,所以有一些错误应该尽早的抛出,这就好像比如你要build一个项目,如果一些错误能够在编译期间就暴露,一定好于完成编译之后才出现错误.所以你需要写清楚一些exception抛出给用户.

    • 尽量的保证接口的生命周期,如果是有序的需要在文档说明.

五、优秀的支持

如果以上四点你已经做得非常好了,这个时候你的文档和技术支持直接就决定用户是否选择你的SDK.也直接决定用户对你的评级.所以好的支持就非常重要了.你需要建立开发者社区,apple文档,javadoc,readme.甚至集成文档,示例教程.

  • 给对外暴露的代码尽可能多的注释,最好是相关联的说明使用示例,比如你的这个接口跟另外一个接口是配套使用的.

  • 需要有demo代码,demo代码应该尽可能的简单.让使用的人可以遵循你的代码进行尝试.一定一定不要让你的示例代码写的过于复杂.不要在无关紧要的交互模式上纠结.不然没有用户会花大量的时间去学习你的示例代码.而且他们还会有很多疑问,或者bug. (解决方案除外)

  • 如果有些接口需要废弃,你应该添加废弃的注解

  • 一定要有一个更新list.清晰的版本更新日志.要相信不是所有的开发者会选择最新版本的,你需要保证你的每一个版本都是稳定可用的.

  • 作为一个SDK,你的功能一定不能是自己臆想出来的.你应该常常跟开发者交流,了解用户的需求。每个功能都需要有客户反馈作为依据.

以上几个点肯定不是建设一个伟大的库的全部.只是我们在开发短视频SDK的时候的一些思考.如果觉得有一定意义, 欢迎交流.:)



推荐阅读
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 在CentOS 7上部署WebRTC网关Janus
    在CentOS 7上部署WebRTC网关Janus ... [详细]
  • 【并发编程】全面解析 Java 内存模型,一篇文章带你彻底掌握
    本文深入解析了 Java 内存模型(JMM),从基础概念到高级特性进行全面讲解,帮助读者彻底掌握 JMM 的核心原理和应用技巧。通过详细分析内存可见性、原子性和有序性等问题,结合实际代码示例,使开发者能够更好地理解和优化多线程并发程序。 ... [详细]
  • 从无到有,构建个人专属的操作系统解决方案
    操作系统(OS)被誉为程序员的三大浪漫之一,常被比喻为计算机的灵魂、大脑、内核和基石,其重要性不言而喻。本文将详细介绍如何从零开始构建个人专属的操作系统解决方案,涵盖从需求分析到系统设计、开发与测试的全过程,帮助读者深入理解操作系统的本质与实现方法。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • Juval Löwy主张,每个类都应被视为服务,这并非是为了让服务无处不在,而是因为微服务是经过深思熟虑后系统分解的自然结果。在他的设计和构建的系统中,这种理念有助于提高模块化、可维护性和扩展性。通过将每个类视为独立的服务,系统能够更好地应对复杂性,实现更灵活的部署和更高的性能。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • Unity3D 中 AsyncOperation 实现异步场景加载及进度显示优化技巧
    在Unity3D中,通过使用`AsyncOperation`可以实现高效的异步场景加载,并结合进度条显示来提升用户体验。本文详细介绍了如何利用`AsyncOperation`进行异步加载,并提供了优化技巧,包括进度条的动态更新和加载过程中的性能优化方法。此外,还探讨了如何处理加载过程中可能出现的异常情况,确保加载过程的稳定性和可靠性。 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • 汽车电子架构与CAN网络基础解析——鉴源实验室专业解读 ... [详细]
  • 揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节
    揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节 ... [详细]
author-avatar
枝断叶残_337
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有