Android 15 适配整理——实践版

背景

谷歌发布Android 15后,国内的手机厂商迅速行动,开始了新系统的适配工作。小米、OPPO、vivo和联想等金标联盟成员联合发布了适配公告,督促APP开发者在2024年8月31日前完成适配工作,否则将面临搜索标签提示、应用降级、分机型屏蔽以及应用下架等处罚措施。

可能存在的影响面有哪些

  1. UI相关:主要页面状态栏是否正常和底部是否有遮挡。包括:原生页面;h5页面 ;flutter页面。(沉浸式和非沉浸式)
  2. 通知栏样式:极光推送是否通知栏样式是否正常。
  3. 存储相关:文件下载功能:版本更新功能是否正常。图库选择图片和视频是否正常。图片资源保持功能是否正常。
  4. 权限相关:机型测试权限是否有异常。
  5. 机型覆盖:安卓15 需要兼容 OPPO、VIVO、小米等。(登录官网-找云真机测试)

Android 15云真机

因为是提前做好适配,因此,目前市面上没有android 15 系统的手机,需要申请云真机,比如,小米、oppo、vivo等。
使用云真机过程中的一些经验之谈:

  • 小米的云真机调试限制:1天8小时,每半小时需要重连一次;重连失败,可能是因为云真机被占用了。
  • vivo的云真机调试:
    • 使用国内的云真机比较正常;国外的云真机,会一直系统白屏(不确定是否浏览器问题,试了Google和360浏览器都是白屏)。
    • 如果隔段时间没用,大约半小时左右,会存在死机现象;刷新后,需要重新安装软件。
  • 使用体感:vivo的云真机比小米云真机要流畅一点;但是vivo放置久了,长时间无输入操作,也会存在卡顿现象。
  • 云真机链接:
  • vivo云真机
  • 小米云真机

适配方案流程:

前提:在做本次Android15适配之前,项目已经做好Android 11 以上的适配工作。主要是:存储、权限、第三方sdk适配、隐私权益这些流程的妥善处理。可以看之前整理的另一篇文章:《Android 11 适配——整理总结篇》

影响Android 15上所有应用的行为变更

处理最低sdk适配
  • 最低可安装TargetSDK级别为24!
    如果尝试安装一个针对较低API级别的应用程序会导致安装失败,并在Logcat中出现以下消息:
INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 24, but found 7
应用 STOPPED 状态的变化

当应用进入 STOPPED 状态时,系统会自动取消应用的所有 PendingIntent。这意味着任何未决的操作,包括但不限于定时任务和远程服务调用,都将被中断。
在此状态下,应用的小部件(widgets)也会被禁用,表现为灰色不可交互状态,直到应用再次启动。
用户通过直接或间接操作将应用从 STOPPED 状态唤醒时,系统会发送 ACTION_BOOT_COMPLETED 广播给应用。这允许应用重新注册其 PendingIntent 和恢复其他必要的后台活动。
应用可以通过 ApplicationStartInfo.wasForceStopped() 接口来检测自身是否曾处于 STOPPED 状态,以便采取相应的恢复措施。
PendingIntent
PendingIntent 则是对 Intent 的一种封装,它提供了在未来的某个不确定时间点执行 Intent 的能力,并且可以在不同的进程之间安全地传递。PendingIntent 主要有以下用途:
异步执行:允许在未来的某个时刻执行 Intent,即使是在应用不处于前台的情况下。
跨进程调用:可以安全地将 Intent 传递给其他应用或进程,因为 PendingIntent 保证了 Intent 的执行上下文和权限。
延迟绑定:在创建 PendingIntent 时不需要立即知道所有参数,可以在稍后的某个时间点再进行绑定和执行。

影响以Android 15为目标平台应用的行为变更

新的媒体处理前台服务类型

项目中,没有对应场景需要用到该新的服务类型

Android 15引入了一种新的前台服务类型,即mediaProcessing。
该系统允许一个应用的媒体处理服务在24小时内运行总共6个小时,之后系统会调用正在运行的服务的Service.onTimeout(int, int)方法(在Android 15中引入)。
要使用这种前台服务类型,需要在manifest中申明相关权限和foregroundServiceType属性:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROCESSING" />
.....
        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true"
            android:foregroundServiceType="mediaProcessing"
            >
    </service>
......

Receiver 启动前台服务的限制

BOOT_COMPLETED 广播接收器启动前台服务有了新的限制,不得启动以下类型的前台服务:dataSync、camera、mediaPlayback、phoneCall、mediaProjection、microphonemicrophone(此限制自 Android 14 起生效)
如果BOOT_COMPLETED接收器尝试启动任何类型的前台服务,系统将抛出异常:ForegroundServiceStartNotAllowedException。

IntentFilter规范

在 Android 15 中,系统对 Intent 的安全性和精确性进行了显著增强,主要体现在两个关键方面:
精确匹配 Intent-Filters:当一个应用尝试通过 Intent 启动另一个应用中的组件(如 Activity)时,发送的 Intent 必须严格符合接收组件声明的 intent-filters。这意味着,Intent 中的属性(如 category、data 和 action)必须与接收方在清单文件(AndroidManifest.xml)中定义的 intent-filters 完全匹配,才能成功启动目标组件。这一改变确保了组件只能被预期的 Intent 所激活,增强了跨应用交互的安全性。
强制 Intent 包含 Action:所有用于启动 Activity 或 Service 的 Intent 现在都必须包含一个明确的 action 字段。如果没有指定 action,该 Intent 将不会匹配到任何 intent-filters,从而无法启动任何组件。这一要求进一步提高了 Intent 的意图清晰度和安全性,防止了因缺少行动指令而可能引发的意外行为或安全漏洞。
通过启动严格模式可以发现应用中潜在问题

fun onCreate() {
    StrictMode.setVmPolicy(VmPolicy.Builder()
        .detectUnsafeIntentLaunch()
        .build()
    )
}
Edge-to-edge 模式

概述
Edge-to-edge模式是Android 15引入的一种布局策略,旨在使应用界面充分利用整个屏幕空间,包括状态栏和导航栏区域。在该模式下,应用界面将扩展至屏幕边缘,且无法自定义状态栏背景颜色,导航栏的背景透明度默认设为80%。
特性
默认启用:针对Android 15设备,所有targetSdkVersion为35或更高的应用将默认启用Edge-to-edge模式。
布局影响:启用该模式可能会影响应用的布局设计,需要开发者进行相应的适配工作。
限制条件:在Edge-to-edge模式下,非浮动窗口的layoutInDisplayCutoutMode属性必须设置为LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS,否则会抛出IllegalArgumentException。
API弃用:在Android 15平台上,之前用于设置系统栏颜色的API如setStatusBarColor和setNavigationBarColor将被弃用,即使调用,系统也会保持默认的沉浸式体验。
应用适配
targetSdkVersion >= 35:应用将强制进行全屏展示,状态栏和导航栏保持透明。若应用布局需避开状态栏和导航栏,应确保在XML布局文件中设置:

android:fitsSystemWindows="true"

targetSdkVersion < 35:应用默认不会启用Edge-to-edge特性,维持原有状态栏和导航栏的处理方式。
注意事项
开发者需检查应用的布局文件,确保在targetSdkVersion >= 35的应用中,所有需要避开状态栏和导航栏的布局元素都正确设置了fitsSystemWindows属性。
对于需要自定义状态栏和导航栏颜色或透明度的应用,应考虑使用其他方法替代已弃用的API,例如使用主题和样式资源来控制UI的外观

其他变更:

  • 达到资源限制时,直接和分流音频播放会使之前打开的直接或分流音轨失效
  • 支持16KB Page Size
  • 默认开启预测性返回动画
  • 对启动前台服务的 BOOT_COMPLETED 广播接收器的限制
  • 对请求音频焦点的限制
  • ……

觉得不错的新功能

  • 提供了ApplicationStartInfo API供开发者获取应用启动的相关信息。
getDefiningUid(): 大多数情况下与通常认为的UID相同,使用了android:useAppZygote属性和Context.BIND_EXTERNAL_SERVICE标志位的service可能会导致这个字段有所不同。
getIntent(): 就是引发这个应用启动的intent。
getLaunchMode(): 启动模式,本例中为0,意为LAUNCH_MODE_STANDARD。
getPackageUid(): 即App安装时分配到的UID。
getPid()、getProcessName(): 即进程Pid、进程名。
getRealUid(): 大多数情况下与PackageUid相同,在涉及应用分身、多用户等情况下可能会不同。
getReason(): 应用启动的原因。可能返回的值有:
  0,START_REASON_ALARM,应用被闹钟启动;
  1, START_REASON_BACKUP,因为执行backup而启动;
  2,START_REASON_BOOT_COMPLETE,应用因为开机完成启动;

getStartType(): App自动的类型,比如:
  1,START_TYPE_COLD,冷启动;
  3,START_TYPE_HOT,热启动

getStartupState(): 启动状态。如:
  0,STARTUP_STATE_STARTED,启动成功;
  1,STARTUP_STATE_ERROR,启动失败;
等等。

getStartupTimestamps(): 得到不同启动阶段的时间戳,比如:START_TIMESTAMP_LAUNCH,START_TIMESTAMP_BIND_APPLICATION等等。

wasForceStopped(): 应用是否是被forcestop结束的。开发者可以利用这个API决定应用启动后是否重新注册闹钟、JobScheduler等被forcestop清除掉的机制。
开发者也可以使用addApplicationStartInfoCompletionListener与removeApplicationStartInfoCompletionListener方法来添加和删除监听器,监听器会在应用启动信息生成完毕后回调
  • 照片选择改进:当 App 得到部分媒体权限时,应用可以仅突出显示最近选择的照片和视频,这可以改善频繁请求访问照片和视频的用户体验,详细可以通过 ContentResolver 在 MediaStore 启用时查询 QUERY_ARG_LATEST_SELECTION_ONLY 参数来实现。
  • 局部屏幕共享
  • SQLite 数据库改进: SQLite 性能最佳实践
  • ……

关于是否将 targetSdkVersion 设置为Android 15 的思考

  • 结论:当前版本30,待15稳定后再设置为目标版本。
  • 原因:
    1. 目前查看Android 15 官方更新日志,在2024年7月18日 又将本应该 Android 15 对应的api 34 调整为 api 35了。官方表明,仍在积极开发阶段,可能存在稳定性问题。

在这里插入图片描述
3. 目前我们的适配、上线日期都是在正式版之前的,目标版本不应该以不够稳定的15 beta为目标版本,而应该以稳定版本为主。
4. 目前国内最低版本要求是不低于24;如果上线Google应用商店,最低目标版本是不低于29;目前项目的最低版本已声明为24(原21),目标版本已声明为30。满足当前应用市场要求,并最大程度确保了版本稳定性。
5. vivo平台确认截图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/869743.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

邮件安全篇:邮件反垃圾系统运作机制简介

1. 什么是邮件反垃圾系统&#xff1f; 邮件反垃圾系统是一种专门设计用于检测、过滤和阻止垃圾邮件的技术解决方案。用于保护用户的邮箱免受未经请求的商业广告、诈骗信息、恶意软件、钓鱼攻击和其他非用户意愿接收的电子邮件的侵扰。 反垃圾系统的常见部署形式 2. 邮件反垃圾…

win11 安装 Gradle

一、win11 安装Gradle(7.5.1)&#xff1a; 1.1、下载二进制包 Gradle下载页面 1.2、配置环境变量 变量名&#xff1a;GRADLE_HOME 变量值&#xff08;二进制包解压路径&#xff09;&#xff1a;D:\develop-tool\gradle-7.5.1 变量名&#xff1a;GRADLE_USER_HOME 变量值&a…

6 C 语言指针的奥秘:理论与实践详解

目录 1 变量访问机制 1.1 内存地址 1.2 变量的直接访问 1.3 变量的间接访问 2 指针变量及其内存大小 2.1 指针与指针变量 2.2 指针变量的定义格式 2.3 指针变量的内存大小 3 取地址操作符与取值操作符 3.1 取地址操作符 & 3.2 取值操作符 * 3.3 解引用与数据类…

Android APP CameraX应用(02)预览流程

说明&#xff1a;camera子系统 系列文章针对Android12.0系统&#xff0c;主要针对 camerax API框架进行解读。 1 CameraX简介 1.1 CameraX 预览流程简要解读 CameraX 是 Android 上的一个 Jetpack 支持库&#xff0c;它提供了一套统一的 API 来处理相机功能&#xff0c;无论 …

基于微信小程序的高校排课系统 /基于微信小程序的排课管理系统/课程管理系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&a…

PE文件(十二)导入表

导入表 导入表的引入 当一个PE文件&#xff08;如.dll/.exe等&#xff09;需要使用别的模块的函数&#xff0c;也叫做依赖某模块&#xff0c;就需要一个清单来记录使用的模块&#xff08;一般为.dll文件&#xff0c;为方便理解&#xff0c;以后我们将模块都认为是.dll文件&am…

electron安装及快速创建

electron安装及快速创建 electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 详细内容见官网&#xff1a;https://www.electronjs.org/zh/docs/latest/。 今天来记录下练习中的安装过程和hello world的创建。 创建项目文件夹&#xff0c;并执行npm 初始化命…

将iPad 作为Windows电脑副屏的几种方法(二)

将iPad 作为Windows电脑副屏的几种方法&#xff08;二&#xff09; 1. 前言2. EV 扩展屏2.1 概述2.2 下载、安装、连接教程2.3 遇到的问题和解决方法2.3.1 平板连接不上电脑 3. Twomon SE3.1 概述3.2 下载安装教程 4. 多屏中心&#xff08;GlideX&#xff09;4.1 概述4.2 下载安…

东莞网站建设前期需要做好哪些工作

在进行东莞网站建设前&#xff0c;需要做好一系列的前期工作。这些工作的实施将为网站建设奠定坚实的基础&#xff0c;确保项目能够按计划顺利进行&#xff0c;并最终达到预期的目标。 首先&#xff0c;需要明确网站的定位和目标。东莞是一个经济发达的城市&#xff0c;因此&am…

Oracle系统表空间的加解密

实验环境 数据库选择的是orclpdb1&#xff0c;当前系统表空间未加密&#xff1a; SQL> show con_nameCON_NAME ------------------------------ ORCLPDB1SQL> select TABLESPACE_NAME, STATUS, ENCRYPTED from dba_tablespaces;TABLESPACE_NAME STATUS …

docker搭建python3的私有源--devpi

一、部署 # docker run -d --name devpi-lib -p 7104:7104 --env DEVPISERVER_HOST0.0.0.0 --env DEVPISERVER_PORT7104 --env DEVPISERVER_ROOT_PASSWORDpassword --env DEVPISERVER_USERlowinli --env DEVPISERVER_PASSWORDpassword --env DEVPISERVER_MIRROR_INDEXpypi --…

SAP PP学习笔记31 - 计划运行的步骤2 - Scheduling(日程计算),BOM Explosion(BOM展开)

上一章讲了计划运行的5大步骤中的前两步&#xff0c;计算净需求和计算批量大小。 SAP PP学习笔记30 - 计划运行的步骤1 - Net requirements calculation 计算净需求(主要讲了安全库存要素)&#xff0c;Lot-size calculation 计算批量大小-CSDN博客 本章继续讲计划运行的后面几…

【快速逆向二/无过程/有源码】掌上高考—2024高考志愿填报服务平台

逆向日期&#xff1a;2024.07.21 使用工具&#xff1a;Node.js 加密工具&#xff1a;Crypto-js标准库 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 标准算法&…

spring-boot3.x整合Swagger 3 (OpenAPI 3) +knife4j

1.简介 OpenAPI阶段的Swagger也被称为Swagger 3.0。在Swagger 2.0后&#xff0c;Swagger规范正式更名为OpenAPI规范&#xff0c;并且根据OpenAPI规范的版本号进行了更新。因此&#xff0c;Swagger 3.0对应的就是OpenAPI 3.0版本&#xff0c;它是Swagger在OpenAPI阶段推出的一个…

【Linux】玩转操作系统,深入刨析进程状态与调度机制

目录 1. 进程排队2. 进程状态的表述2.1. 进程状态2.2 运行状态2.3. 阻塞状态2.4. 挂起状态 3. Linux下具体的进程状态3.1. 运行状态R3.2. 可中断睡眠状态S3.3. 不可中断睡眠状态D3.4. 停止状态T3.5. 死亡状态X3.6. 僵尸状态Z 4. 孤儿进程5. 优先级6. Linux的调度与切换6.1. 四个…

第二证券:台风的后遗症竟然是台股!

今日早盘&#xff0c;中国台湾的台湾加权指数开盘大跌逾4%&#xff0c;台积电跌超6%。此前&#xff0c;因为飓风的原因&#xff0c;台湾股市暂停生意两天。暂停生意前&#xff0c;台湾加权指数收报22871点&#xff0c;上升614点&#xff0c;涨幅高达2.76%。 剖析人士认为&…

域名解析到ipv6,并用CF隐藏端口

要求&#xff1a;域名解析到 IPv6 地址并隐藏端口 ‍ 效果&#xff1a;用域名 https://myhalo.soulio.top​ 访问http://[2409:8a62:867:4f12:56c7:5508:f7x6:8]:8080​。唯一缺点是延迟有点高。 ​​ ‍ 难度&#xff1a;需要有一定域名解析、cloudflare使用基础 ‍ 实…

[数据集][目标检测]躺坐站识别检测数据集VOC+YOLO格式9488张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;9488 标注数量(xml文件个数)&#xff1a;9488 标注数量(txt文件个数)&#xff1a;9488 标注…

【C/C++】内存管理

内存管理 一.C/C内存分布二.C内存管理方式1.new、delete操作内置类型2.new、delete操作自定义类型3.32位、64位机器的区别 三.operator new与operator delete函数四.new和delete的实现原理1.内置类型2.自定义类型1.new的原理2.delete的原理3.new T[N]的原理4.delete[]的原理 五…

5G赋能新能源,工业5G路由器实现充电桩远程高效管理

随着5G技术的广泛应用&#xff0c;新能源充电桩的5G应用正逐步构建起全新的生态系统。在数字化转型的浪潮中&#xff0c;新能源充电桩行业正迎来数字化改革。工业5G路由器的引入&#xff0c;为充电桩的远程管理提供了强有力的技术支持&#xff0c;新能源充电桩5G路由器网络部署…