其实很简单。 SDK是Software Development Kit的缩写,中文意思是“软件开发工具包”。
这是一个涵盖范围相当广泛的术语。可以说,辅助开发某类软件的相关文档、示例和工具的集合,都可以称为“SDK”。具体到我们的系列教程,我们将仅讨论通用SDK —— 的一个子集,它是用于在Windows 平台下开发应用程序的SDK。
哈哈,其实上面只是给出了SDK的一个大概概念。什么是SDK真的那么容易理解吗?
恐怕没那么简单!为了解释什么是SDK,我们不得不先介绍一下API、动态链接库、导入库等概念。 ^_^,别怕,只是几个新术语而已。其实,学习新知识就是学习新术语、新概念、新名词。
首先接触的是“API”,即应用程序编程接口。它实际上是操作系统留给应用程序的一个调用接口。应用程序调用操作系统的API来使操作系统执行应用程序的命令(动作)。其实API的概念早在DOS时代就有了,只不过当时的API是以中断调用(INT 21h)的形式提供的。 DOS下运行的应用程序通过中断调用直接或间接使用操作系统功能。例如,将AH设置为30h,然后调用INT 21h即可获取DOS操作系统的版本号。在Windows中,系统API以函数调用的形式提供。要获取操作系统的版本号,在Windows 中只需调用GetVersionEx() 函数即可。可以说,DOS API是“用汇编语言思考”,而Windows API是“用高级语言思考”。 DOS API是系统程序的一部分。它们与系统一起加载到内存中,通过中断向量表可以找到它们的入口。那么Windows API 又如何呢?为了理解这个问题,我们必须引入——DLL这个概念,下面我们将介绍这个概念。
DLL(又一个缩写,好像IT行业有很多三个字母的缩写),即Dynamic Link Library。我们经常会看到一些.dll格式的文件。这些文件是动态链接库文件,实际上是可执行文件格式。与.exe 文件不同,dll 文件不能直接执行。它们通常由.exe在执行过程中加载,并包含一些资源和可执行代码。事实上,Windows的三大模块都是以DLL的形式提供的(Kernel32.dll、User32.dll、GDI32.dll),其中包含API函数的执行代码。为了使用DLL中的API函数,我们必须有API函数的声明(.H)及其导入库(.LIB)。函数的原型声明不难理解,那么导入库是用来做什么的呢?现在我们这样理解:导入库用于在DLL中查找API的入口点。
因此,为了使用API函数,我们必须有API对应的.H和.LIB文件,而SDK则提供了一整套开发Windows应用程序所需的相关文件、示例和工具的“工具包”。至此,我们才真正解释了SDK的含义。
由于SDK包含了使用API所必需的信息,因此人们常常将仅使用API编写Windows应用程序的开发方法称为“SDK编程”。 API和SDK是开发Windows应用程序所必需的,因此其他编程框架和类库都是在它们之上构建的,比如VCL和MFC,虽然它们比“SDK编程”有更高的抽象层次,但这并不妨碍它们直接需要时随时调用API函数。
开发SDK需要注意的问题
1.修改类别文件名和类别方法。
在开发SDK时,通常会使用较多的第三方类方法。这样的话,开发者在使用你的SDK时,可能还会添加一些第三方开源库,比如使用NSString的md5类别文件。由于这两个文件都是从Internet 下载的,因此文件名相同。这会导致编译时出错。然后就想到修改类别文件名,等待类别文件名修改。发现类别中的方法名都是一样的。当iOS调用同一个方法的两个类别方法时,它无法确定调用的是哪一个方法,但可以确定只会调用一个类别方法。如果开发者自己修改的时候恰好没有这个类方法,就会出现问题。
因此,在SDK开发过程中,需要修改引入的类名和方法名。建议添加项目前缀,最好是三个字母,如NAB(两个字母保留给苹果自己使用)
2.在开发SDK时,如果发现一个方法命名比较困难,几乎可以肯定该方法耦合度太高,需要重新分解。
3、开发SDK时,需要考虑升级问题,可以指定某些版本必须强制升级。 (以防后期发现某些版本有明显问题需要及时更换)
4、开发SDK时,需要预留一个可以通过后台服务器强制关闭接入应用的调用的接口。 (这种情况可能发生在恶意攻击和非恶意使用的情况下,比如应用频繁自动重启,我们的SDK每次重启都会被调用,这会导致我们的SDK服务器压力急剧增加。)这时,如果后台能够根据应用程序的APP ID强行关闭应用程序发出的请求或者阻止其请求,你会发现世界是如此美好。
5、统计方面,SDK会存储每个接口被调用的次数,并在特定情况下发送到服务器,方便后期分析某些接口是否存在问题,或者是否根本没有用户。
6、对于SDK使用的一些先决条件,最好在编译期而非运行时提示用户。您可以使用类似于以下的代码来提示用户。
#warning - 发布方案,这是行不通的。
#if !__has_feature(objc_arc)
#error iBeaconSDK 需要自动引用计数
万一
更好地构建SDK
1、了解墙外的世界,把握需求
尝试关注您的竞争对手或与您类似领域的公司正在做什么。这可能会给你一些看法。接受你喜欢的,改进你不喜欢的。
2. 简单
简单代码—— 简单代码意味着您的客户可以轻松使用它。这可能包括最大限度地减少与代码交互的方式,例如仅公开接口类;或者简短的方法签名,例如少量的输入参数等。
除了初始化阶段(仅发生一次并且可能需要配置)之外,使SDK 方法尽可能简单易用。
同样,尝试尽量减少方法签名中的参数数量。
您可以通过提供允许高级用户覆盖它的默认配置和默认实现类来实现此目的。
隐藏用户不需要使用的类和方法。例如,仅将用户必须使用的类/方法设置为公共,否则将其使用范围设置为本地或私有。提供代码检查和清理功能的IDE 可以自动为您完成此操作。
参考文档简单性—— 使您的文档尽可能简单易懂。这意味着有时你必须写更多的注释,有时你必须写尽可能少的注释。内联示例代码通常很有帮助,因为大多数人都是通过示例来学习的。
3. 提供简单的入门步骤
这意味着有人可以在五分钟内开始使用您的代码。这很重要,因为客户通常希望集成尽可能轻松。除此之外,有时客户想要评估您的产品,但如果他们无法进行简单的测试,他们可能会跳过它。
4. 短小精悍
保持简短主要是文档的责任,但也与用户如何与SDK 代码交互有关;为了保持文档简短,您可以通过提供代码示例、不言自明的方法名称或使用默认数据来做到这一点。
5. 整合
请记住客户开发环境的多样性。
例如,如果你正在编写一个Android库,当客户使用Android Studio加gradle框架和使用Eclipse集成开发环境时,它的集成方式有很大不同。前者需要AAR 工件并发布到远程存储库,而后者则需要您提供jar 文件,以及有关如何更改SDK 和独立eclipse 项目的AndroidManifext.xml 文件的指南。
这可能会影响您的构建机制及其工件。但是,不要试图取悦所有客户,而是从满足您的第一个客户或大多数预期客户开始。
六、项目实例
在GitHub上创建一个基础项目来模拟SDK包的用户。
这向客户展示您的产品如何满足他们的需求以及如何集成您的产品。如果您想展示高级用法,请在另一个项目中进行。通常,客户会使用项目示例作为他们的主要参考文档,因此提供内联注释并尝试以不言自明的方式编写代码。
7. 概述
在参考文档的开头,或者在GitHub 项目的README.md 文件中,请用简单的语言概述您的解决方案。在本节中,作者通常会提供一个使用示例来解释SDK的典型用法。如果可以的话,请提供一个简单的表格或图表,以便不喜欢阅读操作指南的用户能够快速了解该SDK的优势。
8. 初始化
使用SDK 域内接受的约定。
这些约定可能是可重载的构造函数、某种构建模式等。初始化应该明智地使用默认值来简化过程。
9. 默认值
默认值对于保持代码简单和减少配置过程非常重要(请参阅“简单性”部分)。您提供的默认值(在配置或实现期间)应代表您认为大多数SDK 用户会执行的操作。
审稿人:李茜