1.定义
SDK:软件开发工具包(SoftwareDevelopmentKit) 一般都是一些软件工程师为特定的软件包,软件框架,硬件平台,操作系统等建立应用软件时的开发工具的集合,又称api。
我在面试的时候,被问到过如何设计一个SDK?
我个人感觉回答的不是特别好,所以重新想了下,如何设计。
- 1.框架独立性
- 2.可扩展性
- 3.可复用性
- 4.可测试性
- 5.UI独立性
- 6.代码清晰简洁
- 7.清晰可用的文档
- 8.清晰可用的示例代码
- 9.一个调用完整的Demo
我想一个SDK 应具备以上9个最基本的设计原则。
2.SDK应具备哪些特性
2.1 小
65535限制
为什么选择更小体积的包体?
对于技术人员来说,他们在开发产品时,普遍追求 "代码少,功能全",这是来自程序员的代码洁癖,对于商务人员来说,包体体积少,他们更容易接受。
2.1.1 如何使包体体积变小
如何减少包体的体积,建议从以下几个方面考虑:
1. 自研,不嵌套
在设计研发SDK时,不建议在SDK内嵌套一系列框架,例如三方网络框架,db框架或任务调度框架等。我们主张选择最核心的一部分进行自主研发。
2.代码优化
从算法层面,在效果相同的情况下,可适当减少代码的行数;对于又默认复制的变量不需要进行初始化赋值,选择合适的字符串拼接方式,建议使用StringBuilder方法拼接字符串,可用解决字符串频繁修改带来的内存消耗,也有利于减少包体体积大小。
3.追求实用,放弃完美
SDK包体应当追求实用性,以完善主功能为主,其他相对次要的部分可用适当减少时间或精力投入,放弃完美主义思维。
4.代码混淆
借助代码混淆实现更小体积的包体,且不易被逆向。
2.1.2 省电省流量
省电省流量是小的另一个方面,SDK如果没有对流量和电量有严格的限制,否则会出现手机烫,高耗电提醒,流量浪费,内置SDK APP 难以上架等问题。
针对上述问题,我们可以设置通过Lock杀手,智能心跳、自定义协议、链路合并、按需活跃等方式尽可能地降低SDK对电量以及流量造成的消耗。
(1)Lock杀手:代码中WiFiLock、WakeLock等会强制唤醒APP,导致APP产生较大耗电量。在不影响功能的前提下,我们应尽量减少或者不用该类锁。
(2)智能心跳:应根据不同的运营商、网络状态等,选择不同的心跳策略,并且根据不同的应用场景探索心跳的最大边界,尽量延长心跳周期,减少电量和网络的消耗。
(3)自定义协议:市场上常用的json、xml、甚至PB协议,都有比较好的兼容扩展性,但同样也带来了空间浪费的问题,自定义协议可以充分利用空间,精确利用每一个byte甚至bit,极简化封装,承载最大的信息量,减少流量和电量浪费。
(4)链路合并:当一个设备有多个APP的推送链路同时活跃时,我们会运用合并链路技术,将使用同一款SDK的 APP 之间的长连接链路进行合并,减少流量电量的浪费。
2.2 稳
2.2.1 提升稳定性
在设计SDK时,还要考虑到SDK的使用稳定性,否则在实际应用中,可能会遇到ANR,OOM,Crash,内存泄漏,闪退等棘手的问题,我们需要通过持续的迭代和优化来将错误最少化。
(1)做好代码管理
除了借助SVN、GIT等工具做好代码托管外,还需遵循一定的代码规范,借助类似gerrit等工具进行代码review,使用verify流程。在保证机器找不到问题的前提下,再用人眼去辨别是否符合业务逻辑。
(2) 自动化测试
自动化测试可以大幅提升回归测试的效率,非常适合敏捷的开发过程。此外,自动化测试可以替代大量的手工机械重复性操作,测试工程师可以把更多的时间花在更全面的用例设计和新功能测试上。
(3)运用代码模块化等小技巧
代码模块化能以最少的模块、零部件,更快速地满足更多的个性化需求。异常处理可以提高系统的容错性,让程序更加稳定。代码检测能及时发现程序中的缺陷和错误,比如检测内存是否泄露,是否有安全漏洞等,保证代码质量。
(4)线上灰度
实际场景中,我们很难去覆盖所有的环境,例如机型、网络等,需要通过线上用户的反馈去验证代码的健壮性。因此在产品大规模推向用户之前,我们需要进行少量的真实用户测试,即灰度上线来帮助减少风险
(5)日志系统
系统有问题是必然的,在尽量保持系统稳定的前提下,要考虑容错性。当问题发生时,需要第一时间以最快的速度排查,因此需要有一套完整的日志系统。此外,平时我们也可以通过日志系统的拨测检测系统的健壮性,可以在用户反馈之前及时发现并解决问题。
2.3 好用
SDK的易用性可以从下面几个方面考虑:
(1)接入简单
接入SDK时有集成demo直接可以运行,且接入文档清晰、步骤简单,最好能实现一键集成。
2.4 安全
SDK设计开发过程中,我们还需要注意安全性。安全性不仅仅代表网络数据交互的安全、本地数据存储的安全,也涉及到 SDK 的加固、混淆、第三方安全软件审核等。
其中,我们重点讲解SDK的加固。目前安卓平台SDK绝大部分都是Java语言编写,容易被反编译。SDK如果只是进行了简单的混淆,很容易被窥探到内部实现细节,此外还可能存在SDK被二次打包、植入恶意广告等现象。因此,我们需要对SDK进行加固,以提升安全性。