是时候了解android16适配了

android系统每年都更新且年年都不一样,所谓干一行爱一行。

接下来就来看看它都有哪些变化:

1、JobScheduler的调度配额优化:

通俗的说就是android的系统为了进一步省电,避免不必要的电量浪费而加入的策略管理模式,控制任务在什么合适的时机去执行。这种改变会影响WorkManagerJobScheduler DownloadManager 调度的任务,尤其是在后台处理任务的时候,系统进入低功耗模式将会影响,

需要处理的任务大概被分为这么几类:

  • 活跃:应用目前正在使用或不久前才被使用过。
  • 工作集:应用会被定期使用。
  • 常用:应用经常被使用,但不是每天都使用。
  • 极少使用:应用不经常被使用。
  • 受限:应用会消耗大量的系统资源,或可能出现不希望出现的行为。

大家参考下面的图应该就能一目了然了:

如需调试作业停止的原因,我们建议您通过调用 WorkInfo.getStopReason() 来记录作业停止的原因(对于 JobScheduler 作业,请调用 JobParameters.getStopReason())。

这里还需注意被废弃的api:

JobInfo.Builder#setImportantWhileForeground(boolean) 方法用于在调度应用位于前台或暂时豁免于后台限制时指示作业的优先级。

自 Android 12(API 级别 31)起,此方法已废弃。从 Android 16 开始,它不再有效,系统会忽略调用此方法。

此功能移除也适用于 JobInfo#isImportantWhileForeground()。从 Android 16 开始,如果调用该方法,该方法会返回 false

2、有序广播优先级范围不再是全局:

android 应用可以为广播接收器定义优先级,以控制接收器接收和处理广播的顺序。对于清单声明的接收器,应用可以使用 android:priority 属性来定义优先级;对于上下文注册的接收器,应用可以使用 IntentFilter#setPriority() API 来定义优先级。发送广播时,系统会按接收器的优先级(从高到低)将其传送给接收器。

在 Android 16 中,无法保证使用 android:priority 属性或 IntentFilter#setPriority() 在不同进程中传送广播的顺序。广播优先级仅在同一应用进程内有效,而不会跨所有进程有效。

此外,广播优先级将自动限制在 (SYSTEM_LOW_PRIORITY + 1, SYSTEM_HIGH_PRIORITY - 1) 的范围内。只有系统组件才能将 SYSTEM_LOW_PRIORITYSYSTEM_HIGH_PRIORITY 设置为广播优先级。

3、ART 内部变更:

Android 16 包含 Android 运行时 (ART) 的最新更新,这些更新可提升 Android 运行时 (ART) 的性能,并支持更多 Java 功能。通过 Google Play 系统更新,搭载 Android 12(API 级别 31)及更高版本的 10 亿多部设备也将受益于这些改进。

发布这些变更后,依赖于 ART 内部结构的库和应用代码在搭载 Android 16 的设备以及通过 Google Play 系统更新来更新 ART 模块的较低 Android 版本上可能无法正常运行。

依赖于内部结构(例如非 SDK 接口)始终会导致兼容性问题,但避免依赖于利用内部 ART 结构的代码(或包含代码的库)尤为重要。通俗的理解就是大家有hook ART部分的代码会受到进一步影响也就是hook系统代码,可能会出现兼容性问题。

4、16 KB 页面大小兼容模式:

适配android15的时候大家都应该了解到16k兼容的问题,也就是如果你有涉及jni、NDK开发的需求就应该高度注意这一部分的适配。在android15上你需要将以前的so库重新用NDK版本>=27重新编译才可以运行,因为原来的so库怕个pagesize编译默认为4kb的,所以不重新编译会报错,android16相当于给你兼容4kb编译的so库的可选择的兼容性。也就是说:

Android 16 添加了兼容模式,让一些针对 4 KB 内存页面构建的应用可以在配置为 16 KB 内存页面的设备上运行。

如果 Android 检测到您的应用具有 4 KB 对齐的内存页,则会自动使用兼容模式并向用户显示通知对话框。在 AndroidManifest.xml 中设置 android:pageSizeCompat 属性以启用向后兼容模式,将会阻止应用启动时显示对话框。为了获得最佳性能、可靠性和稳定性,您的应用仍应采用 16 KB 对齐。默认的提示框是这个样的:

5、增强了针对 intent 重定向攻击的安全性:

intent重定向安全问题,想必大家以前应该有所了解,通俗的说就是我们可以通过第三方app启动原app的activity(它的exported=true)。我们来了解一下什么是重定向,其实它就是一个双层嵌套,根据下图理解,攻击Apk使用startActivity(intent1)进入受害apk的Activity1,Activity1中会接收一个intent(称intent2,这个intent2指向攻击Apk中的Activity2)类型的数据,对这个intent2使用startActivity(intent2),这样最终就进入了Activity2。如图:

面对这种重定向攻击,android16给了我们更好的解决方案如下代码:

对于针对 Android 16(API 级别 36)SDK 或更高版本进行编译的应用:

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
对于针对 Android 15(API 级别 35)或更低版本进行编译的应用:
val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent", Intent::class.java)
try {
    val removeLaunchSecurityProtection = Intent::class.java.getDeclaredMethod("removeLaunchSecurityProtection")
    removeLaunchSecurityProtection.invoke(iSublevel)
} catch (e: Exception) {
    // Handle the exception, e.g., log it
} // Opt-out from the security hardening using reflection
iSublevel?.let { startActivity(it) }

6、在蓝牙堆栈中改善蓝牙与外围设备的连接:

从 Android 16 开始,蓝牙堆栈已更新,以便在检测到远程配对丢失时提高安全性和用户体验。以前,系统会自动解除配对并启动新的配对流程,这可能会导致意外重新配对。在许多情况下,我们发现应用未以一致的方式处理债券损失事件。

为了统一体验,Android 16 改进了系统的绑定丢失处理。如果之前配对的蓝牙设备在重新连接时无法进行身份验证,系统会断开关联,保留本地配对信息,并显示系统对话框,告知用户配对已断开并指示他们重新配对。

好了,这就是android16的一些主要变化以及开发中需要注意的一些事情,具体更细节的变化请参考谷歌官网android16适配官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值