La plataforma de Android 14 incluye cambios de comportamiento que podrían afectar a tu app.
Los siguientes cambios se aplican a todas las apps cuando se ejecutan en Android 14,
independientemente de
targetSdkVersion. Debes probar tu app y, luego, modificarla según corresponda para admitir estos cambios.
Asegúrate también de consultar la lista de cambios de comportamiento que solo afectan a las apps orientadas a Android 14.
Funcionalidad principal
El permiso para programar alarmas exactas se rechaza de forma predeterminada
精确的闹钟适用于用户指定的通知,或是在确切时间需要执行的操作。从 Android 14 开始,系统不再向以 Android 13 及更高版本为目标平台的大多数新安装应用预先授予 SCHEDULE_EXACT_ALARM 权限,该权限默认处于拒绝状态。
详细了解安排精确闹钟的权限变化。
Las transmisiones registradas en el contexto se ponen en cola mientras las apps se almacenan en caché
On Android 14, the system can place context-registered broadcasts in a queue while the app is in the cached state. This is similar to the queuing behavior that Android 12 (API level 31) introduced for async binder transactions. Manifest-declared broadcasts aren't queued, and apps are removed from the cached state for broadcast delivery.
When the app leaves the cached state, such as returning to the foreground, the system delivers any queued broadcasts. Multiple instances of certain broadcasts might be merged into one broadcast. Depending on other factors, such as system health, apps might be removed from the cached state, and any previously queued broadcasts are delivered.
Las apps solo pueden finalizar sus propios procesos en segundo plano
A partir de Android 14, cuando tu app llame a killBackgroundProcesses(), la API solo puede finalizar los procesos en segundo plano de tu propia app.
Si pasas el nombre del paquete de otra app, este método no tiene efecto en los procesos en segundo plano de esa app, y aparece el siguiente mensaje en Logcat:
Invalid packageName: com.example.anotherapp
Tu app no debe usar la API de killBackgroundProcesses() ni intentar influir, de otra manera, en el ciclo de vida del proceso de otras apps, incluso en versiones anteriores del SO.
Android se diseñó para mantener las apps almacenadas en caché en segundo plano y eliminarlas automáticamente cuando el sistema necesite memoria. Si tu app finaliza, de forma innecesaria, otras apps, puede reducir el rendimiento del sistema y aumentar el consumo de batería, ya que se requieren reinicios completos de esas apps más adelante, lo que exige muchos más recursos que reanudar una app existente almacenada en caché.
La MTU se establece en 517 para el primer cliente GATT que solicita una MTU.
从 Android 14 开始,Android 蓝牙堆栈会更严格地遵循 蓝牙核心规范 5.2 版,并在第一个 GATT 客户端使用 BluetoothGatt#requestMtu(int) API 请求 MTU 时将 BLE ATT MTU 请求设为 517 字节,并忽略该 ACL 连接上的所有后续 MTU 请求。
如需解决此更改并使您的应用更为稳健,请考虑以下选项:
- 您的外围设备应使用外围设备可以容纳的合理值来响应 Android 设备的 MTU 请求。最终协商的值将是 Android 请求的值和远程提供的值(例如
min(517, remoteMtu))的较小值- 实现此修复程序可能需要更新外围设备的固件
- 或者,您也可以根据外围设备的已知支持值与收到的 MTU 更改值之间的最小值来限制 GATT 特征写入
- 提醒您,应将标头的支持大小减小 5 个字节
- 例如:
arrayMaxLength = min(SUPPORTED_MTU, GATT_MAX_ATTR_LEN(517)) - 5
Nuevo motivo por el que una app puede colocarse en el bucket de espera restringido
Android 14 introduce un nuevo motivo por el que una app puede colocarse en el bucket de App Standby restringido.
Las tareas de la app activan errores de ANR varias veces debido a los tiempos de espera de los métodos onStartJob, onStopJob o onBind.
(Consulta JobScheduler refuerza el comportamiento de devolución de llamada y de red para conocer los cambios en onStartJob y onStopJob).
Para hacer un seguimiento de si la app ingresó o no al bucket de espera restringido, te recomendamos que accedas con la API UsageStatsManager.getAppStandbyBucket() en la ejecución de la tarea o UsageStatsManager.queryEventsForSelf() en el inicio de la app.
mlock limitado a 64 KB
在 Android 14(API 级别 34)及更高版本中,平台将可使用 mlock() 锁定的最大内存量减少到每个进程 64 KB。在之前的版本中,每个进程的上限为 64 MB。此限制有助于更好地管理应用和系统的内存。为了在各种设备上提供更一致的体验,Android 14 针对兼容设备上的新 mlock() 限制添加了一项新的 CTS 测试。
El sistema aplica el uso de recursos de las apps almacenadas en caché
By design, an app's process is in a cached state when it's moved to the
background and no other app process components are running. Such an app process
is subject to being killed due to system memory pressure. Any work that
Activity instances perform after the onStop() method has been called and
returned, while in this state, is unreliable and strongly discouraged.
Android 14 introduces consistency and enforcement to this design. Shortly after an app process enters a cached state, background work is disallowed, until a process component re-enters an active state of the lifecycle.
Apps that use typical framework-supported lifecycle APIs – such as
services, JobScheduler, and Jetpack WorkManager – shouldn't be
impacted by these changes.
Experiencia del usuario
Cambios en la experiencia de los usuarios con notificaciones que no se pueden descartar
如果您的应用向用户显示不可关闭的前台通知,请注意:Android 14 已更改此行为,允许用户关闭此类通知。
这项变更适用于阻止用户关闭前台的应用
将 Notification.FLAG_ONGOING_EVENT 设置为
Notification.Builder#setOngoing(true) 或
NotificationCompat.Builder#setOngoing(true)。FLAG_ONGOING_EVENT 的行为已发生变化,使用户实际上能够关闭此类通知。
在以下情况下,此类通知仍不可关闭:
- 当手机处于锁定状态时
- 如果用户选择全部清除通知操作(有助于防止意外关闭)
此外,这一新行为不适用于以下用例中的通知:
CallStyle条通知- 企业设备政策控制器 (DPC) 和支持软件包
- 媒体通知
- 默认的搜索选择器软件包
La información de seguridad de los datos es más visible
为了加强用户隐私保护,Android 14 增加了系统显示您在 Play 管理中心表单中声明的信息的位置数量。目前,用户可以在 Google Play 中的应用详情的数据安全部分查看此信息。
我们建议您查看应用的位置数据分享政策,并花一点时间对应用的 Google Play“数据安全”部分进行任何适用的更新。
如需了解详情,请参阅有关如何在 Android 14 上以更显眼的方式显示数据安全信息的指南。
Accesibilidad
Escalamiento de fuente no lineal al 200%
A partir de Android 14, el sistema admite el escalamiento de la fuente hasta el 200%, lo que les brinda a los usuarios opciones de accesibilidad adicionales.
Si ya usas unidades de píxeles ajustados (sp) para definir el tamaño del texto, es probable que estos cambios no produzcan un gran impacto en tu app. Sin embargo, debes realizar pruebas de IU con el tamaño de fuente máximo habilitado (200%) para asegurarte de que tu app pueda admitir tamaños de fuente más grandes sin afectar la usabilidad.
Seguridad
Nivel mínimo de API objetivo instalable
从 Android 14 开始,targetSdkVersion 低于 23 的应用无法安装。要求应用满足这些最低目标 API 级别要求有助于提高用户的安全性和隐私性。
恶意软件通常会以较旧的 API 级别为目标平台,以绕过在较新版本 Android 中引入的安全和隐私保护机制。例如,有些恶意软件应用使用 targetSdkVersion 22,以避免受到 Android 6.0 Marshmallow(API 级别 23)在 2015 年引入的运行时权限模型的约束。这项 Android 14 变更使恶意软件更难以规避安全和隐私权方面的改进限制。尝试安装以较低 API 级别为目标平台的应用将导致安装失败,并且 Logcat 中会显示以下消息:
INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 23, but found 7
在升级到 Android 14 的设备上,targetSdkVersion 低于 23 的所有应用都将继续保持安装状态。
如果您需要测试以旧版 API 级别为目标平台的应用,请使用以下 ADB 命令:
adb install --bypass-low-target-sdk-block FILENAME.apk
Los nombres de los paquetes de los propietarios del contenido multimedia podrían estar ocultos
媒体库支持查询 OWNER_PACKAGE_NAME 列,该列表示存储特定媒体文件的应用。从 Android 14 开始,除非满足以下条件之一,否则系统会隐去此值:
- 存储媒体文件的应用有一个软件包名称始终对其他应用可见。
查询媒体库的应用会请求
QUERY_ALL_PACKAGES权限。
详细了解 Android 如何出于隐私保护目的而过滤软件包可见性。