Android 版本适配
最后核验: 2026-08-10. 版本适配必须同时说明系统版本 / API,
targetSdk条件, 安装或升级状态, 设备条件与分发渠道; 不要把系统行为变化和 Google Play 上架要求混为一谈.
一, 适配心智模型
每条变化都按以下四元组记录:
- 运行系统版本 / API: 用户设备实际运行什么版本.
- targetSdk 条件: 变化对所有应用生效, 还是只对达到某个 target 的应用生效.
- 安装状态: 新安装, 覆盖升级和从旧系统升级是否不同.
- 设备与豁免条件: 屏幕尺寸, 硬件能力, 权限角色, 企业设备或系统应用是否例外.
Google Play 的 target API 截止日期是分发政策, 不等于某个 Android 版本已经正式发布, 也不等于系统行为对所有应用同时生效.
targetSdk 门槛速查表
集中参考表: 系统侧门槛只对该 targetSdk 的应用生效, 商店侧门槛由 Google Play 分发政策强制; 二者不应混为一谈. 各行详细论证见本篇各版本小节 (二至六节).
| targetSdk | 强制门槛 (系统 / 商店) | 可选 / 新行为 | 版本 |
|---|---|---|---|
| 23 | 危险权限运行时申请 (系统) | — | Android 6 |
| 26 | 后台服务执行受限; 大多数隐式广播不可静态注册 (系统) | 通知渠道 | Android 8 |
| 28 | FGS 须及时 startForeground 并显示通知; 后台禁止启动 FGS; 明文 HTTP 默认禁用 (系统) | FOREGROUND_SERVICE 权限 | Android 9 |
| 29 | Scoped Storage 默认开启; 后台定位须独立 ACCESS_BACKGROUND_LOCATION (系统) | 存储可临时 opt-out | Android 10 |
| 30 | Scoped Storage 强制 (legacy opt-out 失效); 包可见性受限 (系统) | 单次授权 | Android 11 |
| 31 | 组件须显式 android:exported; 通知 trampoline 受限 (target 31+ 封禁); 精确闹钟需 SCHEDULE_EXACT_ALARM (系统) | 近似定位可选 | Android 12 |
| 33 | POST_NOTIFICATIONS 运行时权限; 媒体权限拆分 READ_MEDIA_IMAGES/VIDEO/AUDIO (系统) | Photo Picker 优先 | Android 13 |
| 34 | FGS 须声明类型并匹配权限; 动态广播 / 隐式 Intent 须声明 exported; 后台启动 Activity 收紧 (系统) | — | Android 14 |
| 35 | edge-to-edge 强制; 16 KB page 支持 (Play 强制, 2025-11-01 起); FGS dataSync/mediaProcessing 单日 6h 上限 (系统) | 部分屏幕共享 opt-in | Android 15 |
| 36 | edge-to-edge opt-out 失效; 部分屏幕共享可选 (用户选单窗口); 大屏 resizability/orientation 受限 (系统, 临时 opt-out 见官方文档) | MediaStore 版本锁定; 健康权限拆分; 本地网络权限 rollout 中 | Android 16 |
| 37 | 大屏 resizability/orientation 无 opt-out, 须全自适应 (系统); ACCESS_LOCAL_NETWORK 运行时权限; 明文默认禁用; DCL 原生库须只读 (系统) | MessageQueue lock-free; static final 不可变; 证书透明度默认开启 | Android 17 |
二, Android 6–13 核心变化回顾
| 系统版本 | API | 代表性变化 | 适配动作与常见坑 |
|---|---|---|---|
| Android 6 | 23 | 运行时权限, Doze | 请求前说明用途, 拒绝后保留可继续路径; 坑: 把首次拒绝误判为永久拒绝 |
| Android 8 | 26 | 后台执行与广播限制, 通知渠道 | 建渠道, 选择 WorkManager / 前台服务; 坑: 后台直接 startService 或依赖隐式广播唤醒 |
| Android 10 | 29 | Scoped Storage 起步, 后台定位限制 | 用 MediaStore/SAF, 前台后再请求后台位置; 坑: 把文件路径当稳定 API |
| Android 11 | 30 | 包可见性, 单次授权, 存储继续收紧 | 为确需查询的包写 <queries>; 坑: 查询不到就假定对方未安装 |
| Android 12 | 31 | exported 强制声明, 精确闹钟与前台服务限制 | 审计含 intent-filter 的 exported 与权限; 坑: 合并 Manifest 后暴露组件 |
| Android 13 | 33 | 通知运行时权限, 媒体权限拆分 | 按场景请求通知 / 媒体权限, 优先 Photo Picker; 坑: 仍用宽泛存储权限 |
Android 7/8/9 历史迁移矩阵
下表用于补齐历史版本的迁移思路. 每一行都应同时在对应系统版本与受影响的 targetSdk 条件下验证, 并覆盖新安装和从旧版覆盖升级.
| 系统版本 | API | 关键行为变化 | 影响条件 | 迁移动作 | 验证场景 |
|---|---|---|---|---|---|
| Android 7.0 文件 URI | 24 | 跨应用暴露 file:// URI 会触发 FileUriExposedException | 运行在 API 24+ 且 targetSdk >= 24 的目标应用 | 用 FileProvider 生成 content:// URI, 授予临时 URI 权限 | 在 API 24+ 上分别以目标 API 23 与 24 分享相机附件, 验证 URI 授权和接收方读取 |
| Android 7.0 网络广播 | 24 | CONNECTIVITY_ACTION 不能通过 Manifest 静态接收 | 运行在 API 24+ 且 targetSdk >= 24 的目标应用; 不将此规则推广到所有隐式广播 | 在需要接收网络变化的期间运行时注册, 并在恢复或执行网络工作前主动校验当前网络状态 | 覆盖冷启动, 已运行进程, 网络切换和恢复场景, 验证业务不依赖静态广播唤醒 |
| Android 7.0 媒体新增广播 | 24 | ACTION_NEW_PICTURE 与 ACTION_NEW_VIDEO 不再发送 | 在 API 24+ 上影响所有应用, 不取决于 targetSdk | 不以这两个广播触发媒体扫描或业务流程, 改用明确的写入完成或查询机制 | 在 API 24+ 新增图片和视频, 验证未收到广播时业务仍可完成 |
| Android 8.0 后台服务 | 26 | 后台应用进入受限状态后, 后台服务受执行时限约束 | 运行 OS: API 26+; 默认 target 条件: 平台的 Android 8 background execution limits 面向 targetSdk >= 26 应用. 低 target 应用不自动完全等同, 但用户可在系统设置中为其启用部分后台限制. 前台状态, 前台服务, 绑定服务和系统豁免各有独立条件, 须按具体路径及平台规则核验 | 可延迟工作迁至 WorkManager/JobScheduler; 确需用户可见的持续工作按前台服务要求实现 | 在 API 26+ 上分别以目标 API 25/26 及用户启用限制的低 target 配置覆盖: App 切后台, 短暂宽限期结束, 前台/绑定服务, 系统回收和重启, 并验证任务语义, 通知与恢复策略 |
| Android 8.0 隐式广播 | 26 | 大多数隐式广播不能再通过 Manifest 静态接收 | 运行在 API 26+ 且 targetSdk >= 26 的目标应用; 平台列出的豁免广播和显式广播不适用这一概括 | 逐项核对 action 是否在豁免名单, 改为运行时注册, JobScheduler 或其他适用机制 | 在目标 API 25 与 26 上分别验证冷启动, 已运行进程和豁免 action, 不假定全部广播规则相同 |
| Android 8.0 通知渠道 | 26 | NotificationChannel API 在 API 26+ 可用, 通知可由用户在系统设置中按渠道管理 | 运行 API 26+ 时创建渠道并使用 channel ID; targetSdk >= 26 的具体行为和发布要求须按当前平台规则核验, 不与运行 OS 条件混同 | 为每个用户可理解的通知类别创建稳定渠道, 读取用户在系统设置中的关闭或重要级别选择, 不以代码强行覆盖 | 在 API 25 与 26+, 新安装与升级安装, 渠道关闭和重要级别变更后验证通知展示与降级路径 |
| Android 9 | 28 | 面向 API 28+ 的应用默认禁止明文 HTTP, 同时限制后台访问硬件标识符 | 目标 API 28+; 明文策略还受应用与网络安全配置影响 | 服务端优先仅提供 HTTPS, 排查重定向, 图片和 SDK 域名; 确有受控遗留端点时以最小域名范围配置 networkSecurityConfig, 制定迁移下线计划 | HTTPS 主链路, 明文端点失败提示, WebView/图片/SDK 子请求, 代理和企业网络 |
Android P 的明文限制不是要求以全局 cleartextTrafficPermitted="true" 放开流量的理由. 这种做法会扩大中间人攻击和误配置暴露面, 不能规避安全或合规风险. 新服务与迁移服务应使用 HTTPS; 遗留兼容必须经安全评审, 仅针对必要域名设置最小例外, 并在发布前复核当前平台和地区要求.
多机型适配矩阵
版本回归不等于只换一个系统镜像. 以业务关键路径建立最小设备矩阵, 记录机型, 系统版本, targetSdk, 安装状态, 应用版本和结果证据.
| 维度 | 至少覆盖的条件 | 重点验证 |
|---|---|---|
| 系统版本 | 最低支持版本, 关键行为变更版本, 当前目标版本 | 权限, 后台任务, 存储, 通知和网络安全配置 |
| 密度与屏幕 | mdpi / 常用高密度, 小屏, 平板或大屏窗口 | 资源选择, 图片清晰度, 触控区域与布局裁切 |
| 字体 | 默认字体与放大字体 | 文本换行, 截断, 可点击区域和无障碍朗读 |
| 厂商行为 | 至少一个目标市场主流厂商设备 | 后台限制, 通知, 权限设置页和省电策略差异 |
| 方向与窗口 | 横竖屏, 分屏, 自由窗口或折叠展开状态 | 状态恢复, Insets, 列表位置和布局重算 |
| 安装路径 | 新安装, 覆盖升级, 从旧系统升级 | 数据迁移, 权限状态, 通知渠道和旧缓存兼容 |
三, Android 14 / API 34
- 前台服务类型, 声明与启动条件收紧; 必须结合具体 service type 和豁免条件核对.
- 精确闹钟不是 “声明权限即可无条件使用”, 需要判断应用类别, 用户授权和系统策略.
- 后台启动 Activity, 隐式 Intent 和动态注册广播接收器的安全边界继续收紧.
- 升级 targetSdk 前应做真实设备与升级安装回归, 不能只做新安装冒烟测试.
四, Android 15 / API 35
- 对达到相应 targetSdk 的应用, edge-to-edge 成为默认行为; 需要系统处理状态栏, 导航栏 Insets, 而不是依赖旧式固定高度.
- 前台服务, 后台启动, 通知, 媒体投屏等变化应逐项标注 targetSdk 条件.
- 16 KB page size 是 native 依赖兼容问题之一, 需要检查 APK/AAB 中所有
.so, 包括第三方 SDK; 不能只验证自研 C++. - 大屏和可调整窗口行为应按设备尺寸, 窗口模式和 targetSdk 条件测试.
五, Android 16 / API 36
Android 16 正式版 2025-06 发布, API 36. 以下为对 targetSdk 36 应用生效的关键变化 (按 Android Developers 官方行为变更页核验):
- 继续关注 edge-to-edge, 大屏适配, 后台任务与权限行为的 targetSdk 条件.
- 对含 native 库的应用, 将 16 KB page size 纳入 CI 制品检查和真机 / 模拟器测试.
- 部分屏幕共享: 用户可通过系统选择器只共享单个窗口, 需处理 “单窗口 vs 整屏” 的差异; 锁屏或系统停止共享时须处理
onStop并释放资源 (targetSdk 36). - edge-to-edge 的临时 opt-out (
windowOptOutEdgeToEdgeEnforcement) 在 API 36 失效, 必须正式消费 Insets. - 大屏 resizability / orientation 限制自 16 起对 targetSdk 36 生效 (游戏, sw600dp 以下及用户显式选择除外; 仍保留临时 opt-out), 17 起移除 opt-out.
- MediaStore
getVersion()改为每应用唯一标识, 防止指纹滥用; 设备指纹 / 风控 SDK 不应依赖其格式或内容. - 健康类权限拆分:
BODY_SENSORS拆为READ_HEART_RATE等粒度权限; 本地网络权限ACCESS_LOCAL_NETWORK开始 rollout (阶段 opt-in), 涉及局域网通信的 SDK 需提前适配. - 不把预览期或厂商特性写成所有设备统一行为; 以正式 API 文档和兼容性框架结果为准.
六, Android 17 / API 37
截至 2026-08-10, Android 17/API 37 正式版已于 2026-06-16 发布. 当前 Beta 指 Android 17 后续 QPR (季度平台发布) 预览, 不应倒推为 Android 17 正式版仍处于 Beta. 正式 API 37 的适配以 Android 17 overview/release notes 为准; QPR Beta 的新增或变更行为须按对应 QPR release notes 单独核验.
targetSdk 37 关键变化 (按 Android 17 行为变更页核验):
- 大屏 resizability / orientation 无开发者 opt-out: 目标 API 37 应用在 sw ≥ 600dp 大屏上须全自适应, 系统忽略
screenOrientation,resizeableActivity与 aspectRatio 设置 (游戏与用户显式选择除外). - 本地网络访问须运行时权限
ACCESS_LOCAL_NETWORK(隶属 NEARBY_DEVICES 组); 已授权 NEARBY_DEVICES 的用户不重复弹窗. - Safer DCL 扩展到 native:
System.load()加载的.so必须只读, 否则抛UnsatisfiedLinkError; 设备指纹 / 风控 SDK 需复核 so 加载路径与写入. static final字段真正不可变 (反射写入抛异常, JNISetStaticLongField等致崩溃);MessageQueue改 lock-free 实现, 反射其私有字段或方法的代码可能失效.- 明文 HTTP 默认禁用 (
usesCleartextTraffic废弃); 证书透明度默认开启, 影响自定义 CA 与抓包场景 (targetSdk 37). - SMS OTP 消息对非默认短信应用默认拦截 3 小时; 背景音频播放 / 音频焦点请求收紧.
| 维度 | 当前结论 |
|---|---|
| SDK/API | Android 17 正式 API 37; QPR Beta 使用其对应预览 SDK/API |
| 发布状态 | Android 17 正式发布; 后续 QPR 仍可能处于 Beta |
| 开发行动 | 以 API 37 正式 SDK 做兼容与 target 升级验证; 需要采用 QPR 行为时另建预览验证矩阵 |
| 文档策略 | 正式版结论引用 Android 17 一手资料; 每次 QPR Beta/RC 更新后重新核验预览结论 |
七, Google Play target API 要求
截至 2026-08-10, Google Play 的 API 36 target 要求从 2026-08-31 起生效; API 37 不是当前强制线. 具体截止日期会变化, 发布前必须重新核验 Play Console 和官方 target API requirements 页面.
八, TargetSDK 升级 Playbook
- 建立变化清单: 按系统版本, targetSdk, 安装状态和设备条件分类.
- 扫描 manifest, 权限, 前台服务, 通知, 存储, 闹钟, 后台启动和 native 库.
- 分阶段提高
compileSdk与targetSdk, 不要把工具链升级和业务行为修改混成一次不可回退的大提交. - 覆盖新安装, 覆盖升级, 权限已拒绝, 旧数据迁移, 后台恢复, 大屏和低内存设备.
- 通过灰度, Android vitals, 崩溃/ANR/权限漏斗观察影响, 并保留回滚路径.
九, 权限矩阵与 edge-to-edge 迁移清单
| 业务目标 | 推荐入口 | 用户拒绝后的行为 | 版本条件 |
|---|---|---|---|
| 发送通知 | POST_NOTIFICATIONS | 不发通知, 页面仍可使用 | Android 13+ 运行时权限 |
| 选一张照片 | 系统 Photo Picker | 允许取消, 不要求存储权限 | 可用时优先; 否则按兼容路径 |
| 读取用户选择的媒体 | picker 返回的 URI + 持久授权 (若适用) | 显示重新选择入口 | 不将 URI 权限等同文件路径权限 |
| 持续定位 | 先前台定位, 再按业务解释后台需求 | 降级为前台功能 | 需结合系统, targetSdk 和政策核验 |
迁移 edge-to-edge 时逐项完成: 确认目标系统 /targetSdk 条件; 根布局启用 edge-to-edge; 将 systemBars, cutout, IME Insets 作为布局输入; 验证列表末项, 底部按钮和输入框的导航栏/键盘遮挡; 测试手势导航, 三键导航, 深色模式, RTL, 大屏和旋转; 移除固定状态栏高度. 症状 “底部 CTA 被遮挡” 的证据是对应窗口模式下 Insets 日志/截图, 修复是消费正确 Insets, 验证是设备矩阵而非单一模拟器.
高频面试题
Q1: compileSdk, targetSdk, minSdk 有什么区别?compileSdk 决定编译时可用 API; targetSdk 表示应用已针对相应行为变化完成适配, 并会触发对应兼容规则; minSdk 决定最低安装版本. 三者不是同一个 “支持版本”.
Q2: 如何回答一次 targetSdk 升级?
先给版本与截止日期, 再按行为变化清单, 代码改造, 安装 / 升级测试, 灰度指标和回滚方案展开, 并说明哪些变化对所有应用生效, 哪些由 targetSdk 触发.
Q3: Android 17 是否已经正式发布?
截至 2026-08-10 已于 2026-06-16 正式发布; 后续 QPR Beta 与 Android 17 正式版是不同发布轨道.
易错点 / 追问
- 不要把 Play 上架政策当成 Android 系统发布时间线.
- 不要只说 “适配 Android 15/16”, 必须补 targetSdk 与设备条件.
- 不要把预览版 release notes 当成不会变化的最终契约.
- 权限, 后台任务, 前台服务和商店政策属于易变内容, 发布前应由工程与合规共同复核.
版本与参考资料
- 最后核验: 2026-08-10
- 稳定性: Android 14–17 为已发布平台; Android 17 后续 QPR 预览可能仍为 Beta
- Android 16 overview
- Android 16 behavior changes
- Android 17 overview
- Android 17 behavior changes
- Android 17 behavior changes all apps
- Android 17 release notes
- Android 17 QPR1 release notes
- Android Developers Blog
- 正式发布日期的具体 Blog 公告 URL 应在发布前复核; 本次候选 URL 返回 404, 未保留为参考链接.
- Google Play target API requirements