Android版本适配权威指南(更新至Android 17)

目录

前言

第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级别
Lollipop5.021
Lollipop5.122
Marshmallow6.023
Nougat7.024
Nougat7.125
Oreo8.026
Oreo8.127
Pie928
Android 101029
Android 111130
Android 121231
Android 12L12.132
Android 131333
Android 141434
Android 151535
Android 161636
Android 171737

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 新特性与行为变更

  • 刘海屏支持DisplayCutout API,需要扩展内容至刘海区域或避开。

  • 非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 主题支持莫奈取色,系统壁纸驱动调色板。

  • 应用启动画面强制:即使未自定义,系统也会显示默认启动画面;可自定义 SplashScreen API。

  • 更严的 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_IMAGESREAD_MEDIA_VIDEOREAD_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(如 cameralocationhealth 等),且必须请求相应权限。

  • 更严的全屏通知权限:发全屏通知(如闹钟、来电)需 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),系统会忽略 screenOrientationaspectRatio 和 resizeableActivity 等限制。适配:彻底放弃在代码和清单中硬编码屏幕方向和尺寸限制。应用必须支持多窗口和自由缩放,采用响应式布局。

用户体验

  • 预测性返回强制启用android:enableOnBackInvokedCallback 默认变为 trueonBackPressed() 和 KEYCODE_BACK 被忽略。适配:这是最重要的UI适配项。必须全面迁移到 OnBackInvokedCallback,并测试所有涉及返回的场景,特别是“返回主屏幕”等系统动画。

  • 边缘到边缘禁用选项移除windowOptOutEdgeToEdgeEnforcement 属性被移除。适配:所有应用强制边缘到边缘显示。必须处理 WindowInsets,避免内容与状态栏、导航栏重叠。

  • 优雅字体 API 弃用elegantTextHeight 属性被停用并忽略。适配:移除布局文件和代码中对这个属性的设置,让系统使用默认的字体排版,无需额外操作。

  • 应用自带的照片访问控制:用户在照片选择器中,应用请求的权限对应的照片会被预选。用户可以取消选择以撤回访问。适配:逻辑上,应用不能再假设获得存储权限就拥有对所有历史文件的永久访问权。应通过 MediaStore 或照片选择器获取最新的、用户确认的文件列表。

连接

  • 连接丢失与加密变更的新Intent:提供了更精准的网络状态变化通知。适配:注册并监听这些新的 Intent (需要查阅官方最终文档确定 Action 字符串),以替代过去基于 ConnectivityManager.CONNECTIVITY_ACTION 的过时广播监听,从而更精准地响应网络丢失和加密变更。

  • 移除蓝牙绑定新方式:可以使用 removeBond API。适配:将应用中移除蓝牙设备配对的逻辑,从通过反射等非公开方式,迁移到使用这个公开的 removeBond API。

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 统一后台任务。

  • BiometricPromptNotificationCompatMediaStore 兼容层。

  • 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升级工作流

  1. 将 compileSdk 提升至最新。

  2. 解决编译错误、Lint 警告。

  3. 在模拟器和真机上全面测试。

  4. 逐步开放给 Beta 用户。

  5. 确认无重大问题后,更新 targetSdk 并发布。


附录

附录A API等级与Android版本对照表(更新至37)

正式名称版本号API级别
Lollipop5.021
Lollipop5.122
Marshmallow6.023
Nougat7.024
Nougat7.125
Oreo8.026
Oreo8.127
Pie928
Android 101029
Android 111130
Android 121231
Android 12L12.132
Android 131333
Android 141434
Android 151535
Android 161636
Android 171737

附录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?后台音频是否绑定前台服务?是否已进行深度内存优化?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值