Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Android 版本适配

最后核验: 2026-08-10. 版本适配必须同时说明系统版本 / API, targetSdk 条件, 安装或升级状态, 设备条件与分发渠道; 不要把系统行为变化和 Google Play 上架要求混为一谈.

一, 适配心智模型

每条变化都按以下四元组记录:

  1. 运行系统版本 / API: 用户设备实际运行什么版本.
  2. targetSdk 条件: 变化对所有应用生效, 还是只对达到某个 target 的应用生效.
  3. 安装状态: 新安装, 覆盖升级和从旧系统升级是否不同.
  4. 设备与豁免条件: 屏幕尺寸, 硬件能力, 权限角色, 企业设备或系统应用是否例外.

Google Play 的 target API 截止日期是分发政策, 不等于某个 Android 版本已经正式发布, 也不等于系统行为对所有应用同时生效.

targetSdk 门槛速查表

集中参考表: 系统侧门槛只对该 targetSdk 的应用生效, 商店侧门槛由 Google Play 分发政策强制; 二者不应混为一谈. 各行详细论证见本篇各版本小节 (二至六节).

targetSdk强制门槛 (系统 / 商店)可选 / 新行为版本
23危险权限运行时申请 (系统)—Android 6
26后台服务执行受限; 大多数隐式广播不可静态注册 (系统)通知渠道Android 8
28FGS 须及时 startForeground 并显示通知; 后台禁止启动 FGS; 明文 HTTP 默认禁用 (系统)FOREGROUND_SERVICE 权限Android 9
29Scoped Storage 默认开启; 后台定位须独立 ACCESS_BACKGROUND_LOCATION (系统)存储可临时 opt-outAndroid 10
30Scoped Storage 强制 (legacy opt-out 失效); 包可见性受限 (系统)单次授权Android 11
31组件须显式 android:exported; 通知 trampoline 受限 (target 31+ 封禁); 精确闹钟需 SCHEDULE_EXACT_ALARM (系统)近似定位可选Android 12
33POST_NOTIFICATIONS 运行时权限; 媒体权限拆分 READ_MEDIA_IMAGES/VIDEO/AUDIO (系统)Photo Picker 优先Android 13
34FGS 须声明类型并匹配权限; 动态广播 / 隐式 Intent 须声明 exported; 后台启动 Activity 收紧 (系统)—Android 14
35edge-to-edge 强制; 16 KB page 支持 (Play 强制, 2025-11-01 起); FGS dataSync/mediaProcessing 单日 6h 上限 (系统)部分屏幕共享 opt-inAndroid 15
36edge-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 623运行时权限, Doze请求前说明用途, 拒绝后保留可继续路径; 坑: 把首次拒绝误判为永久拒绝
Android 826后台执行与广播限制, 通知渠道建渠道, 选择 WorkManager / 前台服务; 坑: 后台直接 startService 或依赖隐式广播唤醒
Android 1029Scoped Storage 起步, 后台定位限制用 MediaStore/SAF, 前台后再请求后台位置; 坑: 把文件路径当稳定 API
Android 1130包可见性, 单次授权, 存储继续收紧为确需查询的包写 <queries>; 坑: 查询不到就假定对方未安装
Android 1231exported 强制声明, 精确闹钟与前台服务限制审计含 intent-filter 的 exported 与权限; 坑: 合并 Manifest 后暴露组件
Android 1333通知运行时权限, 媒体权限拆分按场景请求通知 / 媒体权限, 优先 Photo Picker; 坑: 仍用宽泛存储权限

Android 7/8/9 历史迁移矩阵

下表用于补齐历史版本的迁移思路. 每一行都应同时在对应系统版本与受影响的 targetSdk 条件下验证, 并覆盖新安装和从旧版覆盖升级.

系统版本API关键行为变化影响条件迁移动作验证场景
Android 7.0 文件 URI24跨应用暴露 file:// URI 会触发 FileUriExposedException运行在 API 24+ 且 targetSdk >= 24 的目标应用用 FileProvider 生成 content:// URI, 授予临时 URI 权限在 API 24+ 上分别以目标 API 23 与 24 分享相机附件, 验证 URI 授权和接收方读取
Android 7.0 网络广播24CONNECTIVITY_ACTION 不能通过 Manifest 静态接收运行在 API 24+ 且 targetSdk >= 24 的目标应用; 不将此规则推广到所有隐式广播在需要接收网络变化的期间运行时注册, 并在恢复或执行网络工作前主动校验当前网络状态覆盖冷启动, 已运行进程, 网络切换和恢复场景, 验证业务不依赖静态广播唤醒
Android 7.0 媒体新增广播24ACTION_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 通知渠道26NotificationChannel API 在 API 26+ 可用, 通知可由用户在系统设置中按渠道管理运行 API 26+ 时创建渠道并使用 channel ID; targetSdk >= 26 的具体行为和发布要求须按当前平台规则核验, 不与运行 OS 条件混同为每个用户可理解的通知类别创建稳定渠道, 读取用户在系统设置中的关闭或重要级别选择, 不以代码强行覆盖在 API 25 与 26+, 新安装与升级安装, 渠道关闭和重要级别变更后验证通知展示与降级路径
Android 928面向 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 字段真正不可变 (反射写入抛异常, JNI SetStaticLongField 等致崩溃); MessageQueue 改 lock-free 实现, 反射其私有字段或方法的代码可能失效.
  • 明文 HTTP 默认禁用 (usesCleartextTraffic 废弃); 证书透明度默认开启, 影响自定义 CA 与抓包场景 (targetSdk 37).
  • SMS OTP 消息对非默认短信应用默认拦截 3 小时; 背景音频播放 / 音频焦点请求收紧.
维度当前结论
SDK/APIAndroid 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

  1. 建立变化清单: 按系统版本, targetSdk, 安装状态和设备条件分类.
  2. 扫描 manifest, 权限, 前台服务, 通知, 存储, 闹钟, 后台启动和 native 库.
  3. 分阶段提高 compileSdk 与 targetSdk, 不要把工具链升级和业务行为修改混成一次不可回退的大提交.
  4. 覆盖新安装, 覆盖升级, 权限已拒绝, 旧数据迁移, 后台恢复, 大屏和低内存设备.
  5. 通过灰度, 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 当成不会变化的最终契约.
  • 权限, 后台任务, 前台服务和商店政策属于易变内容, 发布前应由工程与合规共同复核.

版本与参考资料