谷歌从2022年2月开始启动 Android 13 开发者预览版计划,将于2022年6月的 Beta版3 达成“平台稳定性”里程碑,并预计在今年年底发布最终版本。谷歌建议开发者将“平台稳定性”里程碑作为规划最终兼容性测试和公开发布的目标。本次新版本主要涵盖了开发者工作效率、图形、性能、电池、隐私权和安全方面的变更。对此,MobTech袤博科技资深Android开发工程师将结合最新的开发者预览版,解读Android 13在应用开发中需要注意的要点。
针对Android 13 公布的新特性及变化,MobTech将持续关注,并按照谷歌建议进行对应的适配,从而保证旗下开发者服务相关产品的用户体验。我们的适配工作主要聚焦于隐私、安全的适配、功能兼容适配测试和灰名单的适配,当前ShareSDK、MobLink、SecVerify、SMSSDK基础功能正常,MobPush、MobAdPush适配工作正在进行,预计7月份完成。
Android 13 环境配置
- 通过SDK Manager 下载Android SDK Build-Tools 33
- 更新应用的 build 配置
- AGP 7.0.0 或更高版本
- AGP 4.2.0 或更低版本
3. Pixel手机刷入,需前往Android开发者平台获取相应的image或在AS中下载Android 13模拟器
新功能使用
1. 带主题的应用图标
从 Android 13 起,用户可以选择启用带主题的应用图标。借助此功能,用户可以调节受支持的 Android 启动器中应用图标的色调,以继承所选壁纸和其他主题的配色。
2. 按应用设定的语言偏好设置
Android 13 针对支持多种语言的应用引入了以下新功能:
① 使应用可在运行时设置在界面中使用其他语言的 API
② 允许用户为每个应用选择首选语言的系统设置
③ 不支持多种语言的应用不受这些变更的影响
使用方式:
① 使用 AndroidX 支持库来实现
② 使用 Android 框架 API 来实现
3. 改进了日语文本换行
现在,TextView 可以按 Bunsetsu(最小自然语素单元)或短语而非字符进行文本换行,从而使日语应用的界面更加美观、易读。
使用方式:
效果如下:
图片上半部分是未启用短语样式的日语文本换行,下半部分是启用了短语样式的日语文本换行。
4. 可编程的着色器
Android 13 添加了对可编程 RuntimeShader 对象的支持,其行为是使用 Android 图形着色语言 (AGSL) 定义的。AGSL 与 GLSL 共用大部分语法,但可用于 Android 渲染引擎中以自定义 Android 画布中的绘制行为以及过滤 View 内容。Android 在内部使用这些着色器来实现涟漪效果、模糊以及拉伸滚动,并且 Android 13 能为应用制作类似的高级效果。
5. 照片选择器
Android 13 包含对新照片选择器工具的支持。此工具为用户提供了一种安全的内置媒体文件选择方式,让其无需向应用授予对整个媒体库的访问权限。
使用方式:
① 单选模式下启动照片选择器
② 选择多张照片或多个视频声明 android.provider.extra.PICK_IMAGES_MAX 的值,该值表示在向用户显示时照片选择器中显示的媒体文件数量上限。
处理照片选择器结果:
6. 针对附近 Wi-Fi 设备的新运行时权限
Android 13 在 NEARBY_DEVICES 权限组中引入了新的运行时权限NEARBY_WIFI_DEVICES,适用于管理设备与附近 Wi-Fi 接入点连接情况的应用,可满足各种Wi-Fi 用例。
另外在以 Android 13 为目标平台时,如果应用不会通过 Wi-Fi API 推导物理位置,请在应用的清单文件中将 usesPermissionFlags 属性设为 neverForLocation,如以下代码段所示。
由于 NEARBY_WIFI_DEVICES 权限仅适用于 Android 13 或更高版本,因此开发者应保留对 ACCESS_FINE_LOCATION 的所有声明,以便在您的应用中提供向后兼容性。
注意事项:
① 以下API仍需要位置信息权限
② 检查需要新权限的 API
7. 可由开发者降级的权限
从 Android 13 开始,应用可以撤消先前由系统或用户授予的运行时权限。此 API 可以帮助应用保护用户的隐私。
使用方式:
注意事项:
撤消是异步发生的,会终止与应用的 UID 相关联的所有进程。
8. APK 签名方案 v3.1
Android 13 可支持 APK 签名方案 v3.1,此方案在现有的 APK 签名方案 v3 的基础上进行了改进,解决了 APK 签名方案 v3 的一些已知问题。
变更适配
1. 使用 JobScheduler 改进预提取作业处理
利用 JobScheduler,应用可使用 JobInfo.Builder.setPrefetch() 将特定作业标记为“预提取”作业。这意味着在理想情况下,这些作业应该在应用下一次启动前提前运行,以提升用户体验。过去,JobScheduler 仅使用该信号让预提取作业有机会使用免费或多余的数据。
现在,在 Android 13 中,系统会尝试确定应用下次启动的时间,并根据该估算值运行预提取作业。应用应尝试使用预提取作业来完成他们想要在下次应用启动前完成的任何工作。
影响范围:所有应用。
2. 通知运行时权限
Android 13 中引入了新的运行时权限,用于从应用发送非豁免通知:POST_NOTIFICATIONS。此更改有助于用户专注于最重要的通知。
影响范围: 所有应用。
效果如下:
使用方式:
① 需要在应用的清单文件中声明的权限会显示在以下代码段中:
② 完成与请求其他运行时权限类似的流程
3. 在后台使用身体传感器需要新的权限
Android 13 中引入了“在使用时”访问身体传感器的概念。
如果应用以 Android 13 为目标平台,并且在后台运行时需要访问身体传感器信息,那么除了现有的 BODY_SENSORS 权限外,应用还必须声明新的 BODY_SENSORS_BACKGROUND 权限。
影响范围:
以 Android 13 及更高版本为目标平台的应用。
4. intent 过滤器会屏蔽不匹配的 intent
应用向以 Android 13 或更高版本为目标平台的其他应用的导出组件发送 intent 时,仅当该 intent 与接收应用中的元素匹配时,系统才会传送该 intent。换言之,系统会屏蔽所有不匹配的 intent,但以下情况除外:
- 发送给其他应用的未声明任何 intent 过滤器的组件的 intent。
- 发送给您应用中的其他组件的 intent。
- 由系统发送的 intent。
- 由具有根级特权的用户发送的 intent。
影响范围:
以 Android 13 及更高版本为目标平台的应用。
5. 更安全地导出上下文注册的接收器
为了提高运行时接收器的安全性,Android 13 允许开发者指定应用中的特定广播接收器是否应被导出以及是否对设备上的其他应用可见。
影响范围:
以 Android 13 及更高版本为目标平台的应用。
使用方式:
① 启用 DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED 兼容性框架更改。
② 在应用的每个广播接收器中,明确指明其他应用是否可以向其发送广播,如以下代码段所示。