Ya está disponible la segunda Vista previa para desarrolladores de Android 11; pruébala y comparte tus comentarios.

API y funciones de Android 10

Android 10 presenta funciones y capacidades increíbles para usuarios y desarrolladores. En este documento, se destacan las novedades para desarrolladores.

Para obtener información sobre las API, lee el informe de diferencias de las API o consulta la referencia de la API de Android (busca las API "agregadas a la API nivel 29"). Además, asegúrate de consultar los cambios en el comportamiento de Android 10 (para apps que se orientan a la API nivel 29 y todas las apps), aparte de los cambios en la privacidad, a fin de obtener información sobre las áreas en las que los cambios en la plataforma podrían afectar a tus apps.

Mejoras de seguridad

En Android 10, se incluyen varias funciones de seguridad que se resumen en las siguientes secciones.

Diálogos de autenticación biométrica mejorados

En Android 10, se introducen las siguientes mejoras para la compatibilidad con la autenticación biométrica:

  • Se agregó una comprobación para la capacidad de autenticación biométrica.
  • Se agregó un mecanismo de resguardo que permite que un usuario se autentique con el PIN, el patrón o la contraseña de su dispositivo si no puede autenticarse con sus datos biométricos.
  • Se agregó una sugerencia que le indica al sistema que no solicite la confirmación del usuario una vez que este se autenticó mediante una modalidad biométrica implícita. Por ejemplo, puedes indicarle al sistema que no requiera pasos de confirmación adicionales una vez que un usuario se autenticó mediante la autenticación facial.

Ejecuta código DEX incorporado directamente desde un APK

A partir de Android 10, puedes indicarle a la plataforma que ejecute código DEX incorporado directamente desde el archivo APK de tu app. Esta opción puede ayudar a evitar un ataque si el atacante logró manipular el código compilado localmente en el dispositivo.

Para obtener más información, consulta Cómo ejecutar código DEX incorporado directamente desde el APK.

Compatibilidad con TLS 1.3

En Android 10, se agrega compatibilidad con TLS 1.3. TLS 1.3 es una importante revisión del estándar de TLS que incluye ventajas de rendimiento y seguridad mejorada. Nuestras comparativas indican que se pueden establecer conexiones seguras hasta un 40% más rápido con TLS 1.3 que con TLS 1.2.

Si quieres obtener más detalles sobre nuestra implementación de TLS 1.3, consulta la página de la sección de TLS que incluye los cambios en el comportamiento para todas las apps.

API de Conscrypt pública

A partir de Android 10, el proveedor de seguridad de Conscrypt incluye una API pública para la funcionalidad de TLS.

La colección de clases en android.net.ssl contiene métodos estáticos para acceder a funcionalidades que no están disponibles desde las API de javax.net.ssl genéricas. Los nombres de estas clases se pueden inferir como el plural de la clase javax.net.ssl asociada. Por ejemplo, el código que opera en instancias de javax.net.ssl.SSLSocket puede usar métodos de la clase SSLSockets en su lugar.

Funciones de conectividad

En Android 10, se incluyen varias mejoras relacionadas con redes y conectividad.

API de conexión de red Wi-Fi

En Android 10, se admiten las conexiones entre pares. Esta función permite que tu app le solicite al usuario que cambie el punto de acceso al que está conectado el dispositivo por medio de WifiNetworkSpecifier para describir las propiedades de una red solicitada. La conexión entre pares no se usa para proporcionar redes, sino para conectar dispositivos secundarios con otros fines, por ejemplo, para configurar el arranque de un Chromecast o del hardware de Google Home.

Para obtener más información, consulta API de solicitud de red Wi-Fi para la conectividad entre pares.

API de sugerencia de red Wi-Fi

Android 10 permite que tu app le solicite al usuario que se conecte a un punto de acceso de Wi-Fi. Puedes brindar sugerencias de redes a las cuales conectarse. En última instancia, la plataforma elegirá qué punto de acceso aceptar en función de la información que obtenga de ti y de otras apps.

Para obtener más información sobre esta función, consulta las sugerencias de Wi-Fi.

Mejoras a los modos de baja latencia y alto rendimiento de Wi-Fi

Android 10 te permite sugerirle al módem subyacente que minimice la latencia.

Además, amplía la API de bloqueo de Wi-Fi para brindar compatibilidad con el modo de alto rendimiento y el modo de baja latencia de manera efectiva. El ahorro de energía de Wi-Fi está inhabilitado para el modo de alto rendimiento y baja latencia, y podrías habilitar una mayor optimización de la latencia en el modo de baja latencia, según la compatibilidad del módem.

El modo de baja latencia solo está habilitado cuando la app que adquiere el bloqueo se está ejecutando en segundo plano y la pantalla está encendida. El modo de baja latencia es especialmente útil para las apps de juegos para dispositivos móviles en tiempo real.

Búsquedas especializadas en el agente de resolución de DNS

En Android 10, se agrega compatibilidad nativa con las búsquedas de DNS especializadas mediante búsquedas de Cleartext y un modo de DNS mediante TLS. Anteriormente, el agente de resolución de DNS de la plataforma solo admitía registros A y AAAA (lo que permitía buscar únicamente las direcciones IP asociadas con un nombre), pero no admitía ningún otro tipo de registro. La API de DnsResolver proporciona una resolución asíncrona genérica, que te permite buscar SRV, NAPTR y otros tipos de registro. Ten en cuenta que la app realizará el análisis de la respuesta.

Para obtener información sobre las apps basadas en NDK, consulta android_res_nsend.

Easy Connect para Wi-Fi

Como reemplazo de WPS, que dejó de estar disponible, Android 10 te permite usar Easy Connect para aprovisionar credenciales de Wi-Fi a un dispositivo de pares. Las apps pueden integrar Easy Connect en su flujo de aprovisionamiento y configuración mediante el intent ACTION_PROCESS_WIFI_EASY_CONNECT_URI.

Para obtener más información sobre esta función, consulta Easy Connect para Wi-Fi.

API de conexión para Wi-Fi directo

Las clases de API WifiP2pConfig y WifiP2pManager tienen actualizaciones en Android 10 a fin de admitir las capacidades para establecer conexión rápidamente con Wi-Fi directo mediante información predeterminada. Esta información se comparte mediante un canal lateral, como Bluetooth o NFC.

En el siguiente código se muestra cómo crear un grupo con información predeterminada:

Kotlin

    val manager = getSystemService(Context.WIFI_P2P_SERVICE) as WifiP2pManager
    val channel = manager.initialize(this, mainLooper, null)

    // prefer 5G band for this group
    val config = WifiP2pConfig.Builder()
        .setNetworkName("networkName")
        .setPassphrase("passphrase")
        .enablePersistentMode(false)
        .setGroupOperatingBand(WifiP2pConfig.GROUP_OWNER_BAND_5GHZ)
        .build()

    // create a non-persistent group on 5GHz
    manager.createGroup(channel, config, null)
    

Java

    WifiP2pManager manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
    Channel channel = manager.initialize(this, getMainLooper(), null);

    // prefer 5G band for this group
    WifiP2pConfig config = new WifiP2pConfig.Builder()
    .setNetworkName("networkName")
    .setPassphrase("passphrase")
    .enablePersistentMode(false)
    .setGroupOperatingBand(WifiP2pConfig.GROUP_OWNER_BAND_5GHZ)
    .build();

    // create a non-persistent group on 5GHz
    manager.createGroup(channel, config, null);
    

Para unirte a un grupo mediante credenciales, reemplaza manager.createGroup() con el código siguiente:

Kotlin

    manager.connect(channel, config, null)
    

Java

    manager.connect(channel, config, null);
    

Canales orientados a la conexión (CoC) de Bluetooth de bajo consumo

Android 10 permite que tu app use conexiones CoC de BLE para transferir flujos de datos más grandes entre dos dispositivos BLE. Esta interfaz abstrae las mecánicas de Bluetooth y de conectividad para simplificar la implementación.

Funciones de telefonía

En Android 10, se incluyen varias mejoras relacionadas con la telefonía.

Mejoras en la calidad de las llamadas

En Android 10, se agrega la capacidad de recopilar información sobre la calidad de las llamadas en curso del Subsistema multimedia de IP (IMS), lo que incluye la calidad de envío y recepción de la red en los dispositivos que admiten esta función.

Identificador de llamada y número de llamada

Android 10 proporciona una manera para que tu app pueda identificar llamadas de emisores que no están en la libreta de direcciones del usuario y posibles llamadas de spam. Además, puede rechazar llamadas de spam de manera silenciosa en nombre del usuario. La información sobre estas llamadas bloqueadas se registra en la categoría correspondiente del registro de llamadas a fin de brindar mayor transparencia al usuario cuando tiene llamadas perdidas. El uso de esta API elimina el requisito de obtener permisos de READ_CALL_LOG del usuario a fin de brindar la funcionalidad de identificador de llamada y número de llamada.

API de servicio de redireccionamiento de llamadas

Android 10 cambia la manera en la que se administran los intents de las llamadas. La transmisión de NEW_OUTGOING_CALL dejó de estar disponible y se reemplazó con la API de CallRedirectionService. La API de CallRedirectionService brinda interfaces para que puedas modificar las llamadas salientes que hace la plataforma Android. Por ejemplo, las apps de terceros podrían cancelar llamadas y redirigirlas mediante VoIP.

Mejoras en la creación de archivos en el almacenamiento externo

Además de la introducción del almacenamiento específico, Android 10 agrega las siguientes capacidades relacionadas con el almacenamiento externo:

  • Puedes usar la marca IS_PENDING para otorgarle a tu app acceso exclusivo a un archivo multimedia mientras se escribe en el disco.
  • Si conoces la ubicación específica en la que deberían almacenarse los archivos, puedes brindarle una sugerencia al sistema que indique dónde debe almacenar los archivos escritos recientemente.
  • Cada dispositivo de almacenamiento externo tiene un nombre de volumen único.

Contenido multimedia y gráficos

En Android 10, se incluyen las siguientes API y funciones de contenido multimedia y gráficos nuevas:

Uso compartido de entradas de audio

Android 10 agrega la capacidad para que dos apps compartan la entrada de audio simultáneamente. Para obtener información completa, consulta Uso compartido de entradas de audio.

Captura de reproducción de audio

Android 10 brinda a una app la capacidad de capturar la reproducción de audio de otras apps. Para obtener la información completa, consulta Captura de la reproducción.

Barra de búsqueda en notificaciones MediaStyle

A partir de Android 10, las notificaciones MediaStyle muestran una barra de búsqueda en la que se ve el progreso de la reproducción desde PlaybackState.getPosition() y, en algunos casos, puede buscarse una ubicación en el programa en reproducción. A continuación, se muestran las reglas que controlan la apariencia y el comportamiento de la barra de búsqueda:

  • La barra de búsqueda aparece si hay una MediaSession activa y su duración (especificada por MediaMetadata.METADATA_KEY_DURATION) es mayor que cero, lo que significa que la barra no aparece para transmisiones indeterminadas como las transmisiones en vivo y las emisiones de radio.
  • Si la sesión implementa ACTION_SEEK_TO, el usuario puede arrastrar la barra de búsqueda a fin de controlar la ubicación de la reproducción.

API MIDI nativa

La API de MIDI nativo de Android (AMidi) brinda a los desarrolladores de apps la capacidad de enviar y recibir datos de MIDI con código C/C++, lo que permite mejorar la integración con la lógica de audio/control de C/C++ y minimizar la necesidad de JNI.

Para obtener más información, consulta API de MIDI nativo de Android.

Mejoras de MediaCodecInfo

Android 10 agrega métodos a MediaCodecInfo que proporcionan más información sobre un códec.

Para obtener más información, consulta Códecs de archivos multimedia.

API térmica

Cuando los dispositivos se sobrecalientan, pueden acelerar la CPU o la GPU, lo que puede afectar a las apps y los juegos de forma inesperada. Las apps que usan gráficos complejos, cálculos exigentes o actividad de red constante son más propensas a tener problemas, que pueden variar en función de los dispositivos según la frecuencia del chipset y del núcleo, los niveles de integración, el embalaje del dispositivo y el factor de forma.

Ahora, en Android 10, las apps y los juegos pueden usar una API térmica para supervisar los cambios en el dispositivo y tomar medidas que permiten mantener un menor consumo de energía a fin de restablecer la temperatura normal. Las apps registran un objeto de escucha en PowerManager, mediante el cual el sistema informa el estado térmico actual que va desde leve y moderado a grave, crítico, de emergencia y apagado.

Cuando el dispositivo informa sobre un aumento considerable de la temperatura, las apps y los juegos pueden interrumpir actividades en curso para ayudar a reducir el uso de energía de varias maneras. Por ejemplo, las apps de streaming podrían reducir la resolución, la tasa de bits o el tráfico de red; una app de cámara podría inhabilitar el flash o la mejora intensiva de imágenes; un juego podría reducir la velocidad de fotogramas o el teselado; una app de contenido multimedia podría reducir el volumen de las bocinas; y una app de mapas podría desactivar el GPS.

La API térmica requiere una nueva capa HAL para dispositivos. Actualmente es compatible con dispositivos Pixel que ejecutan Android 10, y estamos trabajando con nuestros socios fabricantes para ampliar la compatibilidad en el ecosistema lo más rápido posible.

Imágenes y cámara

A continuación, se muestran las nuevas funciones relacionadas con las imágenes y la cámara que incluye Android 10:

Compatibilidad con la cámara monocromática

Android 9 (con nivel de API 28) fue la primera versión que introdujo la capacidad de cámara monocromática. En Android 10, se agregaron varias mejoras a la compatibilidad con la cámara monocromática:

  • Compatibilidad con el formato de transmisión Y8 para mejorar la eficiencia de la memoria
  • Compatibilidad con la captura DNG sin procesar monocromática
  • Introducción a las enumeraciones MONO y NIR CFA para distinguir entre la cámara monocromática regular y las cámaras casi infrarrojas

Puedes usar esta función para capturar una imagen monocromática nativa. Un dispositivo multicámara lógico puede usar una cámara monocromática como subcámara física para mejorar la calidad de la imagen cuando hay poca luz.

Formato de profundidad dinámica

A partir de Android 10, las cámaras pueden almacenar los datos de profundidad de una imagen en un archivo separado, mediante un esquema nuevo llamado formato de profundidad dinámica (DDF). Las apps pueden solicitar la imagen JPG y sus metadatos de profundidad y usar esa información para aplicar un desenfoque deseado en el procesamiento posterior sin modificar los datos originales de la imagen.

Si quieres leer la especificación para este formato, consulta Formato de profundidad dinámica.

Formato de archivo de imagen de alta eficiencia

El formato de archivo de imagen de alta eficiencia (HEIF) es un formato estándar de imágenes y videos que introduce codificación de mejor calidad y un tamaño de archivo más pequeño en comparación con otros formatos de archivo.

Para obtener más información, consulta HEIC.

Mejoras en la función de varias cámaras

Android 10 mejora la fusión de varias cámaras en una única cámara lógica; esta función se introdujo en Android 9 (nivel de API 28). Se agregó lo siguiente a la API de Camera2:

API de servicios de accesibilidad

En Android 10, se incluyen las siguientes API y funciones de servicios de accesibilidad nuevas:

Marca de clave de entrada de AccessibilityNodeInfo

A partir de Android 10, puedes llamar a isTextEntryKey() para determinar si un elemento AccessibilityNodeInfo específico representa una clave de entrada de texto que forma parte de un teclado.

Comentarios por voz del diálogo de accesibilidad

En el caso de que los usuarios necesiten ejecutar el acceso directo de accesibilidad para iniciar un servicio de accesibilidad, Android 10 permite que el diálogo se muestre junto con una solicitud de texto a voz si el servicio la solicita.

Acceso directo de accesibilidad cuando la navegación por gestos está habilitada

Cuando se habilita la función de navegación por gestos en Android 10, no es posible ver ni seleccionar el botón de accesibilidad. Para acceder al menú de servicios de accesibilidad, los usuarios deben realizar uno de los siguientes gestos:

  • Deslizan dos dedos hacia arriba.
  • Deslizan dos dedos hacia arriba y los mantienen presionados.

Acceso directo de accesibilidad para teclados físicos

En Android 10, los usuarios pueden activar el acceso directo de accesibilidad en un teclado físico presionando Control+Alt+Z.

Mejora del controlador de teclado en pantalla

En Android 10, los servicios de accesibilidad pueden solicitar que se muestre el teclado en pantalla incluso cuando el dispositivo detecta un teclado físico conectado. Los usuarios no pueden anular este comportamiento.

Tiempos de espera de accesibilidad definidos por el usuario

Android 10 introduce la API de getRecommendedTimeoutMillis(), que proporciona compatibilidad con los tiempos de espera definidos por el usuario para los elementos de IU interactivos y no interactivos. El valor de retorno se basa en las preferencias del usuario y las API del servicio de accesibilidad.

Mejoras de autocompletar

En Android 10, se incluyen las siguientes mejoras para el servicio de autocompletar.

Solicitudes de autocompletar relacionadas con la compatibilidad

Ahora puedes usar el marcador FillRequest.FLAG_COMPATIBILITY_MODE_REQUEST para determinar si la solicitud de autocompletar se generó mediante el modo de compatibilidad.

Guarda el nombre de usuario y la contraseña de manera simultánea

Puedes usar la marca SaveInfo.FLAG_DELAY_SAVE para admitir casos en los que una app usa varias actividades a fin de mostrar campos de nombre de usuario y de contraseña, entre otros.

Interacción del usuario con la IU de guardar

Puedes mostrar y ocultar un campo de contraseña en un diálogo de guardado estableciendo un objeto de escucha en el diálogo y cambiando la visibilidad de la vista remota de contraseña correspondiente.

Compatibilidad con la actualización de conjuntos de datos

La función "Autocompletar" puede actualizar las contraseñas existentes. Por ejemplo, si un usuario ya almacenó una contraseña y guarda una nueva, Autocompletar le pedirá que actualice la contraseña existente en lugar de guardar una nueva.

Mejoras de clasificación de campos

En Android 10, se incluyen las siguientes mejoras a la API de clasificación de campos.

Constructor UserData.Builder

Se modificó el constructor UserData.Builder a fin de que se alinee mejor con el patrón Builder.

Permite que un valor se asigne a varios tipos de ID de categoría

Cuando usas UserData.Builder en Android 10, ahora puedes asignar un valor a varios tipos de ID de categoría. En las versiones anteriores, se mostraba una excepción si agregabas un valor más de una vez.

Compatibilidad mejorada con números de tarjetas de crédito

La clasificación de campos ahora puede detectar números de cuatro dígitos como los cuatro últimos dígitos del número de una tarjeta de crédito.

Compatibilidad con la clasificación de campos específicos de la app

Android 10 incluye FillResponse.setUserData(), que te permite configurar datos del usuario específicos de la app para la duración de la sesión, lo que ayuda al servicio de autocompletar a detectar tipos para los campos con contenido específico de la app.

Controles del sistema y de IU

En Android 10, se ofrecen las siguientes mejoras de interfaz del usuario:

Compatibilidad con limitaciones de JVMTI PopFrame

En Android 10, se agrega compatibilidad con la capacidad can_pop_frames en la implementación de Android JVMTI. Durante la depuración, esta función te permite volver a ejecutar funciones después de pausar debido a una interrupción y ajustar las configuraciones locales o globales, o bien la implementación de una función. Para obtener más información, consulta la página de referencia de Pop Frame de Oracle.

API de control de superficie

Android 10 proporciona una API de SurfaceControl para el acceso de bajo nivel al compositor del sistema (SurfaceFlinger). Para la mayoría de los usuarios, SurfaceView es la manera correcta de aprovechar el compositor. La API SurfaceControl puede resultar útil en determinados casos para, por ejemplo:

  • Sincronizar varias superficies
  • Incorporar superficies con un proceso cruzado
  • Administrar el tiempo de vida de bajo nivel

La API de SurfaceControl está disponible en vinculaciones de SDK y NDK. La implementación de NDK incluye una API para el intercambio manual de búferes con el compositor. Esta es una alternativa para los usuarios que se encontraron con las limitaciones de BufferQueue.

Detección del procesador de inactividad de WebView

Android 10 introduce la clase abstracta WebViewRenderProcessClient, que las apps pueden usar para detectar si un elemento WebView no responde. Para usarla, haz lo siguiente:

  1. Define tu propia subclase y, luego, implementa sus métodos onRenderProcessResponsive() y onRenderProcessUnresponsive().
  2. Adjunta una instancia de tu WebViewRenderProcessClient a uno o varios objetos WebView.
  3. Si WebView deja de responder, el sistema llama al método onRenderProcessUnresponsive() del cliente y agrega los objetos WebView y WebViewRenderProcess. (Si el objeto WebView es un solo proceso, el parámetro WebViewRenderProcess es nulo). Tu app puede llevar a cabo una acción apropiada, como mostrarle al usuario un cuadro de diálogo donde se le pregunte si quiere detener el procesamiento.

Si WebView sigue sin responder, el sistema llama a onRenderProcessUnresponsive() periódicamente (no más de una vez cada cinco segundos), pero no toma ninguna otra medida. Si el WebView vuelve a responder, el sistema solo llama a onRenderProcessResponsive() una vez.

Paneles de configuración

En Android 10, se introducen los Paneles de configuración, una API que permite que a los usuarios visualizar las opciones de configuración en el contexto de su app. Esto evita que los usuarios tengan que ir a Configuración para cambiar parámetros como NFC o Datos móviles a fin de usar la app.

Figura 1: El usuario intenta abrir una página web mientras el dispositivo no está conectado a la red. Se abre el panel de configuración emergente Conectividad de Internet en Chrome.

Figura 2: El usuario puede activar el Wi-Fi y seleccionar una red sin salir de la app de Chrome.

Por ejemplo, imagina que un usuario abre un navegador web mientras el dispositivo está en modo de avión. Antes de Android 10, la app solo podía mostrar un mensaje genérico que le pedía al usuario que abra la Configuración para restaurar la conectividad. Con Android 10, la app de navegador puede mostrar un panel intercalado en el que se visualizan ajustes clave de la configuración de conectividad, como el modo de avión, la red Wi-Fi (incluidas las redes cercanas) y los datos móviles. Mediante este panel, los usuarios pueden restablecer la conectividad sin salir de la app.

Para mostrar un panel de configuración, activa un intent con una de las nuevas acciones de Settings.Panel que se muestran a continuación:

Kotlin

    val panelIntent = Intent(Settings.Panel.settings_panel_type)
    startActivityForResult(panelIntent)
    

Java

    Intent panelIntent = new Intent(Settings.Panel.settings_panel_type);
    startActivityForResult(panelIntent);
    

settings_panel_type puede ser una de las siguientes opciones:

ACTION_INTERNET_CONNECTIVITY
Muestra la configuración relacionada con la conexión a Internet, como el modo de avión, el Wi-Fi y los datos móviles.
ACTION_WIFI
Muestra la configuración de Wi-Fi, pero no las otras opciones de configuración de conectividad. Esta opción es útil para las apps que necesitan una conexión Wi-Fi para realizar cargas o descargas de gran tamaño.
ACTION_NFC
Muestra todas las opciones de configuración relacionadas con la comunicación de campo cercano (NFC).
ACTION_VOLUME
Muestra la configuración de volumen de todas las transmisiones de audio.

Tenemos planificado agregar un wrapper de AndroidX para esta funcionalidad. El wrapper abrirá la página más apropiada en la app de Configuración cuando se lo llame en dispositivos que ejecutan Android 9 (con nivel de API 28).

Mejoras de uso compartido

En Android 10, se ofrecen varias mejoras para el uso compartido:

API de accesos directos de uso compartido

La API de accesos directos de uso compartido reemplaza a las API de uso compartido directo.

En lugar de obtener resultados de manera reactiva on demand, la API de accesos directos de uso compartido les permite a las apps publicar objetivos de uso compartido directos con anticipación. Así funciona el elemento ShortcutManager. Como las dos API son similares, expandimos la API de ShortcutInfo para facilitar el uso de ambas funciones. Con la API de accesos directos de uso compartido, puedes asignar categorías o usuarios directamente a un objetivo de uso compartido. Los objetivos de uso compartido permanecerán en el sistema hasta que la misma app los actualice, o bien esta se desinstale.

El antiguo mecanismo de uso compartido directo aún funciona, pero las apps que lo usan tienen menor prioridad que las que usan la API de accesos directos de uso compartido.

ShortcutInfo.Builder agrega y mejora los métodos a fin de proporcionar información adicional sobre el objetivo de uso compartido.

Objetivos de uso compartido directo

Puedes publicar un acceso directo dinámico como un objetivo de uso compartido directo. Para ello, consulta Cómo publicar objetivos de uso compartido directo.

ShortcutManagerCompat es una nueva API de AndroidX que brinda retrocompatibilidad con la antigua API de DirectShare. Este es el método preferido de publicación de objetivos de uso compartido.

Cómo obtener una vista previa del texto

Cuando una app comparte contenido de texto, puede mostrar una vista previa opcional en la IU de ShareSheet.

Consulta Cómo agregar vistas previas de texto enriquecido

Más información

Para obtener más información sobre cómo las apps comparten datos, consulta Cómo enviar datos simples a otras apps y Cómo recibir datos simples de otras apps.

Tema oscuro

En Android 10, se ofrece un tema oscuro que se aplica tanto a la IU del sistema Android como a las apps que se ejecutan en el dispositivo. Para obtener la información completa, consulta Tema oscuro.

Tipos de servicios en primer plano

Android 10 introduce el atributo de manifiesto XML foregroundServiceType, que debes incluir en la definición de varios servicios específicos. Es posible asignar varios tipos de servicios en primer plano a un servicio en particular, aunque no suele ser apropiado.

En la siguiente tabla, se muestran los diferentes tipos de servicios en primer plano y los servicios en los que es apropiado declarar un tipo específico:

Tipo de servicio en primer plano Ejemplo de caso práctico para un servicio que debería declarar este tipo
connectedDevice Supervisar un wearable que registra la actividad física
dataSync Descargar archivos desde una red
location Continuar una acción que inició el usuario
mediaPlayback Reproducir un audiolibro, un podcast o música
mediaProjection Grabar un video de la pantalla del dispositivo durante un período breve
phoneCall Encargarse de una llamada telefónica en curso

Kotlin

En Android 10, se incluyen las siguientes actualizaciones para el desarrollo en Kotlin.

Anotaciones de nulidad para API de libcore

En Android 10, se mejora la cobertura de las anotaciones de nulidad en el SDK para las API de libcore. Estas anotaciones permiten que los desarrolladores de apps que usan el análisis de nulidad de Kotlin o Java en Android Studio obtengan información sobre la nulidad cuando interactúan con estas API.

Normalmente, las infracciones del contrato de nulidad en Kotlin dan como resultado errores de compilación. Para garantizar la compatibilidad con tu código existente, solo se agregan las anotaciones @RecentlyNullable y @RecentlyNonNull, lo que quiere decir que las infracciones de nulidad generan advertencias en lugar de errores.

Además, cualquier anotación de @RecentlyNullable o @RecentlyNonNull que se haya agregado en Android 9 cambiará por @Nullable y @NonNull, respectivamente, lo que significa que en Android 10 y versiones posteriores las infracciones de nulidad generan errores en lugar de advertencias.

Para obtener más información sobre los cambios de nulidad, consulta El SDK de Android Pie ahora está optimizado para Kotlin en el blog de desarrolladores de Android.

NDK

En Android 10, se incluyen los siguientes cambios en el NDK.

Depuración mejorada de la propiedad del descriptor de archivo

En Android 10, se agrega "fdsan", que te ayuda a encontrar y corregir los problemas de propiedad del descriptor de archivo con mayor facilidad.

Los errores relacionados con el mal manejo de la propiedad del descriptor de archivo, que suelen manifestarse como usar después de cerrar y cierre doble, son análogos a los errores de usar después de liberar y liberación doble de la asignación de la memoria, aunque suelen ser mucho más difíciles de diagnosticar y corregir. fdsan aplica la propiedad del descriptor de archivo para intentar detectar o prevenir su administración incorrecta.

Para obtener más información sobre las fallas relacionadas con estos problemas, consulta Error detectado por fdsan. Para obtener más información sobre fdsan, consulta la página sobre fdsan en Googlesource.

TLS de ELF

Las apps que se compilan mediante un NDK con el nivel de API mínimo de 29 pueden usar TLS de ELF en lugar de emutls. Se agregó compatibilidad con el vinculador estático y dinámico a fin de admitir este método para administrar las variables de subprocesos locales.

En el caso de las apps creadas para un nivel de API de 28 y niveles inferiores, se implementaron mejoras para que libgcc/compiler-rt funcione como solución alternativa a problemas de emutls.

Para obtener más información, consulta cambios de Android para desarrolladores de NDK.

Tiempo de ejecución

En Android 10, se incluye el siguiente cambio en el tiempo de ejecución.

Activación de recolección de elementos no utilizados basada en mallinfo

Cuando los objetos Java de plataforma pequeña hacen referencia a objetos de gran tamaño en C++, a menudo los objetos C++ solo se pueden reclamar cuando el objeto Java se recolecta y, por ejemplo, finaliza. En las versiones anteriores, la plataforma calculaba los tamaños de muchos objetos C++ asociados a los objetos Java. Este cálculo no siempre era preciso y ocasionalmente generaba un uso exagerado de la memoria, ya que la plataforma no recolectaba elementos no utilizados cuando debería haberlo hecho.

En Android 10, el recolector de elementos no utilizados (GC) controla el tamaño total del montón asignado por el sistema malloc() y garantiza que las asignaciones malloc()de mayor tamaño siempre se incluyan en los cálculos de activación del GC. En consecuencia, las apps que intercalan grandes cantidades de asignaciones C++ con la ejecución de Java podrían ver un aumento en la recolección de elementos no utilizados. Otras apps podrían notar una disminución leve.

Pruebas y depuración

En Android 10, se incluyen las siguientes mejoras para la prueba y la depuración:

Mejoras del registro del sistema en el dispositivo

A partir de Android 10, puedes especificar límites para el tamaño y la duración del registro cuando haces un registro del sistema en el dispositivo. Cuando especificas uno de los valores, el sistema realiza un registro largo y copia el búfer de registro en el archivo de destino de manera periódica a medida que este se graba. El registro se completa cuando se alcanzan los límites de duración o tamaño que especificaste.

Usa estos parámetros adicionales para probar casos prácticos diferentes de los que probarías con un registro estándar. Por ejemplo, podrías diagnosticar un error de rendimiento que solo ocurre después de que tu app estuvo en ejecución por un período prolongado. En este caso, podrías grabar un registro largo durante todo un día y, luego, analizar el programador de CPU, la actividad del disco, los subprocesos de la app y otros datos en el informe que podrían ayudarte a determinar la causa del error.

En Android 10 y versiones posteriores, los archivos de registro se guardan en un formato que puede abrirse con Perfetto, un proyecto de código abierto para la instrumentación y el registro del rendimiento. Puedes convertir archivos de registro de Perfetto al formato Systrace.

Mejoras de TextClassifier

En Android 10, se proporciona una funcionalidad adicional de clasificación de textos en la interfaz de TextClassifier.

Detección de idioma

El método detectLanguage() funciona de manera similar a los métodos de clasificación que existían anteriormente. Este recibe un objeto TextLanguage.Request y muestra un objeto TextLanguage.

El objeto TextLanguage consiste en una lista de pares ordenados. Cada par contiene una configuración regional y una puntuación de confianza para la clasificación.

Acciones de conversación sugeridas

El método suggestConversationActions() funciona de manera similar a los métodos de clasificación que existían anteriormente. Este recibe un objeto ConversationActions.Request y muestra un objeto ConversationActions.

Los objetos ConversationActions son una lista de objetos ConversationAction. En cada objeto ConversationAction, se incluye una acción potencial sugerida y su puntuación de confianza.

Respuestas inteligentes/acciones en notificaciones

En Android 9, se introdujo la opción de mostrar respuestas sugeridas dentro de una notificación. Android 10 se expande con la capacidad de incluir acciones sugeridas basadas en intents. Además, la plataforma puede generar estas sugerencias automáticamente. Las apps pueden seguir brindando sugerencias propias, o bien inhabilitar las sugerencias generadas por el sistema.

La API que se usa para generar estas respuestas es parte de TextClassifier y está disponible para los desarrolladores en Android 10. Para obtener más información, consulta la sección sobre las mejoras de TextClassifier.

Si tu app brinda sus propias sugerencias, la plataforma no genera sugerencias automáticas. Si no quieres que las notificaciones de tu app muestren respuestas o acciones sugeridas por el sistema, puedes inhabilitarlas con setAllowGeneratedReplies() y setAllowSystemGeneratedContextualActions().