一句话回答
SDK(软件开发工具包)是一套库、文档、示例代码和工具,让开发者把某个平台或服务的能力加进自己的软件,通常封装了该服务的 API。
什么是 SDK?
SDK(Software Development Kit,软件开发工具包)是一套代码和工具,让开发者不用从零写起,就能给自己的软件加上某种能力。典型的 SDK 包括在代码里调用的库、文档、示例代码,有时还有构建工具或演示应用。
支付 SDK 加上收款,地图 SDK 加上地图,统计 SDK 加上事件追踪:记录用户在网站或 App 里做了什么,再发送给统计服务。
SDK、API 和库的区别
| 名称 | 是什么 | 例子 |
|---|---|---|
| API | 让服务做某件事的约定接口,通常走 HTTP | 带 JSON 请求体的 POST /events |
| 库 | 完成一件事的可复用代码,由你的程序调用 | 日期格式化库 |
| SDK | 围绕某个平台或服务的一整套工具:库、文档、示例、工具,常常封装了 API | 一个会把事件打包、再调用采集 API 的 Android 统计 SDK |
| 框架 | 搭好结构、反过来调用你的代码并控制流程 | React、Flutter |
一句话:API 是门,SDK 是让你方便又安全地用这扇门的工具箱。你总可以直接调统计 API,SDK 帮你处理那些容易出错的部分。
统计 SDK 帮你做了什么
以 TapCub 的客户端 SDK 为例,统计 SDK 通常负责:
- 自动事件。 启动、前后台切换、页面浏览、点击和崩溃,不用为每个都写埋点代码。
- 排队和批量发送。 事件先存在本地,再分批发送。TapCub 的 Android SDK 本地队列最多保留 1 万条事件、7 天,离线期间的数据也不会丢。
- 退避重试。 遇到限流、服务端错误和网络失败,从 1 秒到 5 分钟逐步重试,而不是丢掉这一批。
- 身份。 设备或访客 ID,以及把匿名行为关联到已知用户的登录调用。
- 同意时机。 两步启动:先只保存配置,不采集、不联网;用户同意隐私政策之后才开始发送。
- 远程配置。 在控制台改采样或开关,不用发新版 App。
TapCub Android SDK 的初始化能看出这两步:
class App : Application() {
override fun onCreate() {
super.onCreate()
TapCub.preInit(this, TapCubConfig(siteKey = "YOUR_SITE_KEY"))
}
}
// 用户同意隐私政策之后
TapCub.init()
统计 SDK 的类型
| 类型 | 运行在 | TapCub 里的例子 |
|---|---|---|
| 网页 | 浏览器 | client.js 脚本;Vue、React、Next.js、Nuxt 复用它 |
| 原生 App | iOS 和 Android 应用 | Swift 包、Maven Central 上的 Android 库 |
| 跨平台 | 一套代码多个平台 | React Native、Flutter、uni-app 包 |
| 小程序 | 微信、支付宝、抖音小程序 | 一个 npm 包,按平台分入口 |
| 服务端 | 你的后端 | Node.js、PHP、Python、Java、Go 库,发送服务端事件 |
客户端 SDK 能直接看到用户行为,但可能被拦截、延迟或丢失;服务端 SDK 发送订单、注册这类业务事件很可靠,但看不到点击。大多数产品两种都用,见服务端追踪。
接入 SDK 之前怎么评估
- 体积和性能。 给 App 或页面增加多少体积?会不会在主线程上做事?
- 权限和数据。 读取哪些设备数据?能不能关掉一部分?对照你的隐私政策检查。
- 离线表现。 会不会排队重试?最多保留多少?
- 同意控制。 能不能等用户同意再采集,同时不丢冷启动?
- 维护情况。 发版记录、支持的系统版本、未解决的问题、更新日志。
- 退路。 能不能远程关闭,或者改用 API 发送事件?
常见的 SDK 问题
- 初始化太晚。 首屏之后才初始化,会丢掉启动和首屏浏览。
- App ID 没登记。 很多服务会悄悄丢弃不认识的 App 发来的数据。
- SDK 重复。 两个统计 SDK,或同一个初始化了两次,事件会被重复计算。
- 版本漂移。 线上的旧版本 App 会在几个月里一直保持旧的埋点行为,埋点方案里要考虑到。
另见:原生应用。
参考资料
- Amazon Web Services. What is an SDK?
- Wikipedia. Software development kit.
- TapCub 文档. SDK 概览.
这个解释清楚吗?
我们会根据反馈修改和补充这篇内容。
提交没有成功,请稍后再试。
谢谢你的反馈,我们会据此改进这篇内容。你已经反馈过这篇了,谢谢。
