你的反对对我意义重大!
🔥 Hi,我是小彭。本文已收录到 GitHub · Android-NoteBook 中。这里有 Android 进阶成长路线笔记 & 博客,有气味相投的敌人,欢送跟着我一起成长。(联系方式在 GitHub)
前言
Android 13 开发者预览版从 2022 年 2 月正式启动,3 月份 Google 曾经公布了第 2 个开发者预览版。目前更新的内容次要还是围绕隐衷和平安这个主题,咱们会继续跟进官网的 公布计划表,最终版本预计在今年年底公布。
针对开发者在进行版本适配过程中遇到的问题,咱们建设了 GitHub · AndroidPlatformWiki。咱们心愿站在开发者的视角,全面且粗浅地解读每个 Android 版本更新,以此建设起一个体系化的 Android 零碎适配手册。具体包含:
两个维度
依据内容相关度,咱们将从 2 个维度解读:
- 基于工夫线: 现阶段官网每年会公布一个新的版本,因而有必要以一个 Android 版本为单位,解读该版本波及的新性能与行为变更。这样能够帮忙开发同学理解新版本的更新内容,例如咱们会通过一个文档解读 Android 13 版本的更新内容与适配自查表;
- 基于内容线: 通常一个零碎功能模块会历经多个零碎版本更新才会趋于稳定,因而有必要以一个性能为单位,解读该性能的次要能力以及不同版本的变更和差别。这样能够帮忙开发同学理解该性能在不同版本上的差别,例如咱们会通过一个文档独自解读零碎告诉。
三个等级
依据故障敏感性分级,咱们将零碎变更的兼容性划分为 3 个等级:
- 强制适配❗: 所有利用必须适配,否则会呈现编译不通过、性能不可用或者用户体验受损等问题;
- 举荐适配⭐: 不强制要求适配,但适配的利用将取得更杰出的用户体验或更平安的隐衷爱护等收益;
- 已适配: 利用不须要任何改变就曾经兼容。
两类行为变更
零碎行为变更通常属于以下两种类别之一:
- 面对所有利用的行为变更: 运行在该零碎版本上的所有利用都会影响,而无论利用的 targetSDKVersion 为何。通常应该先针对这些变更进行适配和测试,这有助于用户在新版本零碎上运行你的利用时,用户体验不会受损;
- 以特定 targetSDKVersion 为指标版本的行为变更: 只有 targetSDKVersion 高于或等于零碎版本的利用会影响,通常是影响较大或适配工作量较大的变更,咱们能够了解为一个 Google 留给开发者的适配缓冲。
Android 13 适配自查表(继续更新)
以 Android 13 为指标版本的利用
类别 | 变更 | 兼容性 | 摘要 |
---|---|---|---|
1. 用户体验 | 期待官网更新 …… | / | / |
2. 平安和隐衷设置 | 左近 Wi-Fi 设施运行时权限(新) | 举荐⭐ | 引入了新运行时权限,可使利用扫描左近的 Wi-Fi 感知设施,而无需申请地位信息权限 |
后盾拜访身材传感器运行时权限(新) | 强制❗ | 引入了新的运行时权限,用于更好地治理利用在后盾时拜访身材传感器的行为 | |
IntentFilter 会屏蔽不匹配的 Intent | 已适配 | 当该 Intent 与接管利用中的 <intent-filter> 匹配时,零碎才会传送该 Intent | |
更平安地动静注册播送接收器 | 强制❗ | 利用必须明确指出动静注册的播送接收器是否接管其余利用的播送 | |
3. 性能和电池 | 期待更新 … | / | / |
所有利用
类别 | 变更 | 兼容性 | 形容 |
---|---|---|---|
4. 用户体验 | 多语言反对改良(新) | 举荐⭐ | 引入了一系列新的语言个性优化,用于改善多语言用户体验 |
自适应主题的利用图标(新) | 举荐⭐ | 利用图标色彩能够自适应 Launcher 主题色调调整配色。 | |
5. 平安和隐衷设置 | 告诉运行时权限(新) | 强制❗ | 引入了新的运行时权限,用于治理利用发送零碎告诉的能力 |
可降级权限(新) | 举荐⭐ | 利用能够被动撤销用户已授予的运行时权限 | |
照片选择器(新) | 举荐⭐ | 用户能够只向利用提供特定抉择的图片或视频,而不是间接授予整个媒体库的拜访权限 | |
6. 性能和电池 | 前台服务 FGS 管理器(新) | 已适配 | 引入了前台服务 FGS 管理器性能,能够间接敞开服务和利用 |
JobScheduler 预提取作业优化 | 已适配 | 零碎会更智能地基于机器学习预测利用下次启动的工夫,并依据该估算值执行预提取作业 | |
省电措施改良 | 已适配 | 引入了新的电池省电措施,以便为零碎提供更多办法来治理电池续航工夫 |
第 1~3 节介绍的是以 Android 13 为指标版本的利用行为变更和新性能更新,我将这部分更新总结为 3 局部:
-
- 用户体验(以 Android 13 为指标版本)
-
- 平安和隐衷设置(以 Android 13 为指标版本)
-
- 性能和电池(以 Android 13 为指标版本)
1. 用户体验(以 Android 13 为指标版本)
期待官网更新 ……
2. 平安和隐衷设置(以 Android 13 为指标版本)
2.1 左近 Wi-Fi 设施运行时权限(新性能)
Android 13 零碎引入了新的运行时权限 android.permission.NEARBY_WIFI_DEVICES
左近 Wi-Fi 设施权限,用于治理利用与左近 Wi-Fi 感知设施的连贯。
<manifest ...>
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"/>
<application ...>
...
</application>
</manifest>
在低版本中,利用与左近 Wi-Fi 设施连贯须要用户授予 ACCESS_FINE_LOCATION 准确地位权限,这其实是不合理的设计,因为用户很难了解为什么 Wi-Fi 连贯会跟地位信息无关。从 Android 13 零碎开始,ACCESS_FINE_LOCATION 准确地位权限是可选项,只有利用不会通过 Wi-Fi 推导物理地位信息,就不须要再申请。如果不会,你须要在 Manifest 中显式做出 usesPermissionFlags
申明(这与申明蓝牙设施信息不会用于获取地位信息相似):
<manifest ...>
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"
android:usesPermissionFlags="neverForLocation" />
<application ...>
...
</application>
</manifest>
另外,NEARBY_WIFI_DEVICES 权限是 NEARBY_DEVICES 左近设施权限组的一部分。此权限组在 Android 12 中引入,还蕴含与蓝牙相干的权限。申请该权限组的权限,权限授予对话框会提醒用户批准拜访左近的设施。 能够看出,这次的改变 Google 是心愿连贯 Wi-Fi 设施的权限授予可能给用户更精准的权限性能形容。
相干材料:左近的 Wi-Fi 设施权限
2.2 后盾拜访身材传感器运行时权限(新性能)
Android 13 零碎引入了新的运行时权限 android.permission.BODY_SENSORS_BACKGROUND
后盾身材传感器权限,用于更好地治理利用在后盾时拜访身材传感器(例如心率、体温和血氧饱和度等)的行为。当初利用在后盾应用身材传感器,除了要申请现有的 BODY_SENSORS 权限外,还须要申请 BODY_SENSORS_BACKGROUND 权限(这与 ACCESS_FINE_LOCATION 和 ACCESS_BACKGROUND_LOCATION 的关系相似)。
2.3 IntentFilter 会屏蔽不匹配的 Intent
当您的利用向以 Android 13 或更高版本为指标平台的其余利用的导出组件发送 Intent 时,仅当该 Intent 与接管利用中的 <intent-filter>
元素匹配时,零碎才会传送该 intent。
提醒: 因为我不了解这个个性的真正含意,所以这里间接复制粘贴了官网文档原话。你了解的话在评论里分享下。
2.4 动静注册播送接收器改良
在旧版本中,利用动静注册的 BroadcastReceiver 播送接收器会接管到任何利用发送的播送(除非该接收器应用了利用签名权限爱护),这会让动静注册的播送接收器存在平安危险。从 Android 13 零碎开始,利用动静注册的播送接收器必须显式指出是否容许其余利用拜访,即其余利用是否能够向其发送播送。否则,在动静注册时零碎会抛出 SecurityException。
// 这相当于动态注册 android:exported="true"
context.registerReceiver(sharedBroadcastReceiver, intentFilter, RECEIVER_EXPORTED)
// 这相当于动态注册 android:exported="false"
context.registerReceiver(privateBroadcastReceiver, intentFilter, RECEIVER_NOT_EXPORTED)
3. 性能和电池(以 Android 13 为指标版本)
期待官网更新 ……
第 4~6 节介绍的是针对所有利用的利用行为变更和新性能更新,我将这部分更新总结为 3 局部:
-
- 用户体验(所有利用)
-
- 平安和隐衷设置(所有利用)
-
- 性能和电池(所有利用)
4. 用户体验(所有利用)
4.1 多语言反对改良(新性能)
Android 13 零碎引入了一系列新的语言个性优化,用以改良多语言用户的利用体验:
-
利用级别语言偏好设置: 在旧版本中,用户能够通过零碎设置来全局切换语言。从 Android 13 开始,零碎开始反对利用级别的语言偏好设置,能够在零碎设置中针对每个利用设置,也能够在运行时应用以下 API 设置:
- 平台 API:LocaleManager#setApplicationLocales)
- 兼容库 API:AppCompatDelegate#setApplicationLocales)
-
改良日语文本换行: 从 Android 13 零碎开始,能够通过为 TextView 设置 android:lineBreakWordStyle=”phrase” 来改良日语文本的换行成果。TextView 会依照 Bunsetsu(最小天然语素单元)或短语,而不是单个字符来进行文本换行。例如,下图是启用了短语款式的日语文本换行(下方)和未启用短语款式的日语文本换行(上方)。
-
改良非拉丁字母行高: Android 13 通过应用适宜每种语言的行高,改良了非拉丁文字(例如泰米尔语、缅甸语、泰卢固语和藏语)的显示,可避免字符被裁剪,这个改变须要以 Android 13 为指标版本。例如:
4.2 自适应主题的利用图标(新性能)
Android 8 零碎中引入了自适应图标,能够在不同厂商设施的 Launcher 上显示不同形态的利用图标。 如果说 Android 8 的图标是自适应形态的利用图标,那么 Android 13 就是在此基础上再推出了自适应主题的利用图标 。用户能够调节 Launcher 中的主题色调,利用图标色彩会自适应调整配色。要反对此性能,利用必须在原有的自适应图标 <adaptive-icon> 上减少一张单色图标,例如:
res/mipmap-anydpi-v26/ic_launcher.xml
<adaptive-icon >
<background android:drawable="..." />
<foreground android:drawable="..." />
<monochrome android:drawable="@drawable/myicon" />
</adaptive-icon>
在 Manifest 文件中援用该图标,例如:
<application
...
android:icon="@mipmap/ic_launcher"
...>
</application>
5. 平安和隐衷设置(所有利用)
5.1 告诉运行时权限(新性能)
Android 13 零碎引入了新的运行时权限 —— android.permission.POST_NOTIFICATION
告诉权限,用于治理利用发送零碎告诉的能力。如果用户回绝授予权限,则利用的所有告诉渠道(Channel)都会别屏蔽,这相似于用户在零碎设置中手动敞开利用告诉后产生的行为。 能够看出,这次的改变 Google 是心愿增强对利用告诉行为的治理 ,当初每个新装置的利用都会发一大堆告诉,造成告诉栏总是被一堆不重要的音讯占满,用户只能一个个去敞开告诉开关。
<manifest ...>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<application ...>
...
</application>
</manifest>
与其余运行时权限申请相似,申请告诉权限也应该遵循最小必要准则。倡议是在适合的业务流程节点或者用户体验峰值再申请,以便用户明确理解接管告诉能带来的益处。例如:
提醒: 通过调用 areNotificationsEnabled()),能够判断用户是否已关上利用的告诉开关。
为了升高新权限的影响,从低版本升级到 Android 13 的设施上已装置的利用,零碎会长期授予告诉权限,前提是该利用自身是有告诉的资格的:利用具备告诉渠道,并且用户在低版本时并未敞开该利用的告诉开关。
- 以 Android 12 或更低版本为指标版本的利用:长期受权会统一无效,直到用户在告诉权限受权对话框中明确敞开权限;
- 以 Android 13 或更高版本为指标版本的利用:长期受权会继续到首次启动利用为止。
相干材料:
- 告诉运行时权限 —— 官网文档
- 申请利用权限 —— 官网文档
5.2 可降级权限(新性能)
从 Android 13 零碎开始,利用能够被动撤销用户已授予的运行时权限,这可能在不再须要权限后更好地爱护用户隐衷。通过调用 revokeOwnPermissionsOnKill()) 能够撤销特定的权限或权限组。另外,撤销前台权限时,其对应的后盾权限也会被撤销(例如 BODY_SENSORS & BODY_SENSORS_BACKGROUND)。
5.3 照片选择器(新性能)
Android 13 零碎引入了新的 照片选择器 性能,容许用户只向利用提供特定抉择的图片或视频,而不是像旧版本那样间接授予整个媒体库的拜访权限,这个性能与 IOS 14“仅容许利用拜访局部照片”是相似的。图片选择器能够更好地爱护用户隐衷,并且利用不再须要申请媒体库运行时拜访权限。
申请:val maxNumPhotosAndVideos = 10
val intent = Intent(MediaStore.ACTION_PICK_IMAGES)
// 设置获取的图片或视频最大数量
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxNumPhotosAndVideos)
startActivityForResult(intent, PHOTO_PICKER_MULTI_SELECT_REQUEST_CODE)
提醒:文件数量下限的最大数字存在平台限度
MediaStore#getPickImagesMaxLimit()
。
相干材料:照片选择器
6. 性能和电池(所有利用)
6.1 前台服务 FGS 管理器(新性能)
Android 13 零碎引入了前台服务 FGS 管理器性能,它会显示以后正在运行前台服务的利用列表,并且每个利用旁边都有一个“进行”按钮。当用户点击“进行”按钮时,零碎不仅会敞开该前台服务,还会进行整个利用。例如:
能够看出,这次改变 Google 是心愿进步用户对前台服务的控制性 。在旧版本的前台服务并没有间接的进行按钮,只有一些些敌对的利用会在前台服务告诉中应用可操作性的敞开按钮。
相干材料:前台服务 (FGS) 工作管理器
6.2 JobScheduler 预提取作业优化
JobScheduler 预提取作业是 Android 9 引入的机制,通过调用 JobInfo.Builder.setPrefetch(true)) 可能将该作业标记为“预提取”作业,现实状况下,开发者的预期是该作业应该在利用下一次启动前一点运行,以晋升用户体验。
在旧版本中,零碎只会在有短缺的过剩资源时,才会容许预提取作业运行。从 Android 13 开始,零碎会更智能地基于机器学习预测利用下次启动的工夫,并依据该估算值执行预提取作业。此外,预提取工作也不再容许设置最初执行期限 setOverrideDeadline(long))。
6.3 省电措施改良
Android 13 零碎引入了一些新的电池省电措施,以便为零碎提供更多办法来治理电池续航工夫。
- 更新了利用进入“受限”待机分区的规定: App Standby Buckets 利用待机分区是 Android 9 引入的电池治理性能,“受限”待机分区是 Android 12 新增的待机分区,次要面向耗费大量系统资源的利用(目前有“沉闷、工作集、罕用、极少应用、受限、从未应用”期待机分区);
- 更新了“受限”后盾电池电量的新限度: 后盾电量限度是 Android 9 引入的电池治理性能,可能让用户调整利用处于后盾运行时能够执行的工作量(目前有“无限度、优化(默认)、受限”等选项);
- 新增一个电量揭示零碎告诉: Android 13 引入了一个新的零碎告诉,当利用在 24 小时内耗费了大量电池电量时会显示;
- 新增一个前台服务揭示零碎告诉: Android 13 引入了一个新的零碎告诉,当利用的某项前台服务在 24 小时内至多运行了 20 小时时会显示;
相干材料:电池资源利用率
7. 总结
目前 Android 13 版本还处于开发者预览阶段,预计年底才会正式公布。关注我,带你理解更多,咱们下次见。
以下变更绝对冷门,实用价值较低,本文暂且按住不表:
- 新性能 – 用户体验 – 快捷磁贴搁置 API
- 新性能 – 用户体验 – 多语言用户 – 文本转换 API & Unicode 库更新
- 新性能 – 用户体验 – 更快断字 & 黑白矢量字体 & 蓝牙 LE 音频 & MIDI 2.0
- 新性能 – 隐衷平安 – APK 签名 v3.1
- 新性能 – 图形 – 可编程的着色器
- 新性能 – 外围性能 – OpenJDK 11 更新
你的点赞对我意义重大!微信搜寻公众号 [彭旭锐],心愿大家能够一起探讨技术,找到气味相投的敌人,咱们下次见!