Android 8.1 (nivel de API 27) presenta una variedad de funciones 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. Entre las funciones de configuración de Android Oreo (edición Go), se incluyen las siguientes:
- 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. Las nuevas constantes de funciones de hardware te permiten orientar la distribución de tus 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 la compilación para miles de millones de lineamientos con asistencia adicional acerca de cómo optimizar tu app para dispositivos que ejecutan Android Oreo (edición Go). Para la mayoría de los desarrolladores, la mejor manera de prepararse para dispositivos con Android Oreo (edición Go) es optimizar tu APK existente o usar la función de varios APK de Google Play para orientar una versión de tu APK a dispositivos con poca RAM. Recuerda que hacer que tu app sea más liviana y más 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 marcos de trabajo de aprendizaje automático en dispositivos, como TensorFlow Lite, la biblioteca de AA multiplataforma de Google para dispositivos móviles, así como Caffe2 y otros. Para conocer los documentos y las descargas disponibles, visita el repositorio de código abierto de TensorFlow Lite. 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.
La clase BaseAdapter
ahora incluye el método setAutofillOptions()
, que te permite proporcionar representaciones de cadenas de los valores en un adaptador. Esto resulta útil para los controles de íconos giratorios 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 archivo 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, por lo general, no requieren que notifiques explícitamente el framework porque la clase View
ya llama al método.
Android 8.1 también les brinda a los servicios de Autocompletar más capacidad para personalizar la indicación visual de la IU de guardado agregando compatibilidad con CustomDescription
and
Validator
dentro de 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
clase.
Los objetos
Validator
se usan para evitar mostrar la IU guardada de autocompletar cuando la condición Validator no se cumple. Para obtener más información, consulta la clase 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 la superan no se ponen en cola y se pierden. Este cambio no afecta otros aspectos del comportamiento de las notificaciones, y los mensajes de notificación se siguen publicando según lo esperado.
-
NotificationListenerService
yConditionProviderService
no son compatibles con dispositivos con Android y poca RAM que muestrantrue
cuando se llama aActivityManager.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 una valiosa funcionalidad adicional. Por ejemplo, como Editable
también implementa la interfaz Spannable
, puedes aplicar el lenguaje de marcado al contenido dentro de 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, WebView
muestra un intersticial que advierte a los usuarios acerca de 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 manera programática cómo responde tu app ante una amenaza conocida:
- Puedes controlar si tu app informará amenazas conocidas a Navegación segura.
- 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 lograr una protección óptima contra amenazas conocidas, espera hasta inicializar la Navegación segura antes de invocar el método loadUrl()
de un 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:valu>e=&qu<ot;true">;< / /a>pplication /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. Por ejemplo, un fotograma de un video 4K sería un mapa de bits de 16 MB, mucho más grande de lo que necesitarías para una imagen en miniatura.
API de memoria compartida
Android 8.1 (nivel de API 27) presenta una nueva API de SharedMemory
. Esta clase te permite crear, asignar y administrar una instancia anónima de SharedMemory
. 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 información de color 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.
Para crear un objeto WallpaperColors
, realiza una de las siguientes acciones:
- Para crear un
WallpaperColors
, sigue estos pasos: usando tres colores, crea una instancia deWallpaperColors
clase pasando el color primario, el secundario y el terciario. El color primario no debe ser nulo. - Sigue estos pasos para crear un
WallpaperColors
: objeto de un mapa de bits, llama alfromBitmap()
pasando el origen del mapa de bits como parámetro. - Para crear un objeto
WallpaperColors
a partir de un elemento de diseño, llama al métodofromDrawable()
y pasa la fuente de diseño como parámetro.
Para recuperar los detalles de 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()
muestra 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, llama al método notifyColorsChanged()
. Este método activa un evento de ciclo de vida de onComputeColors()
en el que tienes la oportunidad de proporcionar un nuevo objeto WallpaperColors
.
Para agregar un objeto de escucha de cambios de color, puedes llamar al método addOnColorsChangedListener()
. También puedes llamar al método getWallpaperColors()
para recuperar los colores primarios de un fondo de pantalla.
Actualizaciones de huellas digitales
La clase FingerprintManager
incorporó los siguientes códigos de error:
-
FINGERPRINT_ERROR_LOCKOUT_PERMANENT
: El usuario intentó desbloquear su dispositivo demasiadas veces con el lector de huellas digitales. -
FINGERPRINT_ERROR_VENDOR
: Se produjo un error específico del proveedor en el lector de huellas digitales.
Actualizaciones de criptografía
En Android 8.1, se realizaron los siguientes cambios de criptografía:
- Se implementaron nuevos algoritmos en Conscrypt. La implementación de Conscrypt se usa preferentemente sobre la implementación existente de Bouncy Castle. 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 su lugar, usagetParameterSpec(GCMParameterSpec.class)
.- Se refactorizaron muchas clases internas de Conscrypt asociadas con TLS. Dado que los desarrolladores a veces acceden a estas de manera reflexiva, se dejaron correcciones para admitir el uso anterior, pero cambiaron algunos detalles. Por ejemplo, los sockets
que antes eran de tipo
OpenSSLSocketImpl
, pero ahora son de tipoConscryptFileDescriptorSocket
oConscryptEngineSocket
, que se extiendenOpenSSLSocketImpl
- Los métodos
SSLSession
solían arrojarIllegalArgumentException
cuando se pasaba una referencia nula, ahora arrojanNullPointerException
. - El
KeyFactory
de RSA ya no permite generar claves a partir de arrays de bytes que son más grandes que la clave codificada. Las llamadas ageneratePrivate()
ygeneratePublic()
que proporcionan unKeySpec
en el que la estructura de claves no completa todo el búfer generarán unInvalidKeySpecException
. - Cuando una lectura de socket se interrumpía al cerrar el socket, Conscrypt solía mostrar -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.