目录
前言
第1章 绪论:Android版本演进与适配原则
-
1.1 版本号与API等级速查(更新至API 37)
-
1.2 关键适配概念:minSdk、targetSdk、compileSdk
-
1.3 全版本兼容性策略总览
第2章 Android 5.0/5.1 Lollipop:从Dalvik到ART的跨越
-
2.1 版本核心变化
-
2.2 开发者适配指南
第3章 Android 6.0 Marshmallow:运行时权限时代
-
3.1 变化概览
-
3.2 适配方案
第4章 Android 7.0/7.1 Nougat:多窗口与文件访问革命
-
4.1 关键变更
-
4.2 适配步骤
第5章 Android 8.0/8.1 Oreo:通知渠道与后台限制
-
5.1 重要变化
-
5.2 适配实践
第6章 Android 9 Pie:刘海屏与隐私收紧
-
6.1 新特性与行为变更
-
6.2 适配方法
第7章 Android 10:分区存储与折叠屏元年
-
7.1 重大改变
-
7.2 迁移指南
第8章 Android 11:强制分区存储与权限透明度
-
8.1 核心变化
-
8.2 适配策略
第9章 Android 12/12L:Material You与大屏优化
-
9.1 视觉与行为变更
-
9.2 适配工作
第10章 Android 13:预测返回与细分媒体权限
-
10.1 关键变更
-
10.2 适配要点
第11章 Android 14:部分照片权限与前台服务透明
-
11.1 新变化
-
11.2 适配实践
第12章 Android 15:强制边缘到边缘与16KB页面
-
12.1 强制行为变更
-
12.2 迁移与适配
第13章 Android 16:精细化隐私与下一代媒体体验
-
13.1 版本演进概览:年度双版本策略
-
13.2 强制适配清单:以Android 16为目标平台
-
13.3 新API与体验升级适配建议
-
13.4 影响所有应用的行为变更
第14章 Android 17:系统级智能与全面安全加固
-
14.1 版本演进方向:迈向自适应优先
-
14.2 强制适配清单:以Android 17为目标平台
-
14.3 新API与体验升级适配建议
-
14.4 影响所有应用的行为变更
第15章 未来已来:跨版本适配工具与最佳实践
-
15.1 善用AndroidX与Jetpack库
-
15.2 兼容性测试策略
-
15.3 废弃API的平滑过渡
-
15.4 年度targetSdk升级工作流
附录
-
附录A API等级与Android版本对照表(更新至37)
-
附录B 常见适配问题排查清单(更新至Android 17)
前言
Android 系统自5.0起进入全新的设计语言和运行时时代,每个大版本都引入了影响应用行为、隐私和性能的底层变更。作为开发者,必须在拥抱新特性的同时,确保应用在旧设备上运行如常。从 Android 16 开始,Google 开启了年度双版本发布策略,意味着开发者需要更快地适应平台变化。同时,隐私和安全成为贯穿每次更新的主旋律。本指南第二版,在涵盖经典版本适配的基础上,重点深度剖析 Android 16 和 17 带来的颠覆性变更,为开发者提供一份面向未来的、可实战的适配地图。

第1章 绪论:Android版本演进与适配原则
1.1 版本号与API等级速查(更新至API 37)
| 正式名称 | 版本号 | API级别 |
|---|---|---|
| Lollipop | 5.0 | 21 |
| Lollipop | 5.1 | 22 |
| Marshmallow | 6.0 | 23 |
| Nougat | 7.0 | 24 |
| Nougat | 7.1 | 25 |
| Oreo | 8.0 | 26 |
| Oreo | 8.1 | 27 |
| Pie | 9 | 28 |
| Android 10 | 10 | 29 |
| Android 11 | 11 | 30 |
| Android 12 | 12 | 31 |
| Android 12L | 12.1 | 32 |
| Android 13 | 13 | 33 |
| Android 14 | 14 | 34 |
| Android 15 | 15 | 35 |
| Android 16 | 16 | 36 |
| Android 17 | 17 | 37 |
1.2 关键适配概念
-
minSdkVersion:应用支持的最低系统,决定了可用的API集合。
-
targetSdkVersion:应用目标版本,系统会为该版本启用新行为或兼容模式。Google Play 强制要求 targetSdk 不得过低(2024年起不得低于34)。
-
compileSdkVersion:编译版本,通常设为最新可用API,以便使用新API并在编译期发现问题。
1.3 全版本兼容性策略
-
在代码中通过
Build.VERSION.SDK_INT判断运行时版本,优雅降级。 -
使用
AndroidX库代替原生API,它内部处理了大量版本兼容。 -
将新特性封装为可选组件,对低版本提供替代UI。
-
遵循“先编译适配,再运行时适配”的顺序升级 targetSdk。
第2章 Android 5.0/5.1 Lollipop:从Dalvik到ART的跨越
2.1 版本核心变化
-
ART取代Dalvik:安装时预编译(AOT),提高运行效率,但首次安装时间变长,占用空间增加。应用需确保兼容新的运行时,特别是使用了JNI或字节码织入的框架。
-
Material Design:全新的设计语言,提供阴影、触摸反馈、过渡动画。
-
JobScheduler:用于在合适时机执行后台任务,更省电。
-
通知系统增强:锁屏通知、浮动通知(Heads-up)、通知优先级。
-
64位支持:ARMv8、x86_64 平台需要提供对应 .so 文件。
-
Camera2 API与OpenGL ES 3.1。
-
5.1 新增多SIM卡支持、设备保护(防恢复出厂设置)。
2.2 开发者适配指南
-
主题迁移:使用
Theme.AppCompat或Theme.Material,继承Material风格。 -
构建64位库:在
jniLibs中提供arm64-v8a和x86_64目录。 -
告别隐式广播:早期静态注册广播可能会被唤醒效率优化,开始考虑动态注册。
-
通知兼容:使用
NotificationCompat.Builder,最低支持到 API 21 的特性。 -
测试ART兼容性:确保反射、JNI调用在ART下无异常,避免使用过时的编译器假设。
第3章 Android 6.0 Marshmallow:运行时权限时代
3.1 变化概览
-
运行时权限模型:危险权限必须在运行时动态申请(如相机、定位、通讯录),用户可在设置中随时撤销。
-
Doze与App Standby:设备闲置时推迟网络访问和后台任务,以节省电量。
-
指纹识别API:原生支持指纹认证。
-
移除了对 Apache HTTP 客户端的支持。
-
即时应用(免安装)初步概念引入。
3.2 适配方案
-
动态权限请求:
-
使用
ActivityCompat.checkSelfPermission()和requestPermissions()。 -
在
onRequestPermissionsResult()中处理结果。 -
引入“权限说明”UI,在用户拒绝后提供解释并引导至设置页面。
-
-
Doze模式适配:
-
后台任务改用
JobScheduler或GcmNetworkManager。 -
推迟非紧急同步,监听设备空闲状态退出做收尾。
-
-
HTTP客户端迁移:
-
移除
org.apache.http依赖,改用HttpURLConnection或 OkHttp。 -
如在库中有遗留,添加
useLibrary 'org.apache.http.legacy'仅作临时方案。
-
-
指纹API适配:使用
FingerprintManager(API 23),但强烈建议升级至BiometricPrompt(AndroidX)以向后兼容。
第4章 Android 7.0/7.1 Nougat:多窗口与文件访问革命
4.1 关键变更
-
多窗口模式:分屏、画中画(仅TV,8.0全面支持),Activity可能不处于全屏,需处理配置变更。
-
通知增强:支持直接回复、捆绑通知、自定义样式。
-
JIT编译器回归:与AOT协同,安装快、运行优化,缩短安装时间。
-
Data Saver:用户启用后,应用应减少流量消耗。
-
文件URI限制:
file://URI 在跨应用分享时触发FileUriExposedException,必须使用FileProvider。 -
7.1 新增应用快捷方式(App Shortcuts)与圆形图标资源。
4.2 适配步骤
-
多窗口适配:
-
在
AndroidManifest.xml中设置android:resizeableActivity(或设为false若暂不支持)。 -
在
onMultiWindowModeChanged()中调整UI,确保约束布局适应不同尺寸。
-
-
FileProvider 强制迁移:
-
定义
FileProvider,在 Manifest 注册。 -
使用
FileProvider.getUriForFile()获取 content URI,通过Intent.setFlags(FLAG_GRANT_READ_URI_PERMISSION)授权。
-
-
通知直接回复:使用
RemoteInput结合NotificationCompat实现。 -
应用快捷方式:创建
shortcuts.xml并配置静态/动态快捷方式,支持长按拖拽。 -
圆形图标:提供
ic_launcher_round.png或矢量图。
第5章 Android 8.0/8.1 Oreo:通知渠道与后台限制
5.1 重要变化
-
通知渠道(Notification Channel):必须指定渠道,用户可按渠道管理通知,不创建渠道将无法展示通知。
-
后台执行限制:后台应用无法启动Service,后台定位受限。推荐
JobIntentService或WorkManager。 -
自适应图标:要求提供前景层和背景层,支持厂商蒙版(圆形、方形等)。
-
画中画(PIP):手机端Activity支持进入画中画模式。
-
自动填充框架:应用需适配以让自动填充正确识别。
-
字体作为资源:
res/font,可下载字体。 -
8.1 神经网络API、安全浏览支持。
5.2 适配实践
-
必须创建通知渠道:
-
在
Application.onCreate()或发送通知前调用NotificationChannel并createNotificationChannel()。 -
渠道一旦创建,部分属性只能通过卸载或系统设置更改,提前规划重要性等级。
-
-
后台服务改造:
-
替换普通
Service.startService()为ContextCompat.startForegroundService()并在5秒内调用startForeground()。 -
使用
WorkManager或JobScheduler处理延迟任务。
-
-
自适应图标:
-
通过 Image Asset Studio 创建
ic_launcher.xml与前景/背景图层,移除老式图标形状。
-
-
画中画适配:
-
在 Activity 清单中设置
android:supportsPictureInPicture。 -
在
onPictureInPictureModeChanged()中隐藏无关UI,处理全屏过渡。
-
-
自动填充:为
EditText等视图设置android:autofillHints属性。
第6章 Android 9 Pie:刘海屏与隐私收紧
6.1 新特性与行为变更
-
刘海屏支持:
DisplayCutoutAPI,需要扩展内容至刘海区域或避开。 -
非SDK接口限制:对隐藏API的反射访问被列入灰名单/黑名单,目标API 28会收到警告或崩溃。
-
后台限制扩展:后台应用无法访问麦克风和摄像头,前台服务需要声明
FOREGROUND_SERVICE权限。 -
Wi-Fi扫描限制:后台应用扫描受限,需权限。
-
ART性能提升、隐私增强(http请求默认不允许明文,要求TLS)。
-
旋转为主屏幕统一方向。
6.2 适配方法
-
刘海屏适配:
-
使用
WindowInsets.getDisplayCutout()检测刘海位置,将可滚动内容避开,或使用LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES等模式沉浸。
-
-
隐藏API限制应对:
-
移除源码中对反射调用隐藏方法的依赖,寻找公共替代API。
-
若必须使用,短期通过“免名单”机制或设置targetSdk低于28,但最终必须消除。
-
-
明文流量禁止:
-
配置
network_security_config.xml,允许特定域名的明文(如本地测试),其余使用HTTPS。 -
设置
android:usesCleartextTraffic="true"仅供测试,生产环境移除。
-
-
前台服务权限:在 Manifest 声明
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />。
第7章 Android 10:分区存储与折叠屏元年
7.1 重大改变
-
分区存储(Scoped Storage):默认开启,应用只能访问自身专属目录和公共媒体集合,访问外部文件需 SAF 或 MediaStore。
-
后台定位权限分离:必须请求
ACCESS_BACKGROUND_LOCATION。 -
折叠屏支持:
onResume/onPause处理多窗口变化,resizeableActivity必须为 true。 -
5G API、热修复限制收紧。
-
ART 优化,系统级深色主题。
-
生物识别API升级,推荐使用 BiometricPrompt。
7.2 迁移指南
-
适配分区存储:
-
若 targetSdk=29,可在 Manifest 中设置
requestLegacyExternalStorage="true"暂时使用旧存储模式,但 targetSdk=30+ 将失效。 -
迁移文件访问逻辑:使用
MediaStore或Storage Access Framework。 -
应用私有文件移至
Context.getExternalFilesDir()等。
-
-
定位权限适配:
-
当需要后台定位,先请求前台定位
ACCESS_FINE_LOCATION,再在适当时机引导用户授予“始终允许”。 -
检查
ActivityCompat.shouldShowRequestPermissionRationale()解释原因。
-
-
深色主题支持:
-
实现
-night资源目录或使用AppCompat.DayNight主题。 -
通过
Configuration.uiMode动态切换。
-
-
折叠屏/多窗口:测试在多窗口模式下Activity重建,确保状态保存/恢复正常。
第8章 Android 11:强制分区存储与权限透明度
8.1 核心变化
-
强制分区存储:
requestLegacyExternalStorage失效,所有应用必须适配。 -
一次性权限:用户可授予“仅限这一次”,应用应在每次使用前检查权限。
-
权限自动重置:数月未使用的应用权限被系统重置,需要在启动时重新请求。
-
后台位置访问细化:必须先请求前台,才能请求后台,且不能一次性操作。
-
非SDK接口限制更严。
-
消息气泡API、5G动态计费。
8.2 适配策略
-
彻底迁移分区存储:
-
使用
MANAGE_EXTERNAL_STORAGE仅限文件管理器、清理工具等特殊应用,且需 Google Play 审核。 -
媒体文件统一使用
MediaStore,批量操作用ContentResolver。
-
-
权限透明化:
-
引入“权限状态检查”函数,在应用返回前台时
checkSelfPermission,若失去及时引导。 -
监听权限自动重置迹象,提供用户教育。
-
-
后台定位流程改造:
-
分步引导:先获取前台位置,再在需要后台时单独触发跳转设置页面。
-
-
接收隐式广播限制:减少静态广播注册,检查受影响的系统广播列表。
第9章 Android 12/12L:Material You与大屏优化
9.1 视觉与行为变更
-
Material You 动态颜色:
Material3主题支持莫奈取色,系统壁纸驱动调色板。 -
应用启动画面强制:即使未自定义,系统也会显示默认启动画面;可自定义
SplashScreenAPI。 -
更严的 PendingIntent:必须声明可变性
FLAG_IMMUTABLE或FLAG_MUTABLE。 -
确切闹钟权限:需要
SCHEDULE_EXACT_ALARM普通权限(系统默认可授予),但应合理使用。 -
应用休眠(Hibernation):长时间未使用应用缓存被清除,权限撤销。
-
WebView SameSite cookie 行为。
-
导出的组件必须显式声明
exported:targetSdk 31 强制。 -
12L 大屏适配:任务栏,多列布局,滑动分屏。
9.2 适配工作
-
动态颜色主题:
-
迁移到
Material Design 3主题,使用dynamicColor。 -
为不支持动态颜色的设备提供回退颜色。
-
-
启动画面定制:
-
使用
SplashScreen.setKeepOnScreenCondition控制延长显示,可设图标、背景色。 -
移除旧式
SplashActivity,避免双闪。
-
-
PendingIntent 更新:所有创建 PendingIntent 的地方添加
FLAG_IMMUTABLE或当需要更新时FLAG_MUTABLE。 -
组件导出检查:检查 AndroidManifest 中所有
<activity>、<service>、<receiver>,显式设置android:exported。 -
大屏适配:
-
使用
WindowSizeClasses和规范布局(SlidingPaneLayout、ListDetail)。 -
响应系统任务栏,保证点击、手势区域不被遮挡。
-
第10章 Android 13:预测返回与细分媒体权限
10.1 关键变更
-
预测性返回手势:当用户滑动返回时,系统提前绘制 home 目标,视觉上更流畅。应用需适配
OnBackPressedDispatcher回调,放弃onBackPressed()。 -
通知权限:通知需要运行时权限
POST_NOTIFICATIONS,用户可拒绝。 -
细粒度媒体权限:不再使用
READ_EXTERNAL_STORAGE,改为READ_MEDIA_IMAGES、READ_MEDIA_VIDEO、READ_MEDIA_AUDIO。 -
Wi-Fi 权限变化:
NEARBY_WIFI_DEVICES替代位置权限用于扫描附近 Wi-Fi 设备。 -
每应用语言偏好:用户可为每个应用设置不同语言。
-
后台使用身体传感器需要权限。
10.2 适配要点
-
预测返回适配:
-
在
AndroidManifest.xml中开启enableOnBackInvokedCallback="true"(当 compileSdk>=33)。 -
将
onBackPressed()迁移到addCallback注册的自定义回调。
-
-
通知权限请求:
-
必须在显示通知前检查
areNotificationsEnabled(),并在合适的时机请求权限,不能干扰启动体验。 -
提示用户通知的重要性,若被拒绝,提供导航至设置。
-
-
媒体权限迁移:
-
同时声明新旧权限,运行时根据 SDK 版本选择请求:
kotlin
if (Build.VERSION.SDK_INT >= 33) { requestPermissions(arrayOf(READ_MEDIA_IMAGES, READ_MEDIA_VIDEO)) } else { requestPermissions(arrayOf(READ_EXTERNAL_STORAGE)) }
-
-
语言偏好:可使用
LocaleManager进行应用内语言切换,尊重系统级设置。 -
Wi-Fi 设备扫描:请求
NEARBY_WIFI_DEVICES,若还需位置则声明ACCESS_FINE_LOCATION。
第11章 Android 14:部分照片权限与前台服务透明
11.1 新变化
-
部分照片/视频权限:用户可以选择仅授予部分照片或视频访问,应用会收到占位 URI 列表,且更改后不再发送重载广播。
-
前台服务类型声明强制:每种前台服务必须在清单中声明对应的
foregroundServiceType(如camera、location、health等),且必须请求相应权限。 -
更严的全屏通知权限:发全屏通知(如闹钟、来电)需
USE_FULL_SCREEN_INTENT权限,系统默认仅授予部分应用。 -
精确闹钟权限回收:新安装的应用(targetSdk 34+)默认没有
SCHEDULE_EXACT_ALARM,用户可拒绝。 -
隐式Intent要求更严:发送无包名的 intent 只在声明导出的组件接收。
11.2 适配实践
-
部分媒体权限适配:
-
重新授权后,存储访问框架和
MediaStore返回的 cursor 可能只包含选中的项目,应用不能假设获得全部文件。 -
使用
IntentSender启动系统选择器引导用户重新选择。
-
-
前台服务类型完整声明:
-
根据服务用途声明
android:foregroundServiceType="location|camera"等。 -
在启动服务前检查类型对应的权限,如
FOREGROUND_SERVICE_LOCATION需同时持有位置权限。
-
-
全屏通知适配:
-
针对闹钟、来电等必须使用全屏通知的场景,调用
NotificationManager.canUseFullScreenIntent()检查,若未授权则引导用户设置。
-
-
精确闹钟权限处理:
-
在设置闹钟前检查
AlarmManager.canScheduleExactAlarms(),若返回false提示用户。
-
-
targetSdk 34强制升级:Google Play 已要求 targetSdk 34,必须解决所有相关变更。
第12章 Android 15:强制边缘到边缘与16KB页面
12.1 强制行为变更
-
边缘到边缘强制:targetSdk 35 的应用默认以透明状态栏和导航栏绘制(覆盖模式)。必须处理窗口插图(WindowInsets)以避免内容重叠。
-
16KB 页面大小预备:系统为将来的内存页面大小(从4KB到16KB)提供模拟环境,应用需支持 ELF 对齐,确保原生库不崩溃。
-
私密空间:用户可隔离应用,影响共享数据。
-
前台服务类型更细粒度:添加
foregroundServiceType如specialUse,需要具体权限并向系统说明用途。 -
通知冷却:连续发送过多的通知会被系统暂时静音。
-
API限制与权限组收缩。
12.2 迁移与适配
-
边到边适配:
-
移除
fitsSystemWindows或手动添加WindowInsetsListener,确保关键交互不被系统栏遮挡。 -
使用
ViewCompat.setOnApplyWindowInsetsListener调整内边距,或通过WindowCompat.setDecorFitsSystemWindows(window, false)后自行处理。
-
-
16KB 页面测试:
-
在 Android 15 模拟器中启用 16KB 页面选项,测试所有 .so 文件。
-
使用
-Wl,-z,max-page-size=16384等链接标志重新编译原生库。
-
-
私密空间适配:
-
若应用依赖共享存储或特定设备标识,当用户将应用移入私密空间后行为可能改变,测试备份与恢复逻辑。
-
-
前台服务说明:如需使用
specialUse类型,必须在 Manifest 中声明并通过系统 API 提交理由,否则服务无法启动。 -
通知管理:优化推送频率,合并通知,避免触发冷却。
第13章 Android 16:精细化隐私与下一代媒体体验
13.1 版本演进概览:年度双版本策略
Android 16 标志着 Google 开始实行年度双版本策略。Q2 的主版本包含计划行为变更(即需要适配的变更),Q4 的版本则主要包含新 API,不强制要求适配。开发者应重点关注 Q2 版本中的“以 Android 16 为目标平台”的变更。
13.2 强制适配清单:以Android 16为目标平台
安全
-
更安全的 Intent 解析:系统会针对 Intent 解析机制进行安全强化。适配:检查应用中所有通过隐式 Intent 启动的组件,确保 Intent 的组件、Action 等设置明确,避免被恶意应用劫持。
-
本地网络权限:首次需要用户授权应用访问本地网络。适配:在
AndroidManifest.xml中声明android.permission.ACCESS_LOCAL_NETWORK。当应用需要扫描、连接或与局域网内设备通信时,必须动态请求此权限。 -
健康与健身权限细化:权限系统向
android.permissions.health组过渡。适配:密切关注 Google 官方关于新权限的最终文档。预计需要将现有的BODY_SENSORS等权限替换为更细粒度的健康数据权限,并在运行时动态申请。 -
MediaStore 版本锁定:
MediaStore#getVersion()对每个应用独立,不再是全局版本。适配:移除依赖getVersion()作为全局数据变化锁或同步信号点的逻辑。应改为通过ContentObserver监听特定的 URI 变化。
核心功能
-
自适应布局(大屏):对于大屏设备 (sw>=600dp),系统会忽略
screenOrientation、aspectRatio和resizeableActivity等限制。适配:彻底放弃在代码和清单中硬编码屏幕方向和尺寸限制。应用必须支持多窗口和自由缩放,采用响应式布局。
用户体验
-
预测性返回强制启用:
android:enableOnBackInvokedCallback默认变为true,onBackPressed()和KEYCODE_BACK被忽略。适配:这是最重要的UI适配项。必须全面迁移到OnBackInvokedCallback,并测试所有涉及返回的场景,特别是“返回主屏幕”等系统动画。 -
边缘到边缘禁用选项移除:
windowOptOutEdgeToEdgeEnforcement属性被移除。适配:所有应用强制边缘到边缘显示。必须处理WindowInsets,避免内容与状态栏、导航栏重叠。 -
优雅字体 API 弃用:
elegantTextHeight属性被停用并忽略。适配:移除布局文件和代码中对这个属性的设置,让系统使用默认的字体排版,无需额外操作。 -
应用自带的照片访问控制:用户在照片选择器中,应用请求的权限对应的照片会被预选。用户可以取消选择以撤回访问。适配:逻辑上,应用不能再假设获得存储权限就拥有对所有历史文件的永久访问权。应通过
MediaStore或照片选择器获取最新的、用户确认的文件列表。
连接
-
连接丢失与加密变更的新Intent:提供了更精准的网络状态变化通知。适配:注册并监听这些新的 Intent (需要查阅官方最终文档确定 Action 字符串),以替代过去基于
ConnectivityManager.CONNECTIVITY_ACTION的过时广播监听,从而更精准地响应网络丢失和加密变更。 -
移除蓝牙绑定新方式:可以使用
removeBondAPI。适配:将应用中移除蓝牙设备配对的逻辑,从通过反射等非公开方式,迁移到使用这个公开的removeBondAPI。
13.3 新API与体验升级适配建议
-
高级专业视频 (APV):若应用面向高端视频录制,可研究并集成 APV 编解码器,以实现专业级拍摄和后期制作。
-
相机增强:利用新的色温/色调调整、混合自动曝光模式和夜间模式场景检测,打造媲美原生相机的专业拍摄体验。
-
照片选择器嵌入:使用新 API 将系统照片选择器直接嵌入应用页面,替代自建的简陋图片选择网格,提供一致性更高、隐私更安全的用户体验。
-
触感反馈 API:使用新 API 定义精确的振幅和频率曲线,为应用创造层次更丰富、体验更真实的触感反馈。
-
进度为中心的通知:采用新的通知样式,用于展示用户发起的、有明确完成进度的任务(如下载、上传),该样式在系统UI中拥有更高优先级。
-
启动组件识别:在
ApplicationStartInfo中使用getStartComponent()识别启动来源,针对不同组件(如 Activity、Service 等)优化启动流程。
13.4 影响所有应用的行为变更
-
意图重定向攻击防护:系统默认启用安全加固。适配:检查应用中所有 Intent 重定向的代码,特别是接收外部 Intent 并转发给另一个组件的场景,必须对目标组件进行严格校验和净化。
-
有序广播优先级不跨进程:广播传递顺序不再跨应用保证。适配:移除依赖
android:priority来跨应用控制有序广播接收顺序的逻辑。如果需要与其它应用有严格的时序依赖,应采用更明确的 IPC 方式。 -
三按钮导航支持预测性返回:即使使用经典的三按钮导航,已适配的应用也能看到预测性返回动画。适配:对上一条预测性返回适配是一个补充验证,确保在三种导航模式下都有良好体验。
-
自动主题化图标:系统会自动为应用图标应用主题色。适配:检查应用图标在不同主题壁纸下的显示效果,确保没有视觉异常。最佳实践是提供一个符合规范的、带有透明背景的自适应图标。
第14章 Android 17:系统级智能与全面安全加固
14.1 版本演进方向:迈向自适应优先
Android 17 被官方描述为“向智能系统过渡的开始”,强调“自适应优先”。这意味着应用不仅要在大屏上运行,其体验还要能智能地适配更多外形规格(汽车、电视、AR/VR等)。安全和隐私控制也达到了前所未有的高度。
14.2 强制适配清单:以Android 17为目标平台
安全
-
默认启用 CT(证书透明度):所有 TLS 连接默认要求 CT。适配:确保后端服务器已配置并支持证书透明度。此前的选择启用
enableCertificateTransparency相关代码可以移除,因为已是默认行为。 -
PQC APK 签名:支持后量子密码学签名。适配:在应用的签名流程中,准备并切换到新的 PQC 签名算法,以抵御未来的量子计算机攻击。
-
非优先应用 OTP 保护:即使拥有短信权限,非默认/优先短信应用也无法立即读取 OTP。适配:推荐使用 SMS Retriever API 或 User Consent API 来安全、合规地获取 OTP,放弃直接读取短信数据库获取验证码的旧方法。
-
本地网络权限强制:
ACCESS_LOCAL_NETWORK权限变为强制要求。适配:必须完成 Android 16 中提到的本地网络权限声明和动态请求,否则在 Android 17 上将无法访问任何本地网络设备。 -
启用 ECH:TLS 连接启用加密客户端 Hello。适配:确认服务端支持 ECH。客户端无需额外代码,但需要测试网络连接在 ECH 环境下的稳定性,特别是使用了自定义 SSL Socket 或代理的场景。
核心功能
-
静态 Final 字段不可修改:通过反射等方式修改
static final字段将抛出异常。适配:全面排查应用中所有通过反射、JNI 等非正规手段修改静态常量的代码,必须移除或重构。这是对隐藏 API 限制的进一步收紧。 -
通知自定义视图内存限制:对使用
RemoteViews的自定义通知布局执行更严格的内存检查。适配:检查所有自定义通知布局,大幅简化层级和视图数量,避免使用高分辨率图片,优化内存占用,否则自定义布局可能无法显示。
设备规格
-
大屏限制忽略不可逆:在 Android 16 中可选的退出机制被移除。适配:针对大屏的全响应式、自适应布局是唯一选择。必须彻底完成 Android 16 提到的自适应布局迁移。
隐私权
-
联系人选择器:提供无需权限的系统联系人选择器。适配:强烈建议使用此 API 替代传统的
READ_CONTACTS权限请求。用户无需向应用授予全部联系人权限,即可安全选择特定联系人,极大提升隐私和转化率。
14.3 新API与体验升级适配建议
-
受限制卫星网络:研究并适配低带宽卫星网络环境,确保核心功能在极端网络条件下可用。
-
MetricStyle 通知模板:用于健康、计时器等场景的新型通知模板,提供更美观的数据展示。建议在相关场景下采用。
-
接力:这是一项跨设备场景体验。适配后,用户可在手机、平板、Chromebook 之间无缝接续当前任务。应用需要处理
onContinue或类似回调来保存和恢复完整 UI 状态。 -
系统触发性能分析:ProfilingManager 的新触发器。可在应用稳定阶段集成,利用 ANR、冷启动等系统触发时机自动收集性能追踪信息,用于优化。
14.4 影响所有应用的行为变更
-
屏蔽跨资料环回流量:工作资料和个人资料间的网络隔离更强。适配:如果应用有跨资料通信需求,需使用专有的 API,不能依赖简单的本地环回地址。
-
应用内存限制更严格:系统会强制执行更严格的内存上限,超出可能导致崩溃。适配:应用必须进入“内存优化深水区”。利用内存分析工具排查并根治内存泄漏,优化图片加载和大对象缓存,积极使用
onTrimMemory回收非必要内存。 -
后台音频安全加固:不可见且无前台服务的应用无法播放音频。适配:检查音频播放逻辑,确保在后台播放时,已正确开启并挂载前台服务,否则音频将被系统切断。
-
消息访问权限受限:阻止应用直接访问端到端加密消息。适配:依赖直接读取短信或消息数据库功能的逻辑可能会失效,应使用官方的标准化 API。
-
旋转后恢复默认 IME 可见性:横竖屏切换会重置键盘状态。适配:如果应用需要保持键盘状态,必须在
onConfigurationChanged中监听并手动调用imm.showSoftInput或imm.hideSoftInputFromWindow。
第15章 未来已来:跨版本适配工具与最佳实践
15.1 善用AndroidX与Jetpack库
-
ActivityResultContract替代onActivityResult,自动处理版本差异。 -
WorkManager统一后台任务。 -
BiometricPrompt、NotificationCompat、MediaStore兼容层。 -
AppCompat使新主题可在旧版本呈现。 -
SMS Retriever API 替代内容提供者读取短信,安全获取验证码。
-
OnBackInvokedDispatcher统一处理返回手势。
15.2 兼容性测试策略
-
使用 Android Emulator 创建多个 AVD,覆盖最小与目标API。
-
运行 Firebase Test Lab 进行自动化兼容性测试。
-
检查
StrictMode违规,尽早发现磁盘读写、泄露等问题。 -
针对每个 targetSdk 升级进行专项回归。
-
在开发者选项中开启“应用兼容性更改”,提前模拟未来版本行为。
15.3 废弃API的平滑过渡
-
密切关注
@Deprecated的替代方案,不在新代码中使用。 -
使用
@RequiresApi和@TargetApi注解标记版本相关代码,利用 Lint 提醒。 -
通过
if (Build.VERSION.SDK_INT >= N)保留旧版路径,保证低版本正常运行。
15.4 年度targetSdk升级工作流
-
将
compileSdk提升至最新。 -
解决编译错误、Lint 警告。
-
在模拟器和真机上全面测试。
-
逐步开放给 Beta 用户。
-
确认无重大问题后,更新
targetSdk并发布。
附录
附录A API等级与Android版本对照表(更新至37)
| 正式名称 | 版本号 | API级别 |
|---|---|---|
| Lollipop | 5.0 | 21 |
| Lollipop | 5.1 | 22 |
| Marshmallow | 6.0 | 23 |
| Nougat | 7.0 | 24 |
| Nougat | 7.1 | 25 |
| Oreo | 8.0 | 26 |
| Oreo | 8.1 | 27 |
| Pie | 9 | 28 |
| Android 10 | 10 | 29 |
| Android 11 | 11 | 30 |
| Android 12 | 12 | 31 |
| Android 12L | 12.1 | 32 |
| Android 13 | 13 | 33 |
| Android 14 | 14 | 34 |
| Android 15 | 15 | 35 |
| Android 16 | 16 | 36 |
| Android 17 | 17 | 37 |
附录B 常见适配问题排查清单(更新至Android 17)
-
Android 5.0/5.1:是否已提供64位原生库?通知是否使用
NotificationCompat? -
Android 6.0:是否已完成运行时权限适配?是否替换了Apache HTTP客户端?
-
Android 7.0/7.1:是否已完全使用
FileProvider替代file://URI? -
Android 8.0/8.1:是否已创建通知渠道?后台服务是否已适配?
-
Android 9:是否已适配刘海屏?是否已禁止明文流量?
-
Android 10:是否已开启分区存储适配?是否分离了前后台定位权限?
-
Android 11:是否已完全迁移至分区存储?是否处理权限自动重置?
-
Android 12/12L:所有组件
exported是否已显式声明?PendingIntent是否添加可变性标志? -
Android 13:是否已请求
POST_NOTIFICATIONS权限?是否已适配预测返回手势? -
Android 14:前台服务类型是否已完整声明?是否已处理部分媒体权限?
-
Android 15:是否已强制边缘到边缘?是否测试了16KB页面大小?
-
Android 16:是否已全面迁移到预测性返回?大屏是否已移除方向/尺寸限制?是否声明并请求了本地网络权限?
-
Android 17:是否已移除修改静态
final字段的代码?是否适配了CT和ECH?是否已使用SMS Retriever API获取OTP?后台音频是否绑定前台服务?是否已进行深度内存优化?
&spm=1001.2101.3001.5002&articleId=162224511&d=1&t=3&u=8d204e51a8814d7d9c3c494cfccb2752)
797

被折叠的 条评论
为什么被折叠?



