SDK版本与兼容性
SDK版本与兼容性:保留第四版正文机制,以所有者—状态—结果合同、事件轨迹和章专属故障完成可重放验收。
学习目标
- 能沿“SDK版本与兼容性”的用户事件解释Android组件、状态所有者、线程与销毁边界。
- 能围绕“理解 minSdk、targetSdk、compileSdk 的含义——如何在支持新 API 的同时兼容旧设备。”改出一个可运行结果,并用前后状态而非组件数量验收。
- 能在旋转、进程重建、拒权、离线或无效输入中选择适用反例,定位首个状态分叉。
- 能用构建指纹、用户操作、状态快照、原始日志和行为断言独立重放结论,并标明第四版机制与现代targetSdk政策的边界。
你的 App 要跑在十年跨度上的设备
2015 年的手机和 2025 年的折叠屏,系统 API 差很多。↡Gradle 中声明的最低可安装 Android 版本,低于此版本的设备无法从商店安装。 决定「多老的机子能装」;↡编译时使用的 SDK 版本,决定你能调用哪些 API 符号。 决定「你能写哪些新 API」;↡向系统声明已适配的行为变更版本,影响权限、后台限制等策略。 告诉系统「请按哪一代规则管我」。
三个版本号
在 build.gradle.kts:
android {
compileSdk = 35
defaultConfig {
minSdk = 26
targetSdk = 35
}
}| 版本 | 含义 | 设低了会怎样 |
|---|---|---|
| compileSdk | 编译用 SDK | 无法用新 API / 编译警告 |
| minSdk | 最低安装版本 | 老设备装不了 |
| targetSdk | 行为兼容目标 | 系统用旧兼容模式,可能缺新安全特性 |
Build.VERSION.SDK_INT 按设备实际版本分支,AndroidX 则把新能力向后移植到老设备。运行时版本检查
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
if (granted) pickImage()
}.launch(Manifest.permission.READ_MEDIA_IMAGES)
} else {
// API 32 及以下用 READ_EXTERNAL_STORAGE
}① 查文档确认 API 级别
查阅 Android 官方文档,确认目标权限(如 READ_MEDIA_IMAGES)从哪个 API 级别引入(API 33 / TIRAMISU)。这决定了运行时分支的最低 SDK_INT 阈值。
小结
- compileSdk ≥ 你用的 API;minSdk = 业务决定的最低设备;targetSdk 尽量跟最新稳定版
- 新 API 用 SDK_INT 分支或 AndroidX
- 升 targetSdk 前读「行为变更」文档并全量测试
练习
问题 1:“第7章 Android SDK Versions and Compatibility”覆盖哪些正式节点和项目主线?
问题 2:怎样建立本页最小可执行实验?
问题 3:为什么只在正常点击路径运行不能证明完成?
问题 4:怎样设计能推翻当前实现的反例?
问题 5:从第4版语境迁移到现代目标SDK时如何控制变量?
问题 6:本页达到独立交接标准需要什么?
名词解释
本章出现的专业名词,用大白话再讲一遍。
- minSdk
应用支持的最低 Android 版本。低于此版本无法安装。
- targetSdk
声明已测试的行为变更版本。影响权限模型、后台执行、存储访问等系统策略。
- compileSdk
编译期 SDK 版本,决定可用的 API 与 lint 规则,不影响运行时「最低系统」。
“SDK版本与兼容性”不使用未获授权的纸书正文;InformIT出版信息与授权电子版完整目录只用于确认第四版32章、269个正式目录节点和时代语境,第四版官方勘误用于识别工具链变更。下列中文解释、图示、交互、代码与练习均为独立教学重写,平台行为再以Android Developers的一手文档复核。
为什么“SDK版本与兼容性”必须回到可观察状态
“SDK版本与兼容性”的学习结果不是记住类名,而是能预测“理解 minSdk、targetSdk、compileSdk 的含义——如何在支持新 API 的同时兼容旧设备。”在一次输入、一次重建和一次失败中的不同状态,并指出哪条Android合同产生差异。
第四版机制逐项深读
7. Android SDK Versions and Compatibility
在“SDK版本与兼容性”中,“7. Android SDK Versions and Compatibility”区分minSdk、targetSdk、compileSdk与运行设备版本;可调用性、行为变化和兼容库回退要分别验证,不能只凭编译通过。
Android SDK Versions
在“SDK版本与兼容性”中,“Android SDK Versions”区分minSdk、targetSdk、compileSdk与运行设备版本;可调用性、行为变化和兼容库回退要分别验证,不能只凭编译通过。
Compatibility and Android Programming
在“SDK版本与兼容性”中,“Compatibility and Android Programming”区分minSdk、targetSdk、compileSdk与运行设备版本;可调用性、行为变化和兼容库回退要分别验证,不能只凭编译通过。
Using the Android Developer Documentation
在“SDK版本与兼容性”中,“Using the Android Developer Documentation”区分minSdk、targetSdk、compileSdk与运行设备版本;可调用性、行为变化和兼容库回退要分别验证,不能只凭编译通过。
Challenge: Reporting the Device's Android Version
在“SDK版本与兼容性”中,“Challenge: Reporting the Device's Android Version”用于推翻“理解 minSdk、targetSdk、compileSdk 的含义——如何在支持新 API 的同时兼容旧设备。”的顺利路径:先写预期,再引入一个边界输入、重建或平台差异,并用状态、日志与用户结果解释首个分叉。
Challenge: Limited Cheats
在“SDK版本与兼容性”中,“Challenge: Limited Cheats”区分minSdk、targetSdk、compileSdk与运行设备版本;可调用性、行为变化和兼容库回退要分别验证,不能只凭编译通过。
“SDK版本与兼容性”验收回顾
“SDK版本与兼容性”只有在构建指纹、用户操作、状态快照、原始日志和行为断言能够从相同基线再次得到相同断言时才通过;第四版机制与现代平台政策分别记录,不用新API名称掩盖旧行为。
← 上一页:第二个Activity · 下一页:UI fragment与fragment管理器 →
章专属可重放状态实验
先预测“在两个 API 级别安装并触发同一作弊提示”发生后,构建配置、兼容库与运行时版本分支应怎样改变可编译 API、可安装范围、行为政策和回退路径;再操作三个实验。第四版示例与当前 Android 政策分别记录,实验不把新 API 名称倒填为原书内容。
实验一:所有者—状态—结果合同
选择任一正式目录节点和正常/边界场景,检查它是否真的进入本章状态合同。目录标题只有同时出现在解释、可视状态和交付证据中才算覆盖。
Owner · state · observable result
SDK版本与兼容性:状态合同
把 compileSdk、targetSdk、minSdk 与运行设备 API 的责任分开验证
验证场景
第四版正式目录节点
sdk-compatibility · 正常任务
7. Android SDK Versions and Compatibility:固定 SDK、设备配置和初始状态,触发“在两个 API 级别安装并触发同一作弊提示”
冻结入口:7. Android SDK Versions and Compatibility
记录构建配置、兼容库与运行时版本分支的初始可编译 API、可安装范围、行为政策和回退路径
观察:Gradle 配置、设备 API、分支日志、兼容测试和回退截图中的“7. Android SDK Versions and Compatibility”轨迹
预期:由构建配置、兼容库与运行时版本分支提交可编译 API、可安装范围、行为政策和回退路径,并持续满足“版本判断围绕真实行为差异,不用编译成功代替运行兼容”
实验二:事件与生命周期轨迹
沿五次转换逐步执行“在两个 API 级别安装并触发同一作弊提示”。每一步只允许构建配置、兼容库与运行时版本分支按职责提交状态,并持续核对“版本判断围绕真实行为差异,不用编译成功代替运行兼容”。
Deterministic event replay
SDK版本与兼容性:事件轨迹
不变量:版本判断围绕真实行为差异,不用编译成功代替运行兼容
交付证据:Gradle 配置、设备 API、分支日志、兼容测试和回退截图
实验三:章专属反例与同输入恢复
注入“调用高版本 API 却只检查 compileSdk,低版本设备启动即崩溃”,保存第一个偏离点;撤销后以完全相同的 SDK、设备状态和用户事件重放。只有Gradle 配置、设备 API、分支日志、兼容测试和回退截图一起恢复才算修复。
Fault · cancel · restore
SDK版本与兼容性:反例与恢复
故障:调用高版本 API 却只检查 compileSdk,低版本设备启动即崩溃
第 1 次使用相同 SDK、设备配置、初始状态与用户事件
保持正常输入不变,仅注入“调用高版本 API 却只检查 compileSdk,低版本设备启动即崩溃”
版本判断围绕真实行为差异,不用编译成功代替运行兼容
Gradle 配置、设备 API、分支日志、兼容测试和回退截图