Novedades sobre productos

Tercera versión beta de Android 17

Lectura de 5 min
Matthew McCullough
Vicepresidente de Administración de Productos, Android Developer

Android 17 alcanzó oficialmente la estabilidad de la plataforma hoy con la versión beta 3. Esto significa que la superficie de la API está bloqueada, por lo que puedes realizar las pruebas finales de compatibilidad y enviar tus apps orientadas a Android 17 a Play Store. Además, la versión beta 3 incluye una gran cantidad de funciones nuevas para ayudarte a compilar aplicaciones mejores, más seguras y altamente integradas.

Prepara tus apps, bibliotecas, herramientas y motores de juegos.

Si desarrollas un SDK, una biblioteca, una herramienta o un motor de juegos, es aún más importante que prepares las actualizaciones necesarias ahora para evitar que los desarrolladores de apps y juegos descendentes se vean bloqueados por problemas de compatibilidad y permitirles orientarse a las funciones más recientes del SDK. Informa a tus desarrolladores de nivel inferior si se necesitan actualizaciones para admitir Android 17 por completo.

large_Android17Timeline01.png

Las pruebas consisten en instalar tu app de producción o una app de prueba que use tu biblioteca o motor con Google Play o por otros medios en un dispositivo o emulador que ejecute Android 17 Beta 3. Revisa todos los flujos de tu app y busca problemas funcionales o de IU. Revisa los cambios de comportamiento para enfocar tus pruebas. Cada versión de Android contiene cambios en la plataforma que mejoran la privacidad, la seguridad y la experiencia del usuario en general, y estos cambios pueden afectar tus apps. Estos son algunos cambios en los que debes enfocarte:

  • Cambio de tamaño en pantallas grandes: Una vez que segmentes tu app para Android 17, ya no podrás inhabilitar el mantenimiento de las restricciones de orientación, cambio de tamaño y relación de aspecto en pantallas grandes.
  • Carga dinámica de código: Si tu app se segmenta para Android 17 o versiones posteriores, la protección de carga dinámica de código (DCL) más segura que se introdujo en Android 14 para los archivos DEX y JAR ahora se extiende a las bibliotecas nativas. Todos los archivos nativos cargados con System.load() deben marcarse como de solo lectura. De lo contrario, el sistema arroja UnsatisfiedLinkError.
  • Habilita CT de forma predeterminada: La transparencia de certificados (CT) está habilitada de forma predeterminada. (En Android 16, la CT está disponible, pero las apps debían habilitarla).
  • Protecciones de red local: De forma predeterminada, se bloquea el acceso a la red local para las apps que se segmentan para Android 17 o versiones posteriores. Si es posible, cambia a selectores que preserven la privacidad y usa el nuevo ACCESS_LOCAL_NETWORK para un acceso amplio y persistente.

Mejoras en la cámara y el contenido multimedia

Opciones de personalización del Selector de fotos

Ahora Android te permite personalizar la presentación visual del selector de fotos para que complemente mejor la interfaz de usuario de tu app. Con la nueva API de PhotoPickerUiCustomizationParams, puedes modificar la relación de aspecto de la vista de cuadrícula del cuadrado estándar de 1:1 a una pantalla vertical de 9:16. Esta flexibilidad se extiende tanto al intent ACTION_PICK_IMAGES como al selector de fotos integrado, lo que te permite mantener una estética coherente cuando los usuarios interactúan con contenido multimedia.

large_(Default)11aspectratio.png

Todo esto forma parte de nuestro esfuerzo por ayudar a que el selector de fotos de Android que preserva la privacidad se adapte perfectamente a la experiencia de tu app. Obtén más información para incorporar el selector de fotos directamente en tu app y ofrecer la experiencia más nativa.

val params = PhotoPickerUiCustomizationParams.Builder()
.setAspectRatio(PhotoPickerUiCustomizationParams.ASPECT_RATIO_PORTRAIT_9_16)
.build()
val intent = Intent(MediaStore.ACTION_PICK_IMAGES).apply {
putExtra(MediaStore.EXTRA_PICK_IMAGES_UI_CUSTOMIZATION_PARAMS, params)
}
startActivityForResult(intent, REQUEST_CODE)

Compatibilidad con el formato de imagen RAW14: Android 17 introduce compatibilidad con el formato de imagen RAW14 (el estándar de la industria de facto para la fotografía digital de alta gama) a través de la nueva constante ImageFormat.RAW14. RAW14 es un formato de un solo canal de 14 bits por píxel que usa un diseño densamente empaquetado en el que cada cuatro píxeles consecutivos se empaquetan en siete bytes.

Extensiones de cámara definidas por el proveedor: Android 17 agrega extensiones definidas por el proveedor para permitir que los socios de hardware definan e implementen modos de extensión de cámara personalizados para brindarte acceso a las mejores y más recientes funciones de la cámara, como "Súper resolución" o mejoras de vanguardia basadas en IA. Puedes consultar estos modos con la API de isExtensionSupported(int).

APIs de tipo de dispositivo de cámara: Las nuevas APIs de Android 17 te permiten consultar el tipo de dispositivo subyacente para identificar si una cámara es hardware integrado, una cámara web USB externa o una cámara virtual.

Compatibilidad con audífonos Bluetooth LE Audio

Android ahora incluye una categoría de dispositivo específica para los audífonos de audio Bluetooth de bajo consumo (BLE). Con la incorporación de la constante AudioDeviceInfo.TYPE_BLE_HEARING_AID, tu app ahora puede distinguir los audífonos de los auriculares normales.

val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
val devices = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS)
val isHearingAidConnected = devices.any { it.type == AudioDeviceInfo.TYPE_BLE_HEARING_AID }

Enrutamiento de audio detallado para audífonos

Android 17 permite a los usuarios administrar de forma independiente dónde se reproducen sonidos específicos del sistema. Pueden elegir enrutar las notificaciones, los tonos de llamada y las alarmas a los audífonos conectados o a la bocina integrada del dispositivo.

Codificador de software HE-AAC extendido

Android 17 introduce un codificador de software Extended HE-AAC proporcionado por el sistema. Este codificador admite tasas de bits bajas y altas con codificación unificada de voz y audio. Puedes acceder a este codificador a través de la API de MediaCodec con el nombre c2.android.xheaac.encoder o consultando el tipo de MIME audio/mp4a-latm.

val encoder = MediaCodec.createByCodecName("c2.android.xheaac.encoder")
val format = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_AAC, 48000, 1)
format.setInteger(MediaFormat.KEY_BIT_RATE, 24000)
format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectXHE)
encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)

Mejoras en el rendimiento y la batería

Cómo reducir los bloqueos de activación con compatibilidad de objetos de escucha para las alarmas de allow-while-idle

Android 17 introduce una nueva variante de AlarmManager.setExactAndAllowWhileIdle que acepta un OnAlarmListener en lugar de un PendingIntent. Este nuevo mecanismo basado en devoluciones de llamada es ideal para las apps que actualmente dependen de los wakelocks continuos para realizar tareas periódicas, como las apps de mensajería que mantienen conexiones de sockets.

val alarmManager = getSystemService(AlarmManager::class.java)
val listener = AlarmManager.OnAlarmListener {
// Do work here
}
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + 60000,
listener,
null
)

Actualizaciones de privacidad

Botón de ubicación proporcionado por el sistema

localcafe.jpg

Android presentará un botón de ubicación renderizado por el sistema que podrás incorporar directamente en el diseño de tu app con una biblioteca de Android Jetpack. Cuando un usuario presiona este botón del sistema, tu app obtiene acceso a la ubicación precisa solo para la sesión actual. Para implementar esto, debes declarar el permiso USE_LOCATION_BUTTON.

Configuración de visibilidad de contraseña discreta para teclados táctiles y físicos

Esta función divide el parámetro de configuración del sistema existente "Mostrar contraseñas" en dos preferencias del usuario distintas: una para las entradas basadas en el tacto y otra para las entradas del teclado físico (hardware). Ahora, los caracteres ingresados a través de teclados físicos se ocultan de inmediato de forma predeterminada.

val isPhysical = event.source and InputDevice.SOURCE_KEYBOARD == InputDevice.SOURCE_KEYBOARD
val shouldShow = android.text.ShowSecretsSetting.shouldShowPassword(context, isPhysical)

Seguridad

Se aplica la carga dinámica de código de solo lectura

Para mejorar la seguridad contra los ataques de inyección de código, Android ahora exige que las bibliotecas nativas cargadas de forma dinámica sean de solo lectura. Si tu app se orienta a Android 17 o versiones posteriores, todos los archivos nativos cargados con System.load() deben marcarse como de solo lectura de antemano.

val libraryFile = File(context.filesDir, "my_native_lib.so")
// Mark the file as read-only before loading to comply with Android 17+ security requirements
libraryFile.setReadOnly()
System.load(libraryFile.absolutePath)

Firma híbrida de APK con criptografía poscuántica (PQC)

Para prepararse para los futuros avances en la computación cuántica, Android introducirá la compatibilidad con la criptografía poscuántica (PQC) a través del nuevo esquema de firma de APK v3.2. Este esquema utiliza un enfoque híbrido que combina una firma clásica con una firma ML-DSA.

Experiencia del usuario y la IU del sistema

Mejor compatibilidad con widgets en pantallas externas

Esta función mejora la coherencia visual de los widgets de la app cuando se muestran en pantallas externas o conectadas con diferentes densidades de píxeles que usan unidades de DP o SP.

val options = appWidgetManager.getAppWidgetOptions(appWidgetId)
val displayId = options.getInt(AppWidgetManager.OPTION_APPWIDGET_DISPLAY_ID)
val remoteViews = RemoteViews(context.packageName, R.layout.widget_layout)
remoteViews.setViewPadding(
R.id.container,
16f, 8f, 16f, 8f,
TypedValue.COMPLEX_UNIT_DIP
)

Etiquetas de apps ocultas en la pantalla principal

Hiddenapplabelsonthehomescreen.png

Android ahora proporciona un parámetro de configuración del usuario para ocultar los nombres (etiquetas) de las apps en el espacio de trabajo de la pantalla principal. Asegúrate de que el ícono de tu app sea distintivo y reconocible.

Pantalla en pantalla interactiva para computadoras

A diferencia de la función tradicional de pantalla en pantalla, estas ventanas fijadas siguen siendo interactivas y permanecen siempre sobre otras ventanas de aplicaciones en el modo de escritorio.

val appTask: ActivityManager.AppTask = activity.getSystemService(ActivityManager::class.java).appTasks[0]
appTask.requestWindowingLayer(
ActivityManager.AppTask.WINDOWING_LAYER_PINNED,
context.mainExecutor,
object : OutcomeReceiver<Int, Exception> {
override fun onResult(result: Int) {
if (result == ActivityManager.AppTask.WINDOWING_LAYER_REQUEST_GRANTED) {
// Task successfully moved to pinned layer
}
}
override fun onError(error: Exception) {}
}
)

Se rediseñó la barra de herramientas de grabación de pantalla

large_Recording-redesign.png

Funcionalidad principal

Configuración de exclusión de la app de VPN

Con el nuevo intent ACTION_VPN_APP_EXCLUSION_SETTINGS, tu app puede iniciar una pantalla de configuración administrada por el sistema en la que los usuarios pueden seleccionar aplicaciones para omitir el túnel de VPN.

val intent = Intent(Settings.ACTION_VPN_APP_EXCLUSION_SETTINGS)
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
}

Actualizaciones de las APIs de OpenJDK 25 y 21

Esta actualización incluye amplias funciones y mejoras de OpenJDK 21 y OpenJDK 25, incluida la compatibilidad con Unicode más reciente y la compatibilidad mejorada con SSL para grupos con nombre en TLS.

Comienza a usar Android 17

Puedes inscribir cualquier dispositivo Pixel compatible o usar las imágenes del sistema de 64 bits con Android Emulator.

  • Compila con el nuevo SDK y envía informes de problemas en la página de comentarios.
  • Prueba la compatibilidad de tu app actual y descubre si se ve afectada por los cambios en Android 17.

Para obtener información completa, visita el sitio para desarrolladores de Android 17.

Escrito por:

Seguir leyendo