第2章 SDK的设计目标

第1章 什么是SDK》我们介绍了SDK的概念,本文将介绍SDK的设计目标。

1. 需要解决什么技术问题?

在开始设计开发SDK之前,我们首先要知道的是SDK要解决什么问题。按照功能分类,我们了解一下有哪些常用的SDK类型:

  • 地图服务SDK:Google Maps SDK百度地图SDK,用于集成地图和地理信息服务。
  • 支付服务SDK:支付宝SDK微信支付SDK,用于集成在线支付功能。
  • 社交服务SDK:Facebook SDKTwitter SDK,用于集成社交网络功能。
  • 音视频SDK:FFmpeg SDKWebRTC,用于音视频编解码和处理。
  • 图形图像SDK:OpenCVOpenGL,用于图像算法和高性能的图形渲染。
  • 网络通信SDK:如libcurlpoco,用于处理计算机的网络通信。
  • 数据存储SDK:如SQLiteRedis,用于数据库存储和管理。

更多类型不一一列举,大家根据自己的业务和技术领域来分析。

2. SDK的定位是什么?

按照软件的层次结构,我们可以将SDK分成两类:基础库和框架。

2.1. 基础库

  • 定义: 基础库(basic library)是一组预先编写的代码模块,开发者可以在自己的应用程序中调用这些模块来完成特定的任务。基础库通常专注于某一方面的功能,比如网络通信、图形处理、数据操作等。
  • 特点: 基础库比较轻量级,开发者可以根据需要选择性地使用库中的功能,自由度较高。基础库的设计目的是为了复用代码,减少重复劳动。
  • 例子: Boost、OpenCV、libcurl、poco等。

2.2. 框架

  • 定义: 框架(Framework)是一个应用程序的骨架,它提供了一套预定义的结构和一组工具,开发者可以在这个结构上构建自己的应用。框架通常包含了一些通用的功能和设计模式,开发者只需要实现特定的业务逻辑即可。
  • 特点: 框架通常比较重量级,提供了大量的功能和工具,但同时也限制了开发者的自由度。框架的设计目的是为了提高开发效率和代码的可维护性。
  • 例子: Qt、Oat++

2.3. 基础库与框架

  • 框架通常是辅助特定类型的应用程序开发,如QT常用于客户端的GUI应用程序开发,Oat++应用于C++ Web应用程序的开发。ROS常用于机器人应用的开发。
  • 基础库通常专注于解决某一特定技术领域的问题,如OpenCV专注于计算机视觉相关的各类算法,libcurl专注于HTTP/FTP等协议的网络通讯。
  • 按照计算机软件的层次结构图,框架在应用程序的底层,基础库比框架还更底层,仅在操作系统之上。他们之间的层次结构图如图2.1。

在这里插入图片描述

图2.1 软件的层次结构图

中间件 (Middleware):

除了基础库和框架,大家可能还经常听到一个词语:中间件,它有是什么呢?

中间件是一个更宽泛的概念,它位于操作系统和应用程序之间,为应用程序提供服务。按软件的层次结构划分的话,它应该包含了框架和基础库。

根据软件层次结构的划分,我们可以明确要开发的SDK在软件生态中的定位:是要设计成一个基础库还是一个应用框架。

3. SDK的应用场景

SDK的应用场景是要帮助我们分析SDK适用的平台,是单平台支持还是需要跨平台支持?

  • 单平台: 只能支持特定的平台,如:PC Windows。
  • 跨平台: 可以同时支持多个平台,如:PC Windows、PC Linux、 PC macOS等。

平台是指什么呢?这里可以有两种理解。

第一种,更粗犷的概念:平台指操作系统,不同的平台就是指不同的操作系统。大多数人理解的平台都是这个概念,如:Windows、macOS、Linux。但这种理解是不太准确的,如同样是Linux系统,它可以跑在PC电脑上,也可以跑在嵌入式设备上的,能在PC Linux系统上运行的程序,不一定能在嵌入式设备的Linux系统上运行。这是因为PC电脑和嵌入式设备的CPU架构通常是不一样的,PC电脑通常会采用X86_64架构的芯片,而嵌入式通常是ARM架构的芯片,不同的CPU架构采用的计算机指令集是不一样的。

第二种,更精确的定义:平台是指硬件和操作系统的组合,这里的硬件更确切的说就是CPU架构,如:X86x86_64ARMARM64,“CPU架构 + 操作系统”共同决定了一个平台。因为操作系统可以运行在不同的CPU架构上,但不同的CPU架构采用的指令集是不一样的,如Linux x86_64的程序不能在Linux ARM64上运行。

支持的平台不同,对SDK开发的要求也不同,支持的平台越多,对SDK的要求就越高。如:要支持跨平台的SDK,对代码的编写、程序的编译和软件的打包都会有更高的要求,需要考虑更多的问题,具体要注意哪些问题,后面的章节会有更详细的讲解。

4. SDK的对接目标

SDK的对接目标帮助我们分析SDK会被哪些上层应用程序调用,API接口要支持哪些语言。如:只能被C++调用,或者能被C/C++/Java等多个语言调用。

  • 单语言API: 只需提供一种语言的API接口,通常SDK核心代码的语言和API接口的语言是同一种,如:C++开发的库只提供C++的接口,Java开发的库只提供Java的接口。
  • 多语言API: 同时提供多种语言的API接口,通常SDK的核心代码会用一种基础语言来编写,然后通过多语言融合技术提供多个语言版本的API接口。如:C++开发的库同时提供C语言接口、C++接口、Java的接口(常用于Android)。

这里举一个我之前开发的电子书SDK的例子:

电子书SDK的定位是基础库,主要提供电子书相关的基础功能,如:电子书的解析、排版、渲染、字体管理等。
要求同时支持PC端的Windows、Linux、macOS系统,以及移动端的Android、iOS系统。

整个软件的层次结构图是这样的:

在这里插入图片描述

图2.2 “电子书SDK”的软件层次结构图

  • 电子书内核的SDK是用C++实现的,提供了C语言类型的导出接口。
  • 然后基于C语言的接口,通过JNI技术封装了一层Java接口,供Android使用;Objective-C和Swift因为本身是兼容C语言的,所有iOS系统可以直接调用C语言的接口。
  • PC端的Windows、Linux、macOS因为用了QT的跨平台框架,而QT本身是C++实现的框架,所以也可以直接调用C语言的接口。

5. 总结

在开始设计SDK的时候,可以问自己四个问题:

  1. SDK需要解决什么技术问题?
  2. SDK的定位是什么?是一个基础库还是一个框架?
  3. SDK的应用场景,是单平台还是需要跨平台支持?
  4. API需要支持哪些语言?只需提供单语言的API还是需要多语言的支持?

回答完这四个问题,我们的SDK要做成什么样,就非常清晰了,SDK的简单名片就出来了,以本人写的一个开源项目为例,可以提供如下简单名片。

  • SDK名称: common_util
  • SDK简介: C++的一个通用工具库,提供如时间处理、路径处理、文件操作、字符串处理等基础功能。
  • SDK类型: 基础库
  • 平台支持: Windows、Linux、macOS
  • API接口: C++
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌尘(MoChen)

爱打赏的人技术成长更快哦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值