Android 15 估计很多人还没用上,Android 16 这就要来了,官方 2025 年将发布两个大 Android API 版本 :
而对于 Android 16 ,尽管它还是保留了以甜点为主题的命名约定,但在它的代号被命名为 Baklava,而不是以字母 W 开头的甜点(Android 版本的代号一直以字母顺序排列:Android 2.0 Eclair、2.2 Froyo、2.3 Gingerbread...15 Vanilla Ice Cream),而 Android 16 明显打破了这个约定:
并且从 Android 上看, 16 旨在为 Android 建立一个基于主干的开发模型,系统代码将进行更频繁的小代码更改,而不是之前每隔几个月进行一次较大的代码更改,从这点看 Android 16 会是一个较大变化的版本。
ProfilingManager
在 15 的时候 Android 添加了 ProfilingManager,让应用能够使用 Perfetto 请求收集性能分析数据,例如启动或 ANR 等情况,而从 Android 16 开始,ProfilingManager 现在提供了系统触发的分析。
现在 App 可以使用 ProfilingManager#addProfilingTriggers()
来注册接收需要的信息,包括用于基于 Activity 的冷启动的 onFullyDrawn 和 ANR。
kotlin
val anrTrigger = ProfilingTrigger.Builder(
ProfilingTrigger.TRIGGER_TYPE_ANR
)
.setRateLimitingPeriodHours(1)
.build()
val startupTrigger: ProfilingTrigger = //...
mProfilingManager.addProfilingTriggers(listOf(anrTrigger, startupTrigger))
ApplicationStartInfo
同样,在 15 中 Android 添加的 ApplicationStartInfo,用于支持应用查看进程启动的原因、启动类型、开始时间、限制和其他有用的诊断数据。
而 Android 16 添加了 getStartComponent
来区分触发启动的组件类型,从而帮助开发者优化应用的启动流程。
触觉反馈
从 Android 11 开始,系统就增加了对更复杂的触觉效果的支持,更高级的 actuators 可以通过设备定义的语义基元的 VibrationEffect.Compositions
来支持这些效果。
而 Android 16 添加了新的 haptic API ,可以让应用定义触感反馈效果的振幅和频率曲线,同时抽象出设备功能之间的差异:
- VibratorEnvelopeEffectInfo :提供有关振动器硬件功能和限制的信息,如支持的最大控制点数、单个区段的最小和最大持续时间、最大总持续时间等
- VibratorFrequencyProfile:描述不同振动频率下 Vibrator 的输出。
这些新 API 消除了 App 在开发时需要对设备特定功能的 if 判断,开发人员可以直接使用 API 去创建自定义触觉反馈效果。
Job
Android 16 还引入了 JobScheduler#getPendingJobReasons(int jobId)
,它可以返回 Job 待处理的多个原因,比如开发者设置了显式约束条件和系统设置了隐式约束条件:
关于 Job Android 16 还引入了 JobScheduler#getPendingJobReasonsHistory(int jobId)
,从而支持返回最近约束更改的列表:
对于给定的 jobId,返回任务可能一直等待执行的原因的有限历史视图,返回的列表由
PendingJobReasonsInfo
组成,每个对象都包含一个自 epoch 以来的时间戳以及一个ERROR(PendingJobReason constants/android.app.job.JobScheduler.PendingJobReason PendingJobReason constants)
表示
这些 API 调整,可以帮助开发者在调试 Job 时分析无法执行的原因,尤其是在看到某些任务的成功率降低或 Job 完成出现延迟问题时,可以更好地了解到某些 Job 是由于系统定义的约束还是由于显式设置的约束而未完成。
另外,从 Android 16 开始,Job 的执行会被优化调整,例如:
- 在应用对用户可见时启动,并在应用不可见后继续的 Job 将遵守 Job runtime 配额
- 与前台服务同时执行的 Job 将遵守 Job runtime 配额
配额(Quotas):简单来说,就是系统必须将执行时间分配给加急 Job,而执行时间不是无限的,相反每个应用都会收到一个执行时间配额,当应用使用其执行时间并达到其分配的配额时,在配额刷新之前,App 会无法再执行加速工作,这是 Android 有效地平衡应用 App 之间的资源策略,而限制前台执行时间的系统级配额决定了加急 Job 是否可以启动。
简单说就是,Android 16 会根据不同场景来调整常规和加速 Job 执行运行时配额,该优化调整会影响 WorkManager、JobScheduler 和 DownloadManager 调度的任务,要调试 Job 停止的原因,可以通过调用 WorkInfo.getStopReason
或则 JobParameters.getStopReason
来记录 Job 停止的原因。
最后,Android 16 完全弃用 JobInfo#setImportantWhileForeground
,这个人方法自 Android 12 (API 31) 开始已经弃用,从 Android 16 开始它将不再有效运行,并且 JobInfo#isImportantWhileForeground
方法从 Android 16 开始也将返回 false。
自适应刷新
Android 15 中引入的自适应刷新率 Adaptive refresh rate (ARR) ,从而支持硬件上的显示刷新率能够使用离散的 VSync 步骤适应内容帧速率,从而降低了功耗,同时消除了可能引起卡顿的模式切换。
但是尽管 Android 15 增加了对自适应刷新率的平台级支持,但它并没有为应用提供实际利用它的方法,而在 Android 16 DP2 在恢复 getSupportedRefreshRates()
的同时引入了 hasArrSupport()
和 getSuggestedFrameRate(int)
,从而让 App 可以更轻松地适配 ARR。
之前
getSupportedRefreshRates
在 **API level 23 的时候被 deprecated ** ,改成了getSupportedModes
,现在它又复活了。
通过 getSuggestedFrameRate(int)
可以在给定描述性帧速率类别的情况下,获取显示器定义的帧速率:
java
float desiredMinRate = display.getSuggestedFrameRate(FRAME_RATE_CATEGORY_NORMAL);
Surface.FrameRateParams params = new Surface.FrameRateParams.Builder().
setDesiredRateRange(desiredMinRate, Float.MAX).build();
surface.setFrameRate(params);
在不需要快速渲染速率的动画可以使用 FRAME_RATE_CATEGORY_NORMAL
来获取建议帧速率, 然后建议的帧速率可以在 Surface.FrameRateParams.Builder.setDesiredRateRange
设置。
同时 RecyclerView 1.4 页在内部支持了 ARR(例如 fling 或者 smooth scroll 下),并且未来 ARR 支持会添加到更多 Jetpack 库中。
Photo picker
Photo picker 是 Android 为用户提供了一种安全的媒体选择内置方式,它可以授予应用访问本地和云存储中所选图像和视频的权限,而不是让 App 访问到整个媒体库。
通过 Google 系统更新和 Google Play 服务组合使用模块化系统组件,它可支持到 Android 4.4(API 级别 19)。
而 Android 16 本次更新的预览版包含了新的 API,支持从云媒体提供商搜索 Android 照片选择器,照片选择器中的搜索功能未来也将适配推出。
Wifi 测距
在 Android 15 版本就增加了 Wi-Fi 测距的支持,这是一种可实现精确室内位置跟踪的定位技术,Wi-Fi 测距允许 <1m 精度,使其比使用信号强度测量的传统基于 Wi-Fi 的位置跟踪精确得多。
Wi-Fi 测距基于飞行时间而不是信号强度,因此更加精确。
而 Android 16 在采用 WiFi 6 的 802.11az 的受支持设备上,增加了对 WiFi 位置功能的安全功能支持,主要是应用能够将协议的更高精度、更强的可扩展性和动态调度与安全增强功能相结合,包括基于 AES-256 的加密和防止 MITM 攻击,例如通过 802.11az 与 Wi-Fi 6 标准集成解锁笔记本电脑或车门。
Predictive back
尽管 Android 15 默认启用系统预测性返回动画,但应用是否支持这些动画仍取决于应用本身。
而为了帮助 App 支持这些 API,Android 16 添加了新的 API,可帮助开发者在手势导航中启用预测性返回系统动画,例如返回主页动画,通过向新的 PRIORITY_SYSTEM_NAVIGATION_OBSERVER
, App 可以在系统处理返回导航时接收常规的 onBackInvoked
调用,而不会影响正常的返回导航流程。
Android 16 还添加了 finishAndRemoveTaskCallback
和 moveTaskToBackCallback
,通过使用 OnBackInvokedDispatcher
注册这些回调,系统可以在调用返回手势时触发特定行为并播放相应的提前动画。