Características y API de Android 8.1

Android 8.1 (nivel de API 27) introduce una variedad de y capacidades nuevas para usuarios y desarrolladores. En este documento, se destacan las novedades para desarrolladores.

Android Oreo (edición Go)

Android Go es nuestra iniciativa para optimizar la experiencia de Android para de miles de millones de personas se conectan en todo el mundo. A partir de Android 8.1, estamos haciendo de Android una gran plataforma para dispositivos básicos. Funciones de Android Oreo La configuración (edición Go) incluye lo siguiente:

  • Optimizaciones de memoria: Uso mejorado de la memoria en toda la plataforma para garantizar que las apps puedan ejecutarse de manera eficiente en dispositivos con 1 GB o menos de RAM.
  • Opciones de orientación flexibles. Nuevo función de hardware constantes que te permiten orientar la distribución de las apps a dispositivos normales o con poca RAM mediante Google Play
  • Google Play.Si bien todas las apps estarán disponibles en dispositivos que ejecuten Android Oreo (edición Go), Google Play dará visibilidad a las apps optimizadas específicamente por los desarrolladores para brindar una gran experiencia a miles de millones de personas lineamientos.

Actualizamos el edificio para miles de millones de usuarios lineamientos con orientación adicional sobre cómo optimizar tu app para dispositivos que ejecutan Android Oreo (edición Go) Para la mayoría de los desarrolladores, optimizar los APK existentes Función de varios APK para orientar una versión de tu APK a dispositivos con poca RAM es la mejor forma de prepararte para los dispositivos que ejecutan Android Oreo (edición Go). Recuerda que hacer que tu aplicación más liviana y eficiente beneficia a todo tu público, independientemente del dispositivo.

API de Neural Networks

La API de Neural Networks proporciona inferencias y cálculos acelerados para máquinas integradas en el dispositivo de aprendizaje automático como TensorFlow Lite, la biblioteca de AA multiplataforma de Google para dispositivos móviles, así como Caffe2 y otros. Visita TensorFlow Lite código abierto repo para descargas y documentos. TensorFlow Lite funciona con la API de Neural Networks para ejecutar modelos como los siguientes MobileNets, Inception v3, y Respuesta inteligente en tu dispositivo móvil

Actualizaciones de Autofill Framework

Android 8.1 (nivel de API 27) brinda varias mejoras a la función Autocompletar Framework que puedes incorporar a tus apps.

El BaseAdapter ahora incluye setAutofillOptions() que te permite proporcionar representaciones de cadena de los valores en una adaptador. Esto es útil para los íconos giratorios y controles que generan dinámicamente los valores en sus adaptadores. Por ejemplo: Puedes usar el método setAutofillOptions() para proporcionar una cadena una representación visual de la lista de años que los usuarios pueden elegir como parte de un la fecha de vencimiento de la tarjeta de crédito. Los servicios de autocompletado pueden usar la representación de cadena para completar adecuadamente las vistas que requieren los datos.

Además, el AutofillManager incluye el método notifyViewVisibilityChanged(View, int, boolean) que puedes llamar para notificar al framework sobre los cambios en la visibilidad de un en una estructura virtual. También hay una sobrecarga del método para con estructuras virtuales integradas. Sin embargo, las estructuras no virtuales generalmente no requieren que notificar de manera explícita al framework porque el método ya es llamado View .

Android 8.1 también brinda a los servicios de autocompletado más capacidad para personalizar la IU de guardado proporciona asistencia agregando compatibilidad con CustomDescription and Validator en SaveInfo.

Las descripciones personalizadas son útiles para ayudar al servicio de autocompletado a aclarar lo que se están guardando; por ejemplo, cuando la pantalla contiene una tarjeta de crédito, podría mostrar un logotipo del banco de la tarjeta de crédito, los últimos cuatro dígitos de la tarjeta de crédito y su número de vencimiento. Para obtener más información, consulta el CustomDescription .

Validator Los objetos se usan para evitar mostrar la IU de guardado de Autocompletar cuando el validador no se cumple. Para obtener más información, consulta la Validator junto con sus subclases, LuhnChecksumValidator y RegexValidator.

Notificaciones

Android 8.1 incluye los siguientes cambios en las notificaciones:

  • Las apps ahora solo pueden hacer que suene una alerta de notificación una vez por segundo. Sonidos de alerta que superan esta cantidad no se ponen en cola y se pierden. Este cambio no afecta otros aspectos de las notificaciones. comportamiento y los mensajes de notificación se siguen publicando como se espera.
  • NotificationListenerService y ConditionProviderService no son compatibles con memoria RAM baja. Dispositivos con Android que muestran true cuando Se llama a ActivityManager.isLowRamDevice().

Actualización de EditText

A partir del nivel de API 27, el método EditText.getText() muestra un Editable. anteriormente mostró un CharSequence. Este cambio es retrocompatible, ya que Editable implementa CharSequence

La interfaz Editable proporciona datos adicionales valiosos funcionalidad. Por ejemplo, dado que Editable también implementa la interfaz Spannable, puedes aplicar lenguaje de marcado a contenido en una instancia de EditText.

Acciones programáticas de Navegación segura

Al utilizar el WebView implementación de la API de Safe Browsing, tu app puede detectar cuando una instancia de WebView intenta navegar a una URL que Google clasificó como amenaza conocida. De forma predeterminada, el WebView muestra un anuncio intersticial que advierte a los usuarios sobre la amenaza conocida. Esta pantalla da a los usuarios la opción de cargar la URL de todas maneras o regresar a una página anterior que sea segura.

En Android 8.1, puedes definir de forma programática cómo tu respuesta a una amenaza conocida:

  • Puedes controlar si tu app informa amenazas conocidas a Safe Navegación.
  • Puedes hacer que tu app realice automáticamente una acción determinada, como se volverá a un sitio seguro cada vez que encuentre una URL que clasifica como una amenaza conocida.

Nota: Para obtener una protección óptima contra amenazas conocidas, espera hasta haber inicializado la Navegación segura antes de invocar un El método loadUrl() del objeto WebView

Los siguientes fragmentos de código muestran cómo puedes indicar a las instancias de tu app de WebView para volver siempre a un sitio seguro después de encontrar un amenaza conocida:

AndroidManifest.xml

<manifest>
    <application>
        ...
        <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
                   android:value="true" />
    </application>
</manifest>

MyWebActivity.java

Kotlin

private var superSafeWebView: WebView? = null
private var safeBrowsingIsInitialized: Boolean = false

// ...

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    superSafeWebView = WebView(this).apply {
        webViewClient = MyWebViewClient()
        safeBrowsingIsInitialized = false
        startSafeBrowsing(this@SafeBrowsingActivity, { success ->
            safeBrowsingIsInitialized = true
            if (!success) {
                Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!")
            }
        })
    }
}

Java

private WebView superSafeWebView;
private boolean safeBrowsingIsInitialized;

// ...

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    superSafeWebView = new WebView(this);
    superSafeWebView.setWebViewClient(new MyWebViewClient());
    safeBrowsingIsInitialized = false;

    superSafeWebView.startSafeBrowsing(this, new ValueCallback<Boolean>() {
        @Override
        public void onReceiveValue(Boolean success) {
            safeBrowsingIsInitialized = true;
            if (!success) {
                Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!");
            }
        }
    });
}

MyWebViewClient.java

Kotlin

class MyWebViewClient : WebViewClient() {
    // Automatically go "back to safety" when attempting to load a website that
    // Safe Browsing has identified as a known threat. An instance of WebView
    // calls this method only after Safe Browsing is initialized, so there's no
    // conditional logic needed here.
    override fun onSafeBrowsingHit(
            view: WebView,
            request: WebResourceRequest,
            threatType: Int,
            callback: SafeBrowsingResponse
    ) {
        // The "true" argument indicates that your app reports incidents like
        // this one to Safe Browsing.
        callback.backToSafety(true)
        Toast.makeText(view.context, "Unsafe web page blocked.", Toast.LENGTH_LONG).show()
    }
}

Java

public class MyWebViewClient extends WebViewClient {
    // Automatically go "back to safety" when attempting to load a website that
    // Safe Browsing has identified as a known threat. An instance of WebView
    // calls this method only after Safe Browsing is initialized, so there's no
    // conditional logic needed here.
    @Override
    public void onSafeBrowsingHit(WebView view, WebResourceRequest request,
            int threatType, SafeBrowsingResponse callback) {
        // The "true" argument indicates that your app reports incidents like
        // this one to Safe Browsing.
        callback.backToSafety(true);
        Toast.makeText(view.getContext(), "Unsafe web page blocked.",
                Toast.LENGTH_LONG).show();
    }
}

Extractor de miniaturas de video

La clase MediaMetadataRetriever tiene un método nuevo, getScaledFrameAtTime(), que encuentra un fotograma cerca de una posición de tiempo dada y devuelve un mapa de bits con el mismo aspecto relación como el marco de origen, pero ajustado para adaptarse a un rectángulo de cierto ancho y altura. Esto es útil para generar imágenes en miniatura de un video.

Te recomendamos usar este método en lugar de getFrameAtTime(), que puede desperdiciar memoria. ya que muestra un mapa de bits con la misma resolución que el video de origen. Para Por ejemplo, un fotograma de un video en 4K sería un mapa de bits de 16 MB, mucho más grande que el tuyo. necesitarías para una imagen en miniatura.

API de memoria compartida

Android 8.1 (nivel de API 27) presenta un nuevo SharedMemory en la API de Cloud. Esta clase te permite crear, asignar y administrar un grupo SharedMemory instancia. Configuras la protección de la memoria en un SharedMemory objeto de lectura o escritura, y, ya que el SharedMemory es parcelable, puedes pasarlo fácilmente a otro proceso a través del AIDL.

La SharedMemory La API interopera con el Instalación ASharedMemory en el NDK. ASharedMemory otorga acceso a un descriptor de archivo, que luego se puede asignar para lectura y escritura. Este es un para compartir grandes cantidades de datos entre apps o entre múltiples procesos dentro de una sola app.

API WallpaperColors

Android 8.1 (nivel de API 27) permite que tu fondo animado proporcione color información a la IU del sistema. Para ello, crea un WallpaperColors a partir de un mapa de bits, un elemento de diseño o el uso de tres colores seleccionados manualmente. También puedes recuperar esta información de color.

Sigue estos pasos para crear un WallpaperColors: , realiza una de las siguientes acciones:

  • Sigue estos pasos para crear un WallpaperColors: usando tres colores, crea una instancia de WallpaperColors clase pasando el color primario, el secundario y el terciario. El principal el color no debe ser nulo.
  • Sigue estos pasos para crear un WallpaperColors: objeto de un mapa de bits, llama al fromBitmap() pasando el origen del mapa de bits como parámetro.
  • Sigue estos pasos para crear un WallpaperColors: a partir de un elemento de diseño, llama a fromDrawable() pasando la fuente del elemento de diseño como parámetro.

Para recuperar los detalles del color primario, secundario o terciario de la fondo de pantalla, llama a los siguientes métodos:

  • getPrimaryColor() devuelve el color más representativo visualmente del fondo de pantalla.
  • getSecondaryColor() devuelve el segundo color más preeminente del fondo de pantalla.
  • getTertiaryColor() El método muestra el tercer color más preeminente del fondo de pantalla.

Para notificar al sistema sobre cualquier cambio significativo de color en tu fondo animado, haz lo siguiente: llamar a notifyColorsChanged() . Este método activa un ciclo de vida de onComputeColors(). evento en el que tienes la oportunidad de proporcionar un nuevo WallpaperColors .

Para agregar un objeto de escucha de cambios de color, puedes llamar al método addOnColorsChangedListener(). Puedes También llama al método getWallpaperColors(). para recuperar los colores primarios de un fondo de pantalla.

Actualizaciones de huellas digitales

La clase FingerprintManager tiene introdujo los siguientes códigos de error:

  • FINGERPRINT_ERROR_LOCKOUT_PERMANENT: el usuario intentó muchas veces para desbloquear el dispositivo con el lector de huellas digitales.
  • FINGERPRINT_ERROR_VENDOR: Es una huella digital específica del proveedor. se produjo un error de lector.

Actualizaciones de criptografía

En Android 8.1, se realizaron los siguientes cambios de criptografía:

  • Se implementaron nuevos algoritmos en Conscrypt. La Conscrypt la implementación se usa preferentemente en lugar de la actual Bouncy Castle para implementarlos. Entre los nuevos algoritmos, se incluyen los siguientes:
    • AlgorithmParameters:GCM
    • KeyGenerator:AES
    • KeyGenerator:DESEDE
    • KeyGenerator:HMACMD5
    • KeyGenerator:HMACSHA1
    • KeyGenerator:HMACSHA224
    • KeyGenerator:HMACSHA256
    • KeyGenerator:HMACSHA384
    • KeyGenerator:HMACSHA512
    • SecretKeyFactory:DESEDE
    • Signature:NONEWITHECDSA
  • Cipher.getParameters().getParameterSpec(IvParameterSpec.class) no aceptaron. ya funciona para los algoritmos que usan GCM. En cambio, usa getParameterSpec(GCMParameterSpec.class)
  • Se refactorizaron muchas clases internas de Conscrypt asociadas con TLS. Desde desarrolladores acceden a estos de manera reflexiva, se han dejado correcciones de compatibilidad para admiten el uso anterior, pero algunos detalles cambiaron. Por ejemplo, los sockets que antes eran de tipo OpenSSLSocketImpl, pero ahora son de tipo ConscryptFileDescriptorSocket o ConscryptEngineSocket, que se extienden OpenSSLSocketImpl
  • Se usaron métodos SSLSession para arrojar IllegalArgumentException cuando se pasa una referencia nula, ahora Arroja NullPointerException.
  • El KeyFactory de RSA ya no permite generar claves a partir de arrays de bytes que son más grandes que la clave codificada. Llamadas a generatePrivate() y generatePublic() que proporcionan un KeySpec, en la que la estructura de la clave no completa la todo el búfer resultará en una InvalidKeySpecException.
  • Cuando la lectura del socket se interrumpe cuando el socket se cierra, Conscrypt usa para devolver -1 de la lectura. La operación de lectura ahora arroja SocketException
  • Se modificó el conjunto de certificados de la AC raíz; principalmente, se quitaron la cantidad de certificados obsoletos, sino también la eliminación de los certificados raíz para WoSign y StartCom. Para obtener más información sobre esta decisión, consulta el Entrada de blog de seguridad, Final eliminación de la confianza en los Certificados WoSign y StartCom.