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" />
.....<serviceandroid: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平台确认截图:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

zookeeper开启SASL权限认证

目录 一、SASL介绍 二、使用 SASL 进行身份验证 2.1 服务器到服务器的身份验证 2.2 客户端到服务器身份验证 三、验证功能 一、SASL介绍 默认情况下&#xff0c;ZooKeeper 不使用任何形式的身份验证并允许匿名连接。但是&#xff0c;它支持 Java 身份验证与授权服务(JAAS)…

学习日记:数据类型2

目录 1.转义字符 2.隐式类型转换 2.1 强制类型转换 2.2 不同类型间赋值 3.运算符 表达式 3.1 算术运算符 3.2 算术运算优先级 3.3 赋值运算 3.3.1 不同类型间混合赋值 3.4 逗号运算 4.生成随机数 5. 每日一练 1.转义字符 \n 表示换行 \t …

3.2、数据结构-数组、矩阵和广义表

数组结构 数组是定长线性表在维度上的扩展,即线性表中的元素又是一个线性表。N维数组是一种“同构”的数据结构,其每个数据元素类型相同、结构一致。 一个m行n列的数组表示如下: 其可以表示为行向量形式&#xff08;一行一行的数据&#xff09;或者列向量形式&#xff08;一…

【Python第三方库】PyQt5安装与应用

文章目录 引言安装PYQT5基于Pyqt5的简单桌面应用常用的方法与属性QtDesigner工具使用与集成窗口类型QWidget和QMainWindow区别 UI文件加载方式直接加载UI文件的方式显示窗口转化py文件进行显示窗口 PyQt5中常用的操作信号与槽的设置绑定页面跳转 引言 PyQt5是一个流行的Python…

自动化测试--WebDriver API

1. 元素定位方法 通过 ID 定位&#xff1a;如果元素具有唯一的 ID 属性&#xff0c;可以使用 findElement(By.id("elementId")) 方法来定位元素。通过 Name 定位&#xff1a;使用 findElement(By.name("elementName")) 来查找具有指定名称的元素。通过 Cl…

哈默纳科HarmonicDrive谐波减速机的使用寿命计算

在机械传动系统中&#xff0c;减速机的应用无处不在&#xff0c;而HarmonicDrive哈默纳科谐波减速机以其独特的优势&#xff0c;如轻量、小型、传动效率高、减速范围广、精度高等特点&#xff0c;成为了众多领域的选择。然而&#xff0c;任何机械设备都有其使用寿命&#xff0c…

通信原理-思科实验三:无线局域网实验

实验三 无线局域网实验 一&#xff1a;无线局域网基础服务集 实验步骤&#xff1a; 进入物理工作区&#xff0c;导航选择 城市家园; 选择设备 AP0&#xff0c;并分别选择Laptop0、Laptop1放在APO范围外区域 修改笔记本的网卡&#xff0c;从以太网卡切换到无线网卡WPC300N 切…

java 对象模型的个人理解

文章目录 一、OOP-KCLASS 模型二、疑惑2.1 为什么还需要一个 Class对象&#xff1f;2.2 new 关键字和 Class.newInstance() 的区别&#xff1f; 一、OOP-KCLASS 模型 java 采用了field和method分离的方式&#xff0c;field组成实例 obj &#xff0c;存储在堆区&#xff0c;而m…

yarn安装electron时报错RequestError:socket hang up

安装electron时候&#xff0c;出现RequestError:socket hang up这样的错误&#xff0c;找了半天很多方式都是用旧淘宝源&#xff0c;导致根本安装不上去。 在项目的根目录下创建.npmrc文件&#xff0c;添加以下内容 # registryhttps://mirrors.huaweicloud.com/repository/np…

Umi-OCR:功能强大且易于使用的本地照片识别软件

Umi-OCR是一款开源且免费的离线OCR&#xff08;光学字符识别&#xff09;软件&#xff0c;可让您轻松从照片中提取文本。它支持多种语言&#xff0c;并具有许多其他功能使其成为照片识别任务的绝佳选择。 Umi-OCR的优势 离线操作&#xff1a; Umi-OCR无需互联网连接即可工作&…

服务器数据恢复—raid信息丢失导致RAID无法被识别的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 某单位机房搬迁&#xff0c;将所有服务器和存储搬迁到新机房并重新连接线路&#xff0c;启动所有机器发现其中有一台服务器无法识别RAID&#xff0c;提示未做初始化操作。 发生故障的这台服务器安装LINUX操作系统&#xff0c;配置了NF…

Spring中使用到的设计模式及其源码分析

前言 众所周知&#xff0c;Spring框架是一个强大而灵活的开发框架。这不&#xff0c;上次的面试刚问到这些&#xff0c;没防住&#xff01;&#xff01;&#xff01;因此下来总结一下。这篇文章主要介绍Spring中使用到的设计模式&#xff0c;自己做个面试复盘&#xff0c;同时…

MySQL SQL 编程练习

目录 创建表并插入数据 查看表结构 创建触发器 创建INSERT 触发器 创建DELETE 触发器 创建更新触发器 创建存储过程 创建提取emp_new表所有员工姓名和工资的存储过程s1 创建存储过程s2&#xff0c;实现输入员工姓名后返回员工的年龄 创建一个存储过程s3&#xff0c;有2个参数&…

Navicat图形化管理工具安装教程

1、Navicat简介 Navicat 是一套快速、可靠的数据库管理工具&#xff0c;专为简化数据库的管理及降低系统管理成本而开发。它的设计符合数据库管理员、开发人员及中小企业的需要。Navicat使用直觉化的图形用户界面&#xff0c;让用户能够安全简单的方式创建、组织、访问并共用信…

《华为数据之道》读书笔记六---面向自助消费的数据服务建设

七、从结果管理到过程管理&#xff0c; 从能“看”到能“管” 1、数据赋能业务运营 数字化运营旨在利用数字化技术获取、管理和分析数据&#xff0c;从而为企业的战略决策与业务运营提供可量化的、科学的支撑。 数字化运营归根结底是运营&#xff0c;旨在推动运营效率与能力的…

第1章 初识 C 语言

目录 1.1 C 语言的起源 1.2 选择 C 语言的理由 1.2.1 设计特性 1.2.2 高效性 1.2.3 可移植性 1.2.4 强大而灵活 1.2.5 面向程序员 1.2.6 缺点 1.3 C 语言的应用范围 1.4 计算机能做什么 1.5 高级计算机语言和编译器 1.6 语言标准 1.6.1 第 1 个 ANSI/ISO C 标准 …

图形/视图架构的基本概念

本文整理了图形/视图架构的基本概念 使用图形/视图架构&#xff0c;我们可以绘制复杂的由成千上万个基本图形组件组成的图形&#xff0c;并且每个图形组件是可选择、可拖放和可修改的&#xff0c;类似于矢量绘图软件的绘图功能。 图形/视图架构的组成 图形/视图架构主要由 …

数据结构之队列详解

1.队列的概念以及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFo(Frist in Frist out)的特性 入队列&#xff1a;进行插入才操作的一端称为队尾 出队列&#xff1a;进行删除操作的一…

智能编程,一触即发:使用AIGC优化CSS——提升前端开发效率与质量

文章目录 一、AIGC在CSS优化中的应用场景智能代码生成自动布局调整性能优化建议样式和色彩建议 二、使用AIGC优化CSS的具体步骤明确需求选择AIGC工具输入描述或设计稿审查和调整集成和测试 三、AIGC优化CSS的优势与挑战优势&#xff1a;挑战&#xff1a; 《CSS创意项目实践&…

从0到1:理发店预约剪发小程序开发笔记(上)

背景 理发师可以在小程序上设置自己的可预约时间&#xff0c;价格&#xff0c;自我介绍&#xff0c;顾客可以根据理发师的日程安排选择合适的时间进行预约和支付。这样可以提高预约的效率&#xff0c;减少沟通成本&#xff0c;方便双方的安排。 功能规划 首页展示&#xff1…