SDK版本与兼容性

SDK版本与兼容性:保留第四版正文机制,以所有者—状态—结果合同、事件轨迹和章专属故障完成可重放验收。

学习目标

  • 能沿“SDK版本与兼容性”的用户事件解释Android组件、状态所有者、线程与销毁边界。
  • 能围绕“理解 minSdk、targetSdk、compileSdk 的含义——如何在支持新 API 的同时兼容旧设备。”改出一个可运行结果,并用前后状态而非组件数量验收。
  • 能在旋转、进程重建、拒权、离线或无效输入中选择适用反例,定位首个状态分叉。
  • 能用构建指纹、用户操作、状态快照、原始日志和行为断言独立重放结论,并标明第四版机制与现代targetSdk政策的边界。

你的 App 要跑在十年跨度上的设备

2015 年的手机和 2025 年的折叠屏,系统 API 差很多。 决定「多老的机子能装」; 决定「你能写哪些新 API」; 告诉系统「请按哪一代规则管我」。

三个版本号

build.gradle.kts

android {
    compileSdk = 35
    defaultConfig {
        minSdk = 26
        targetSdk = 35
    }
}
版本含义设低了会怎样
compileSdk编译用 SDK无法用新 API / 编译警告
minSdk最低安装版本老设备装不了
targetSdk行为兼容目标系统用旧兼容模式,可能缺新安全特性
三个版本号钉在同一条 API Level 数轴上常见关系:minSdk ≤ targetSdk ≤ compileSdk —— 装得上、按谁的规则跑、能写到多新API21262835minSdk = 21最低支持:低于此 API 的设备装不了targetSdk = 28行为基准:系统按此版本行为跑你的 AppcompileSdk = 35编译上限:能调用到的最新 API设备运行覆盖范围:API 21 及以上的设备都装得上、跑得起为什么是这个顺序• minSdk 抬高 → 砍掉老设备,换来更少兼容分支• targetSdk 跟新 → 系统按新规则管你(权限 / 后台)• compileSdk 跟新 → 才写得出最新 API(≥ 库要求)运行时按设备 SDK_INT 分支if (SDK_INT >= 33) 用新 APIelse 走旧 API(老设备)AndroidX 向后移植新 API → 老设备也能用,少写 if/else
三个版本号活在同一条 API Level 数轴上:minSdk 决定「多老的机子能装」、targetSdk 决定「系统按哪代规则管你」、compileSdk 决定「你能写到多新的 API」。运行时再用 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
}
分步1 / 4

① 查文档确认 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 级别安装并触发同一作弊提示”

状态所有者构建配置、兼容库与运行时版本分支
受控状态可编译 API、可安装范围、行为政策和回退路径
触发事件在两个 API 级别安装并触发同一作弊提示

冻结入口:7. Android SDK Versions and Compatibility

记录构建配置、兼容库与运行时版本分支的初始可编译 API、可安装范围、行为政策和回退路径

观察:Gradle 配置、设备 API、分支日志、兼容测试和回退截图中的“7. Android SDK Versions and Compatibility”轨迹

预期:由构建配置、兼容库与运行时版本分支提交可编译 API、可安装范围、行为政策和回退路径,并持续满足“版本判断围绕真实行为差异,不用编译成功代替运行兼容”

实验二:事件与生命周期轨迹

沿五次转换逐步执行“在两个 API 级别安装并触发同一作弊提示”。每一步只允许构建配置、兼容库与运行时版本分支按职责提交状态,并持续核对“版本判断围绕真实行为差异,不用编译成功代替运行兼容”。

Deterministic event replay

SDK版本与兼容性:事件轨迹

选择一次状态转换1 / 5

不变量:版本判断围绕真实行为差异,不用编译成功代替运行兼容

交付证据:Gradle 配置、设备 API、分支日志、兼容测试和回退截图

实验三:章专属反例与同输入恢复

注入“调用高版本 API 却只检查 compileSdk,低版本设备启动即崩溃”,保存第一个偏离点;撤销后以完全相同的 SDK、设备状态和用户事件重放。只有Gradle 配置、设备 API、分支日志、兼容测试和回退截图一起恢复才算修复。

Fault · cancel · restore

SDK版本与兼容性:反例与恢复

故障:调用高版本 API 却只检查 compileSdk,低版本设备启动即崩溃

1. 冻结输入一致

第 1 次使用相同 SDK、设备配置、初始状态与用户事件

2. 注入边界一致

保持正常输入不变,仅注入“调用高版本 API 却只检查 compileSdk,低版本设备启动即崩溃”

3. 检查所有者一致

版本判断围绕真实行为差异,不用编译成功代替运行兼容

4. 核对结果一致

Gradle 配置、设备 API、分支日志、兼容测试和回退截图

讨论

评论区加载中…