Android-适配-03-Android15(35)适配

7,049 阅读10分钟

Android 15 应用兼容性适配指导

一、简介

Android 15 计划从 2024 年 2 月开始启动,到向 AOSP 和 OEM 提供最终的公开版本时结束,最终版本预计将在今年年底发布。从已发布的Android 15预览版上,其提供了很好媒体功能的访问、最大限度地减少电池影响、关注通信、开发者生产力、跨屏幕应用程序灵活性以及保护用户隐私/安全。目前应用验证需要设置SDK为VanillaIceCream:我们会在后续的发布中和大家分享更多的15带来的特性解读。请阅读此文

Google 版本发布时间表

image.png

相关阅读

1、Android 15 开发者网站
2、下载和安装
3、发布时间表

二、兼容性调试工具

image.png
您可以使用兼容性框架工具进行的操作:
1、在不实际更改应用的 targetSdkVersion 的情况下测试针对性的变更。  您可以使用切换开关强制启用特定的针对性行为变更,以评估对现有应用的影响。
2、仅针对特定变更进行测试。  您可以使用切换开关停用所有针对性变更(要测试的变更除外),而不必一次处理所有针对性变更。
3、通过 adb 管理切换开关。  您可以使用 adb 命令在自动测试环境中启用和停用可切换的变更。
4、使用标准变更 ID 更快地进行调试。  每个可切换的变更都具有唯一 ID 和名称,可用于在日志输出中快速调试根本原因。
如需详细了解如何针对每个用例使用相应工具,请参阅兼容性框架工具

三、安全与隐私

3.1 AndroidManifest TAG限制

Android 15 对AndroidManifest Tag数量/attr 长度/属性值限制特殊字符做了先关的限制。
1、限制AndroidManifest.xml字段的tag数量,具体规则如下图。(解释示例:如在APPLICATION 下只能有不超过3000个的ACTIVITY)
image.png
2、限制attr string的长度
image.png
3、对于attr属性值限制特殊字符
image.png

3.1.1 对用户的影响

用户不能安装;根据触发的规则会抛出如下log。
安装时抛出异常
image.png
安装失败应用示例
image.png

3.1.2 对开发者的影响

开发者需要按照规则检查各自应用的manifest文件

3.2 包名校验

校验应用包名是否合法,包名只能包含如下字符:a-z, A-Z, 0-9,“.”和"_"

3.2.1 对用户的影响

3.2.2 对开发者的影响

3.3 启动前台服务的限制

target sdK 35+ 应用,BOOT_COMPLETED接收方不允许启动以下类型的前台服务:
dataSync
camera
mediaPlayback
phoneCall
mediaProjection
microphone microphone(此限制自 Android 14 起生效)
如果BOOT_COMPLETED接收者尝试启动任何这些类型的前台服务,系统将抛出ForegroundServiceStartNotAllowedException。

3.3.1 对用户的影响

如果应用没有捕获异常会出现崩溃等现象;

3.3.2 对开发者的影响

检查BOOT_COMPLETED接收者是否有启动以上服务。

3.4 最低可安装的目标API级别

恶意软件通常针对较旧的API级别,以绕过在新Android版本中的安全和隐私保护措施。为了防止这种情况,在Android 14机器上,不能安装targetSdk低于23的应用程序;在Android 15机器上,不能安装targetSdk低于24的应用程序。

3.4.1 对用户的影响

部分应用不能安装和备份过来;
注意:升级到Android 15的设备,任何目标SdkVersion低于24的应用程序都将无法安装。

3.4.2 对开发者的影响

应用targetSdkVersion不能小于24,建议升级targetSdkVersion;

四、系统优化

4.1 ART相关库中的类和函数引入了符号可见性属性

Android 15出于提高性能、以及安全等目的。对ART相关库引入可见属性。隐藏ART相关符号表(HIDDEN),只有使用EXPORT才能加入到符号表中;

使用HIDDEN示例

image.png

使用EXPORT示例

image.png

4.1.1 对用户的影响

如果应用打中此特性,加固应用会出现闪退或卡死,其他应用因使用方式不同会出现对应的功能异常。

4.1.2 对开发者的影响

因在符号表里找不到对应的字符,无法通过反射调用对应的类和函数。

4.2 应用已停止状态变更

当应用在 Android 15 上进入停止状态时,系统还会取消所有待处理 intent。当用户的操作将应用从停止状态中移除时,系统将向应用传递 ACTION_BOOT_COMPLETED /LOCKED_BOOT_COMPLETED广播,使用户有机会重新注册任何待处理的intent
1、取消所有待处理 intent
系统在应用forceStop 时 会清除mIntentSenderRecords里的pendingintent.影响设置FLAG为FLAG_NO_CREATE的PendingIntent.
关键修改代码片段
image.png
2、应用从停止状态中移除时,系统将向应用传递 ACTION_BOOT_COMPLETED /LOCKED_BOOT_COMPLETED广播
关键修改代码片段(基于Beta1)
image.png

4.2.1 对用户的影响

目前我司,对开机广播接收是存在控制的,如果不在自启动名单里预计不受影响。需要排查系统应用使用情况。

4.2.2 对开发者的影响

此修改与原来开发者的意图不一致,需要开发者检查,应用在此发送时是否会受到影响;Google建议是:可以调用新的 ApplicationStartInfo.wasForceStopped() 方法来确认应用是否已置于停止状态。

4.2.3 验证影响

1、确认开关是否开启,没有开启可使用如下命令;

adb shell device_config put backstage_power android.content.pm.stay_stopped true 

2、验证操作方法
1)启动应用
2)执行forcestop命令或长按应用图标进入应用详情并选择“强行停止”;

adb shell am force-stop PackageName

3)重新启动应用查看是有接收到开机广播;
验证开机广播示例
image.png

4.3 Window inset 变化

Android 15 中出现了两项与 Window inset相关的更改。在 Beta1后,将强制执行Edge-to-edge。还有即将到来的Stable configuration;
注意以上变化对 target SDK 35+ 生效。

4.3.1 对用户的影响

Edge-to-edge和Stable configuration如果应用适配不好,用户从界面上就可以看到布局的差异(或存在布局错乱,挖孔适配不好存在应用崩溃风险)。
Edge-to-edge:
如果应用的目标版本是35+,edge to edge(边到边,应用布局到状态栏和导航栏下面)特性将在Android 15机器上默认启动;
image.png
image.png

Edge-to-edge 对应用UI的影响:

1、手势导航条

  • 默认透明
  • 应用布局在手势导航条后面,除非应用适配手势导航条insets;
  • setNavigationBarColor 和 R.attr#navigationBarColor 已经弃用,并且不会影响手势导航条;
  • setNavigationBarContrastEnforced 和R.attr#navigationBarContrastEnforced API对手势导航条无影响;

2、三键导航

  • 默认情况下,不透明度(Opacity)设置为80%,颜色和窗口背景色匹配;
  • 应用布局在导航栏后面,除非应用适配三键导航条的insets;
  • setNavigationBarColor 和 R.attr#navigationBarColor 默认设置为与窗口背景色匹配,此API已废弃,但是仍然可以影响三件导航;
  • setNavigationBarContrastEnforced 和R.attr#navigationBarContrastEnforced 默认设置为true,添加 80% 的不透明背景。

3、状态栏

  • 默认透明
  • 应用布局在状态栏后面,除非应用适配状态栏insets;
  • setStatusBarColor已R.attr#statusBarColor弃用,对 Android 15 没有影响。
  • setStatusBarContrastEnforced和R.attr#statusBarContrastEnforced 此API已废弃,但对 Android 15 上设置仍然有效;

4、挖孔

  • layoutInDisplayCutoutMode在非浮窗口的场景下,必须配置 LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS.否则应用程序将崩溃并出IllegalArgumentException。 “ALWAYS”是唯一允许的选项,这样用户就不会在横向模式下看到因显示切口而导致的黑条,从而出现边到边的情况。
  • CutoutMode说明:developer.android.com/develop/ui/…
4.3.2 对开发者的影响

Edge-to-edge:

1、开发者适配须知:
1)应用TargetSdk >=35;
2)应用没有申请豁免windowOptOutEdgeToEdgeEnforceMent
3)开启EdgeToEdge后,非浮窗应用如果没有适配ALWAYS将会崩溃
4)如果挖孔已经配置ALWAYS,应用必须适配状态栏和导航栏insets,避免出现遮挡情况;

2、如何适配edge to edge, 确保不被系统窗口遮挡?
1)代码申明使用挖孔 developer.android.com/develop/ui/…
(通过adb shell dumpsys window windows > windows.txt 确认window 是否适配 layoutInDisplayCutoutMode=always)

  1. 注册一个 OnApplyWindowInsetsListener,以取得系统提供的 window insets。
  2. Listener 里可以监听到的insets 信息包含 system bars、IME(输入法、软体键盘)、display cutouts 等
  3. 在views 加上 paddings 以适应 window insets;

3、demo(非compose应用布局避让)
image.png

注意:
1、如果您的应用在Compose中使用Material3组件,例如TopAppBar, BottomAppBar和NavigationBar,这些组件可能不会受到影响,因为它们会自动处理边距;
2、如果您的应用程序使用Material2组件作为头布局和底布局,需要自己处理padding 或者contentWindowInsets 来处理;
3、应用可以临时通过 android:windowOptOutEdgeToEdgeEnforcement="true"豁免。不推荐,Android 16会废弃;
4、非compose应用需要在应用布局中添加android:fitsSystemWindows="true",或者将用户View setFitsSystemWindows(true);

Stable configuration:

1、开发者适配须知

  • 使用Configuration.screenWidthDp和screenHeightDp 获取尺寸做业务逻辑或者布局计算的受到影响;
  • 使受到screenWidthDp和screenHeightDp 获取尺寸的影响,可能间接影响Configuration.orientation横竖屏方向;
  • 用Configuration.windowConfiguration.getAppBounds() 获取尺寸做业务逻辑或者布局计算的受到影响;
  • 使用Configuration.smallestScreenWidthDp 获取尺寸做业务逻辑或者布局计算的受到影响;
  • 使用Display.getSize(Point)/getRectSize(Rect)/getMetrics() 获取尺寸做业务逻辑或者布局计算的受到影响;从 API 级别 30 开始,此功能已被弃用。
  • Display.getMetrics()/Display.getAppMetrics() 在API 33 已经这样工作了。
详见:https://developer.android.com/about/versions/15/behavior-changes-15?hl=en#stable-configuration

4.4 Jobscheduler检查

规范三方应用对Job的使用,应用在设置Job的时候,如果最早触发时间和最晚触发时间相距小于15min,则会直接触发exception导致应用崩溃(目前是关闭状态,只会打印出log)。
image.png

4.4.1 对用户的影响

目前默认是关闭状态,如果开启的话会抛出异常,如果应用没有做异常捕获则会直接闪退;

4.4.2 对开发者的影响

最好触发条件排查:
1)job设置除了最早触发时间和最晚时间的其他的调度条件约束(比如说充电、网络状态等)
2)job设置了最晚触发时间
3)该job为非循环式触发的job

4.5 紧凑字体变更

对Target SDK 35+ 的应用程序,elegantTextHeight属性将成为默认设置,将默认使用的紧凑字体替换为一些具有较大垂直尺寸的脚本,并使用更具可读性的字体。引入紧凑字体是为了防止破坏布局。
image.png

4.5.1 对用户的影响

如果应用支持阿拉伯语、老挝语、缅甸语、泰米尔语、古吉拉特语、卡纳达语、马拉雅拉姆语、奥迪亚语、泰卢固语或泰语语种,在布局上如果处理不好会出现显示的体验差异。

4.5.2 对开发者的影响

Android 15 中,紧凑字体仍然保留在系统中,因此您的应用程序可以设置 elegantTextHeight为false获得与以前相同的行为,但在即将发布的版本中不太可能支持它。

4.6 16KB page size功能(实验功能)

Android 15(AOSP 实验版)及更高版本支持构建具有 16KB 页面大小的 Android。此选项会使用额外的内存,但可以提高系统性能。(15上开发者选项中默认关闭,开启需要reboot)
image.png

4.6.1 对用户的影响

如果应用程序开发人员不做任何更改,它们很可能会在16KB的页面环境中崩溃。

4.6.2 对开发者的影响

对于具有原生库的应用程序,它们必须检查其原生代码并重新编译.

4.7 Vulkan替换OpenGL ES

15上android原生组件图形渲染库从openGL ES 切换成Vulkan,同时要求内置Angle库,在开发者选项中可配置使用angle库,将游戏类使用OpenGL ES图形库转义成vulkan图形库,下一代预计全面切换到vulkan。

五、新功能新API

详见:developer.android.com/about/versi…