La plataforma de Android 15 incluye cambios de comportamiento que podrían afectar tu app.
Los siguientes cambios se aplican a todas las apps cuando se ejecutan en Android 15,
independientemente de targetSdkVersion. Debes probar tu app y, luego, modificarla según corresponda para admitir estos cambios.
Asegúrate también de revisar la lista de cambios de comportamiento que solo afectan a las apps orientadas a Android 15.
Funcionalidad principal
Android 15 modifica o expande varias capacidades principales del sistema Android.
Cambios en el estado detenido del paquete
软件包 FLAG_STOPPED 状态(用户可以通过在 AOSP build 中长按应用图标并选择“强制停止”来启用此状态)的用途一直是让应用保持在此状态,直到用户通过直接启动应用或间接与应用互动(通过 Sharesheet 或 widget、将应用选择为动态壁纸等)来明确将应用从此状态移除。在 Android 15 中,我们更新了系统行为,使其与此预期行为保持一致。应用应仅通过直接或间接的用户操作从停止状态移除。
为了支持预期行为,除了现有限制之外,当应用在搭载 Android 15 的设备上进入停止状态时,系统还会取消所有待处理 intent。当用户的操作将应用从停止状态移除时,系统会将 ACTION_BOOT_COMPLETED 广播传送到应用,以便应用有机会重新注册所有待处理 intent。
您可以调用新的 ApplicationStartInfo.wasForceStopped() 方法来确认应用是否已进入停止状态。
Compatibilidad con tamaños de página de 16 KB
Históricamente, Android solo admitió tamaños de página de memoria de 4 KB, lo que optimizó el rendimiento de la memoria del sistema para la cantidad promedio de memoria total que suelen tener los dispositivos Android. A partir de Android 15, el AOSP admite dispositivos configurados para usar un tamaño de página de 16 KB (dispositivos de 16 KB). Si tu app usa alguna biblioteca del NDK, ya sea directamente o a través de un SDK, deberás volver a compilarla para que funcione en estos dispositivos de 16 KB.
A medida que los fabricantes de dispositivos sigan creando dispositivos con mayores cantidades de memoria física (RAM), muchos de estos dispositivos adoptarán tamaños de página de 16 KB (y, con el tiempo, incluso mayores) para optimizar el rendimiento del dispositivo. Agregar compatibilidad con dispositivos con tamaño de página de 16 KB permite que tu app se ejecute en estos dispositivos y se beneficie de las mejoras de rendimiento asociadas. Sin recompilación, las apps no funcionarán en dispositivos de 16 KB en futuras versiones de Android.
Para ayudarte a agregar compatibilidad con tu app, te proporcionamos orientación sobre cómo comprobar si tu app se ve afectada, cómo volver a compilar tu app (si corresponde) y cómo probar tu app en un entorno de 16 KB con emuladores (incluidas las imágenes del sistema de Android 15 para Android Emulator).
Beneficios y mejoras de rendimiento
Los dispositivos configurados con tamaños de página de 16 KB usan un poco más de memoria en promedio, pero también obtienen varias mejoras de rendimiento para el sistema y las apps:
- Tiempos de inicio de la app más bajos mientras el sistema está bajo presión de memoria: un 3.16% más bajo en promedio, con mejoras más significativas (hasta un 30%) para algunas apps que probamos
- Menor consumo de energía durante el lanzamiento de la app: Reducción promedio del 4.56%
- Inicio más rápido de la cámara: Inicios en caliente un 4.48% más rápidos en promedio y, en promedio, un 6.60% más rápidos en frío
- Mejor tiempo de inicio del sistema: se mejoró en un 8% (aproximadamente 950 milisegundos) en promedio.
Estas mejoras se basan en nuestras pruebas iniciales, y es probable que los resultados en los dispositivos reales difieran. Proporcionaremos análisis adicionales de posibles ganancias para las apps a medida que continuemos con las pruebas.
Verifica si tu app se ve afectada
Si tu app usa código nativo, debes recompilarla para que sea compatible con dispositivos de 16 KB. Si no sabes con seguridad si tu app usa código nativo, puedes usar el Analizador de APK para identificar si hay código nativo presente y, luego, verificar la alineación de los segmentos ELF de las bibliotecas compartidas que encuentres. Android Studio también proporciona funciones que te ayudan a detectar automáticamente problemas de alineación.
Si tu app solo usa código escrito en el lenguaje de programación Java o en Kotlin, incluidas todas las bibliotecas o SDKs, ya es compatible con dispositivos de 16 KB. Sin embargo, te recomendamos que pruebes tu app en un entorno de 16 KB para verificar que no haya regresiones inesperadas en el comportamiento de la app.
Cambios necesarios para que algunas apps admitan el espacio privado
El espacio privado es una nueva función de Android 15 que permite a los usuarios crear un espacio independiente en su dispositivo en el que pueden mantener las apps sensibles lejos de miradas indiscretas, con una capa adicional de autenticación. Debido a que las apps del espacio privado tienen visibilidad restringida, algunos tipos de apps deben seguir pasos adicionales para poder ver e interactuar con las apps del espacio privado de un usuario.
Todas las apps
Debido a que las apps del espacio privado se mantienen en un perfil de usuario independiente, similar a los perfiles de trabajo, las apps no deben suponer que las copias instaladas de su app que no están en el perfil principal están en el perfil de trabajo. Si tu app tiene lógica relacionada con apps de perfil de trabajo que hacen esta suposición, deberás ajustarla.
Apps médicas
Cuando un usuario bloquea el espacio privado, se detienen todas las apps que se encuentran en él, y estas no pueden realizar actividades en primer o segundo plano, incluida la visualización de notificaciones. Este comportamiento podría afectar de manera significativa el uso y la función de las apps médicas instaladas en el espacio privado.
La experiencia de configuración del espacio privado advierte a los usuarios que el espacio privado no es adecuado para apps que necesitan realizar actividades críticas en primer o segundo plano, como mostrar notificaciones de apps médicas. Sin embargo, las apps no pueden determinar si se están usando o no en el espacio privado, por lo que no pueden mostrar una advertencia al usuario en este caso.
Por estos motivos, si desarrollas una app médica, revisa cómo esta función podría afectarla y toma las medidas adecuadas, como informar a los usuarios que no la instalen en el espacio privado, para evitar interrumpir sus funciones fundamentales.
Apps de lanzamiento
Si desarrollas una app de selector, debes hacer lo siguiente para que las apps del espacio privado sean visibles:
- Tu app debe asignarse como la app de selector predeterminado del dispositivo, es decir, debe tener el rol
ROLE_HOME. - Tu app debe declarar el permiso normal
ACCESS_HIDDEN_PROFILESen el archivo de manifiesto de la app.
Las apps de selector que declaran el permiso ACCESS_HIDDEN_PROFILES deben controlar los siguientes casos de uso de espacio privado:
- Tu app debe tener un contenedor de selector independiente para las apps instaladas en el espacio privado. Usa el método
getLauncherUserInfo()para determinar qué tipo de perfil de usuario se está controlando. - El usuario debe poder ocultar y mostrar el contenedor de espacio privado.
- El usuario debe poder bloquear y desbloquear el contenedor de espacio privado. Usa el método
requestQuietModeEnabled()para bloquear (pasandotrue) o desbloquear (pasandofalse) el espacio privado. Cuando está bloqueado, ninguna app del contenedor de espacio privado debe ser visible ni detectable a través de mecanismos como la búsqueda. Tu app debe registrar un receptor para las transmisiones de
ACTION_PROFILE_AVAILABLEyACTION_PROFILE_UNAVAILABLE, y actualizar la IU en tu app cuando cambie el estado de bloqueo o desbloqueo del contenedor de espacio privado. Ambas transmisiones incluyenEXTRA_USER, que tu app puede usar para hacer referencia al usuario del perfil privado.También puedes usar el método
isQuietModeEnabled()para verificar si el perfil de espacio privado está bloqueado o no.
Apps de tiendas de aplicaciones
El espacio privado incluye un botón "Instalar apps" que inicia un intent implícito para instalar apps en el espacio privado del usuario. Para que tu app reciba este intent implícito, declara un <intent-filter> en el archivo de manifiesto de tu app con un <category> de CATEGORY_APP_MARKET.
Se quitó la fuente de emojis basada en PNG
Se quitó el archivo de fuente de emojis heredado basado en PNG (NotoColorEmojiLegacy.ttf) y solo se dejó el archivo basado en vectores. A partir de Android 13 (nivel de API 33), el archivo de fuente de emojis que usa el renderizador de emojis del sistema cambió de un archivo basado en PNG a uno basado en vectores. El sistema retuvo el archivo de fuente heredado en Android 13 y 14 por motivos de compatibilidad, de modo que las apps con sus propios renderizadores de fuentes pudieran seguir usándolo hasta que pudieran actualizarse.
Para verificar si tu app se ve afectada, busca referencias al archivo NotoColorEmojiLegacy.ttf en el código de la app.
Puedes adaptar tu app de varias maneras:
- Usa las APIs de la plataforma para la renderización de texto. Puedes renderizar texto en un
Canvascon copia de seguridad de mapa de bits y usarlo para obtener una imagen sin procesar si es necesario. - Agrega compatibilidad con fuentes COLRv1 a tu app. La biblioteca de código abierto FreeType es compatible con COLRv1 en la versión 2.13.0 y versiones posteriores.
- Como último recurso, puedes agrupar el archivo de fuente de emojis heredado (
NotoColorEmoji.ttf) en tu APK, aunque, en ese caso, a tu app le faltarán las actualizaciones de emojis más recientes. Para obtener más información, consulta la página del proyecto de GitHub de Noto Emoji.
Se aumentó la versión mínima del SDK de destino de 23 a 24
Android 15 基于
在 Android 14 中进行的更改,并扩展了
安全性。在 Android 15 中,
无法安装低于 24 的 targetSdkVersion。
要求应用符合现代 API 级别有助于确保更好的安全性和
保护隐私。
恶意软件通常会以较低的 API 级别为目标平台,以绕过安全和隐私
更高的 Android 版本中引入的保护机制。例如,有些恶意软件应用使用 targetSdkVersion 22,以避免受到 Android 6.0 Marshmallow(API 级别 23)在 2015 年引入的运行时权限模型的约束。这项 Android 15 变更使恶意软件更难以规避安全和隐私权方面的改进限制。尝试安装以较低 API 级别为目标平台的应用将导致安装失败,并且 Logcat 中会显示如下所示的消息:
INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 24, but found 7
在升级到 Android 15 的设备上,targetSdkVersion 级别较低的任何应用
安装在 Google Play 上
如果您需要测试以旧版 API 级别为目标平台的应用,请使用以下 ADB 命令:
adb install --bypass-low-target-sdk-block FILENAME.apk
Seguridad y privacidad
Android 15 引入了强大的措施来防范动态密码 (OTP) 欺诈并保护用户的敏感内容,重点是增强通知监听器服务和屏幕共享保护措施。主要增强功能包括从可供不可信应用访问的通知中隐去 OTP、在屏幕共享期间隐藏通知,以及在发布 OTP 时保护应用 activity。这些变更旨在保护用户的敏感内容,使其免受未经授权的操作者的侵害。
开发者需要注意以下事项,以确保其应用与 Android 15 中的变更兼容:
动态密码隐去
Android 会阻止实现 NotificationListenerService 的不受信任应用读取已检测到 OTP 的通知中的未隐去的内容。配套设备管理器关联等受信任应用不受这些限制。
屏幕共享保护
- 在屏幕共享会话期间,系统会隐藏通知内容,以保护用户的隐私。如果应用实现了
setPublicVersion(),Android 会显示通知的公开版本,该版本在不安全情境中用作替换通知。否则,系统会隐去通知内容,不提供任何其他背景信息。 - 系统会向远程观看者隐藏密码输入等敏感内容,以防止泄露用户的敏感信息。
- 如果在屏幕共享期间检测到动态密码,系统会隐藏在该时间段内发布通知的应用的活动。应用内容在启动时会向远程查看器隐藏。
- 除了 Android 自动识别敏感字段之外,开发者还可以使用
setContentSensitivity手动将应用的部分标记为敏感,在屏幕共享期间,这些敏感字段会对远程观看者隐藏。 - 开发者可以选择切换开发者选项下的停用屏幕共享防护选项,以便出于演示或测试目的豁免屏幕共享防护。默认的系统屏幕录制工具不受这些更改的影响,因为录制内容会保留在设备上。
Cámara y contenido multimedia
Android 15 realiza los siguientes cambios en el comportamiento de la cámara y los medios para todas las apps.
La reproducción de audio directa y la reproducción de audio descargada invalidan las pistas de audio directas o descargadas que se abrieron anteriormente cuando se alcanzan los límites de recursos.
在 Android 15 之前,如果某个应用在另一个应用播放音频且达到资源限制时请求直接或分流音频播放,该应用将无法打开新的 AudioTrack。
从 Android 15 开始,当应用请求直接播放或分流播放且达到资源限制时,系统会使任何当前打开的 AudioTrack 对象失效,以防止执行新轨道请求。
(直接音轨和分流音轨通常会打开,以播放压缩音频格式。播放直接音频的常见用例包括通过 HDMI 将编码的音频流式传输到电视。分流轨道通常用于在具有硬件 DSP 加速的移动设备上播放压缩音频。)
Experiencia del usuario y la IU del sistema
Android 15 incluye algunos cambios que tienen como objetivo crear una experiencia del usuario más coherente e intuitiva.
Se habilitaron las animaciones del gesto atrás predictivo para las apps que habilitaron la función.
A partir de Android 15, se quitó la opción para desarrolladores de animaciones de atrás predictivo. Las animaciones del sistema, como volver a la página principal, cambiar de tarea y cambiar de actividad, ahora aparecen en las apps que habilitaron el gesto atrás predictivo por completo o a nivel de la actividad. Si tu app se ve afectada, realiza las siguientes acciones:
- Asegúrate de que tu app se haya migrado correctamente para usar el gesto atrás predictivo.
- Asegúrate de que las transiciones de fragmentos funcionen con la navegación con atrás predictivo.
- Migra de las animaciones y las transiciones de framework, y usa transiciones de animador y androidx.
- Migra de las pilas de actividades que
FragmentManagerno conoce. En su lugar, usa pilas de actividades administradas porFragmentManagero por el componente Navigation.
Se inhabilitan los widgets cuando el usuario fuerza la detención de una app
Si un usuario detiene de forma forzosa una app en un dispositivo que ejecuta Android 15, el sistema inhabilita temporalmente todos los widgets de la app. Los widgets están inhabilitados, y el usuario no puede interactuar con ellos. Esto se debe a que, a partir de Android 15, el sistema cancela todos los intents pendientes de una app cuando se detiene de forma forzosa.
El sistema vuelve a habilitar esos widgets la próxima vez que el usuario inicia la app.
Para obtener más información, consulta Cambios en el estado de detención del paquete.
El chip de la barra de estado de proyección de medios alerta a los usuarios sobre el uso compartido, la transmisión y la grabación de pantalla
Los exploits de proyección de pantalla exponen datos privados del usuario, como información financiera, porque los usuarios no se dan cuenta de que se está compartiendo la pantalla de su dispositivo.
En el caso de las apps que se ejecutan en dispositivos con Android 15 QPR1 o versiones posteriores, un chip de la barra de estado grande y destacado alerta a los usuarios sobre cualquier proyección de pantalla en curso. Los usuarios pueden presionar el chip para evitar que se comparta, transmita o grabe su pantalla. Además, la proyección de pantalla se detiene automáticamente cuando se bloquea la pantalla del dispositivo.
Verifica si tu app se verá afectada
De forma predeterminada, tu app incluye el chip de la barra de estado y suspende automáticamente la proyección de pantalla cuando se activa la pantalla de bloqueo.
Para obtener más información sobre cómo probar tu app para estos casos de uso, consulta Chip de la barra de estado y detención automática.
Restricciones de acceso a la red en segundo plano
En Android 15, las apps que inician una solicitud de red fuera de un ciclo de vida del proceso válido reciben una excepción. Por lo general, un UnknownHostException o algún otro IOException relacionado con el zócalo. Por lo general, las solicitudes de red que se producen fuera de un ciclo de vida válido se deben a que las apps continúan una solicitud de red sin saberlo, incluso después de que la app ya no está activa.
Para mitigar esta excepción, asegúrate de que tus solicitudes de red sean conscientes del ciclo de vida y se cancelen cuando salgan de un ciclo de vida de proceso válido con componentes conscientes del ciclo de vida. Si es importante que la solicitud de red se realice incluso cuando el usuario salga de la aplicación, considera programar la solicitud de red con WorkManager o continuar una tarea visible para el usuario con el servicio en primer plano.
Bajas
Con cada actualización, es posible que las APIs específicas de Android queden obsoletas o deban refactorizarse a fin de ofrecerles una mejor experiencia a los desarrolladores o admitir nuevas funciones de la plataforma. En estos casos, damos de baja oficialmente las APIs obsoletas y les indicamos a los desarrolladores las APIs alternativas que pueden usar en su lugar.
Baja significa que finalizamos la asistencia oficial para las APIs, pero estas seguirán disponibles para los desarrolladores. Para obtener más información sobre las bajas destacadas en esta versión de Android, consulta la página de bajas.