Realizar la migración a Android 8.0

Android 8.0 (nivel de API 26) presenta cambios en el comportamiento, y también funciones y APIs nuevas que puedes aprovechar en tus apps. En este documento, se ofrece una descripción general de los pasos para migrar tus apps a Android 8.0 en dos etapas clave:

  1. Garantizar la compatibilidad con Android 8.0

    Verifica que tu app funcione en su totalidad en la versión nueva de la plataforma. En esta etapa, no usarás APIs nuevas ni cambiarás la targetSdkVersion de tu app, pero es posible que se necesiten cambios menores.

  2. Actualiza tu versión de destino y usa las funciones de Android 8.0

    Cuando estés listo para aprovechar las nuevas funciones de la plataforma, actualiza tu targetSdkVersion a la versión 26, verifica que la app siga funcionando como se espera y, luego, comienza a usar APIs nuevas.

Cómo garantizar la compatibilidad con Android 8.0

El objetivo en este caso es asegurarte de que tu app existente funcione tal como está en Android 8.0 (nivel de API 26). Debido a que algunos cambios en la plataforma pueden afectar el comportamiento de tu app, tal vez sean necesarios algunos ajustes. Sin embargo, no hace falta usar APIs nuevas ni cambiar tu targetSdkVersion.

Cómo garantizar la compatibilidad con Android 8.0 paso a paso

Prepara un dispositivo con Android 8.0

  • Si tienes un dispositivo compatible (Pixel, Pixel XL, Pixel C, Nexus 5X, Nexus 6P o Nexus Player), sigue las instrucciones para actualizar tu dispositivo.
  • También puedes descargar la imagen del sistema Android 8.0 para Android Emulator. Aparece en SDK Manager, en Android 8.0, como Google APIs Intel x86 Atom System Image.

    Nota: La imagen del sistema de Android 8.0 está disponible para descargar desde Android Studio 3.0 y versiones posteriores. Para obtener más información, consulta la siguiente sección para obtener el SDK de Android 8.0.

Cómo realizar pruebas de compatibilidad

En general, probar la compatibilidad con Android 8.0 (nivel de API 26) implica el mismo tipo de pruebas que realizas cuando te preparas para lanzar tu app. Es un buen momento para revisar los Lineamientos de calidad de la app principal y las Prácticas recomendadas para pruebas.

Sin embargo, hay otro aspecto relacionado con las pruebas. Android 8.0 presenta cambios en la plataforma de Android que pueden afectar el comportamiento de tu app o dañarla por completo, incluso cuando no modifiques tu targetSdkVersion. Por ello, es importante que revises los cambios clave en la tabla 1 y pruebes cualquier corrección que implementes para contemplar estas modificaciones.

Tabla 1: Cambios clave que afectan a todas las apps que se ejecutan en dispositivos con Android 8.0.

Cambiar Resumen Más referencia
Actualizaciones menos frecuentes de ubicación en segundo plano Si tu app recibe actualizaciones de ubicación desde un servicio en segundo plano, estas serán menos frecuentes en Android 8.0 (nivel de API 26) en comparación con versiones anteriores de Android. Específicamente, un servicio en segundo plano no puede recibir actualizaciones de ubicación más que unas pocas veces por hora. Sin embargo, mientras tu app se encuentre en primer plano, el índice de actualizaciones de ubicación no se modifica. Límites de ubicación en segundo plano
Ya no es compatible un total de net.hostname La consulta de la propiedad del sistema net.hostname da como resultado el valor null. Ninguno
Nueva excepción de send(DatagramPacket) El método send(DatagramPacket) genera una SocketException si falla el método connect(InetAddress, int) ejecutado anteriormente. Cambios de comportamiento: Conectividad de red y HTTP(S)
NullPointerException correcto a partir de métodos AbstractCollection AbstractCollection.removeAll(null) y AbstractCollection.retainAll(null) ahora siempre arrojan una NullPointerException. Anteriormente, no se arrojaba NullPointerException cuando la colección estaba vacía. Este cambio hace que el comportamiento se adecue a la documentación. Cambios de comportamiento: manejo de recopilaciones
NullPointerException correcto a partir de Currency.getDisplayName(null) Llamar a Currency.getDisplayName(null) arroja una NullPointerException. Cambios de comportamiento: configuraciones regionales e internacionalización

Para obtener una lista más exhaustiva de los cambios de comportamiento en Android 8.0 (nivel de API 26), consulta también Cambios de comportamiento en Android 8.0.

Actualiza tu versión de destino y usa funciones de Android 8.0

En esta sección, se explica cómo habilitar la compatibilidad completa con Android 8.0 (nivel de API 26) actualizando tu targetSdkVersion al nivel 26 y agregando funciones nuevas disponibles en Android 8.0.

Además de ofrecerte nuevas APIs, Android 8.0 presenta algunos cambios de comportamiento cuando actualizas tu targetSdkVersion al nivel 26. Dado que algunos cambios de comportamiento pueden requerir cambios en el código para evitar que falle, primero debes comprender cómo se verá afectada tu app cuando cambies el targetSdkVersion y revises todos los cambios de comportamiento para apps orientadas a Android 8.0.

Nota: Los pasos descritos anteriormente para garantizar la compatibilidad con la plataforma son un requisito previo para orientar tu app a Android 8.0, por lo que debes asegurarte de completarlos primero.

Actualiza la versión de destino y usa las funciones de Android 8.0 paso a paso

Cómo obtener el SDK de Android 8.0

Puedes obtener los paquetes del SDK para compilar tu app con Android 8.0 (nivel de API 26) con la versión más reciente de Android Studio (se recomienda Android Studio 3.0 o versiones posteriores). Android Studio 3.0 y versiones posteriores incluyen herramientas que te ayudarán con las funciones de Android 8.0, como los íconos adaptables y las fuentes descargables. Si aún no necesitas esas funciones, puedes usar la versión estable de Android Studio 2.3.3 para compilar tu app con Android 8.0 y usar las APIs nuevas.

Para configurar cualquiera de las versiones de Android Studio, sigue estos pasos:

  1. Inicia Android Studio y abre SDK Manager haciendo clic en Tools > SDK Manager.
  2. En la pestaña SDK Platforms, marca Show Package Details. Debajo de Versión preliminar de Android 8.0, marca lo siguiente:
    • Plataforma del SDK de Android 26
    • Google APIs Intel x86 Atom System Image (solo se requiere para el emulador).
  3. Cambia a la pestaña SDK Tools y marca todos los elementos que tengan actualizaciones disponibles (haz clic en cada casilla de verificación en la que se muestre un guion ). Esto debe incluir las versiones más recientes de los siguientes elementos obligatorios:
    • Herramientas de compilación del SDK de Android 26.0.0
    • Herramientas de la plataforma del SDK de Android 26.0.0
    • Android Emulator 26.0.0
  4. Haz clic en OK para instalar todos los paquetes de SDK seleccionados.

Ya está todo listo para comenzar a compilar con Android 8.0.

Cómo actualizar la configuración de tu compilación

Actualiza compileSdkVersion, targetSdkVersion y la versión de la biblioteca de compatibilidad a las revisiones más recientes disponibles, por ejemplo:

android {
  compileSdkVersion 26

  defaultConfig {
    targetSdkVersion 26
  }
  ...
}

dependencies {
  compile 'com.android.support:appcompat-v7:26.0.0'
}

// REQUIRED: Google's new Maven repo is required for the latest
// support library that is compatible with Android 8.0
repositories {
    google()

    // If you're using a version of Gradle lower than 4.1, you must instead use:
    // maven {
    //     url 'https://maven.google.com'
    // }
}

Quitar receptores de transmisión de tu archivo de manifiesto

Debido a que Android 8.0 (API nivel 26) presenta nuevas limitaciones para los receptores de emisión, debes quitar cualquier receptor de emisión que esté registrado para intents de transmisión implícitos. Dejarlas en su lugar no interrumpe el tiempo de compilación ni el tiempo de ejecución, pero no tienen ningún efecto cuando esta se ejecuta en Android 8.0.

Las transmisiones a las que solo puede responder tu app, como los intents de transmisión explícitos y las transmisiones que se envían específicamente al nombre de paquete de tu app, siguen funcionando de la misma manera en Android 8.0.

Hay excepciones para esta restricción nueva. Para ver una lista de transmisiones implícitas que aún funcionen en apps orientadas a Android 8.0, consulta Excepciones de transmisiones implícitas.

Cómo probar tu app para Android 8.0

Una vez completados los preparativos anteriores, puedes compilar tu app y luego probarla para asegurarte de que funcione de manera apropiada al orientarla a Android 8.0 (nivel de API 26). Este es otro buen momento para revisar los Lineamientos de calidad de la app principal y las Prácticas recomendadas para pruebas.

Cuando compilas tu app con targetSdkVersion establecido en 26, hay cambios específicos de la plataforma que debes tener en cuenta. Algunos de estos cambios pueden afectar significativamente el comportamiento de tu app o incluso dañarla por completo, incluso si no implementas funciones nuevas en Android 8.0.

En la tabla 2 se proporciona una lista de estas modificaciones con vínculos para acceder a más información.

Tabla 2: Cambios clave que afectan a las apps cuando targetSdkVersion se establece en 26.

Cambiar Resumen Más referencia
Privacidad Android 8.0 (nivel de API 26) no es compatible con el uso de las propiedades del sistema net.dns1, net.dns2, net.dns3 o net.dns4. Cambios en el comportamiento: Privacidad
Implementación de segmentos que admiten escritura y ejecución En el caso de las bibliotecas nativas, Android 8.0 (nivel de API 26) impone la regla de que los datos no deben admitir ejecución y el código no debe admitir la escritura. Cambios en el comportamiento: bibliotecas nativas
Encabezado ELF y validación de la sección El vinculador dinámico comprueba más valores en el encabezado ELF y los encabezados de sección, y falla si no son válidos. Cambios en el comportamiento: bibliotecas nativas
Notificaciones Las apps orientadas a la versión Android 8.0 (nivel de API 26) del SDK deben implementar uno o más canales de notificaciones a fin de publicar notificaciones para los usuarios. Descripción general de la API: Notificaciones
El método List.sort() Es posible que las implementaciones de este método dejen de llamar a Collections.sort() o que tu app genere una excepción debido a un desbordamiento de pila. Cambios en el comportamiento: Manejo de colecciones
El método Collections.sort() En las implementaciones de List, Collections.sort() ahora genera una ConcurrentModificationException. Cambios de comportamiento: Manejo de colecciones

Para obtener una lista más extensa de los cambios de comportamiento en Android 8.0 (nivel de API 26), consulta Cambios de comportamiento en Android 8.0.

Para explorar las nuevas funciones y APIs disponibles con Android 8.0 (nivel de API 26), consulta Funciones y APIs de Android 8.0.