Hola, y bienvenidos a Qué Hay de Nuevo en Android,
o como a mí, la única persona, me gusta llamarlo,
el Android Keynote.
Soy Chet Haase del equipo de interfaz gráfica de Android.
Y yo soy Romaine Guy del equipo de gráficos.
Y yo soy Dan Sandler del sistema de interfaz gráfica.
No tenemos mucho tiempo, así que vamos al punto.
¿Están preparados para Qué Hay de Nuevo en Android?
Aquí nos quedamos la última vez, API 25.
Así que vamos a agarrar ese git SHA,
lo metemos en git diff y allá vamos.
Van a querer anotar esto.
De acuerdo.
Siguiente.
Sí, esa ha sido buena, OK.
Me encantan esas.
Oh, ¿recuerdas que casi hacemos un enum con eso?
Fue divertidísimo.
¿Lo tienes?
¿Crees que la gente vino para esto?
No sé por qué no hemos pensado esto antes.
Hemos estado dando esta charla,
hemos contado las novedades durante años.
Pueden ver que…
Olvidé mi blazer.
En realidad no, tenía un bonito blazer rojo
pero alguien lo tomó prestado para la keynote.
Tienen su…
Parece que me estés amenazando.
Pero este año fue un poco diferente, ¿verdad?
Tuvieron avances para programadores con mucha antelación,
así que ya han visto muchas de estas API.
Tuvimos el Google Keynote, donde les enseñamos
mucho material realmente interesante.
Tuvimos el keynote de desarrolladores, donde aprenden incluso
más cosas de desarrollo. ¿Qué hacemos aquí entonces?
¿Cuál es el objetivo de Qué Hay de Nuevo en Android?
Crisis existencial.
Entonces…
-¿Probaste este pulsador? -Lo hice, sí.
Piensen en esta charla como una cata de vinos
o una degustación de whisky
o una de esas máquinas de refrescos en las que puedes pulsar todos los botones.
Esta es una cuidadosa selección artesanal
de cosas que quizá pasaron por alto en el nuevo lanzamiento de Android,
cosas que van a necesitar pase lo que pase para ser parte de Android O,
y honestamente algunas cosas de las que nos gusta hablar en el escenario.
Dicho esto, esto es realmente lo que hay de nuevo en Android.
Específicamente, lo que pudieron perderse del preview de desarrolladores
o en la I/O Keynote o en las otras, y por qué debería importar.
Una última cosa que quiero asegurarme de alcanzar hoy es esto.
Todos están muy entusiasmados con esto.
Pero guardaremos esto para el final.
¡Oh!
Va a ser bueno.
Muy bien, vamos a empezar.
Romaine, habla de IU y gráficos.
Sí, empecemos.
La primera herramienta de la que queremos hablar
es una que vieron esta mañana en una de las presentaciones.
Chet, este pulsador no funciona.
No lo probaste.
Ah.
Sabes…
Perdiendo tiempo.
Me voy a quedar aquí atrás y voy a pasar las diapositivas por ti.
Muy bien. Siguiente diapositiva, por favor.
Por esto no querían darnos un pulsador.
Muy bien, una característica…
A mí me funciona.
Quédate ahí atrás.
No quiero verte.
La primera herramienta que vieron esta mañana en una de las keynotes,
Picture-in-Picture, ya no es solo para TV,
también es para teléfonos.
Aquí tenemos un ejemplo con una aplicación de un tercero.
Netflix funcionando en tu teléfono con Picture-in-Picture.
Dame ese pulsador.
Volvamos atrás. Ahí está.
Y es muy fácil de implementar en tu aplicación.
Solo tienen que modificar la declaración…
Y deja de reproducir la animación, por favor.
Solo tienen que decir supportsPictureInPicture=true
en O ya no hay que hacer resizeableActivity=true,
y también deberían probar los cambios de configuración.
Y cuando quieren introducir el modo Picture-in-Picture en el código,
sólo tienen que llamar una línea.
Tienen getActivity() y solo llaman a enterPictureInPictureMode().
Súper sencillo, y van a hacer súper feliz a su usuario.
Y ahora una característica muy querida para mí, es la gestión de color.
Vamos a añadir soporte para pantallas wide-gamut en O.
No va a estar en todos los dispositivos. Solo los dispositivos
que admitan la característica lo habilitarán para su aplicación.
Vamos a añadir soporte para archivos PNG de 16 bits,
para que puedan tener más matices y más saturación.
Admitimos perfiles ICC, perfiles de color
incrustados en bitmaps en JPEG, PNG y WebP.
Esto asegurará más exactitud del color
en diferentes pantallas.
También tenemos un montón de nuevas API,
pero hablaremos de eso a final de semana en otra charla.
Como una imagen vale más que mil palabras,
esto es la gestión de color y cómo funciona.
Espero que esté claro.
En realidad la gestión de color es algo
que probablemente ya han experimentado con su propia aplicación.
Los colores lucen diferentes en dispositivos diferentes.
Y tenemos soluciones para eso en Android O.
Así que si quieren saber más,
voy a dar una charla al respecto el viernes a las 11:30 en el escenario 2.
Se llama Entendiendo el color.
Luego también vamos a añadir soporte para múltiples pantallas.
Si su aplicación ya es…
Este pulsador es terrible.
Si su aplicación ya admite múltiples ventanas,
el modo multi-ventana, ya admite pantalla múltiple en O.
Cuando se conecta el teléfono o un dispositivo en red
a múltiples pantallas y tienen una aplicación compatible,
el usuario puede elegir enviar la aplicación
a una pantalla diferente.
Cuando esto ocurre, recibirán un cambio en la configuración de redimensionado.
También pueden controlar en qué pantalla aparece su actividad.
Pueden usar las Opciones de Actividad para eso.
Y realmente deberían probar su app si quieren que admita esta característica.
Para ayudarlos a probar, tenemos dos nuevas herramientas.
Pueden ejecutar adb shell dumpsys display,
esto listará todas las pantallas disponibles actualmente en el dispositivo.
Y si llaman a adb shell start ,
pueden especificar la pantalla donde quieren empezar la actividad.
Un modo muy fácil para probar esto.
Hay mucho más en estas API,
así que les animamos a ir, en horario de oficina, viernes y jueves,
en horario de oficina, a ventanas y actividades.
Siguiente, medios.
Tenemos muchas clases muy útiles en nuestro paquete de medios.
Tenemos el reproductor de medios, la grabadora, el extractor y el códec;
y añadimos una nueva API getMetrics() a cada una de esas clases.
Ayuda en la consulta de información sobre los medios con los que estás tratando.
Así que pueden consultar la resolución, el códec,
el bitrate, la duración, esa información.
Es súper fácil de usar.
Solo hay que llamar a getMetrics() en esos objetos.
Obtienen el PersistableBundle
y pueden buscar la documentación en developer.android.com
para saber qué tipos de consultas están disponibles.
También la reproducción está muy mejorada.
Ahora tienen el control sobre el búfer en la aplicación.
Pueden especificar una marca de agua alta y baja,
y la reproducción del video no comenzará
hasta alcanzar la marca de agua baja,
y el sistema hará todo lo posible para mantener
los datos de caché entre las marcas de agua baja y alta.
Y pueden especificar las marcas de agua
en duración o cantidad de datos, en tamaño.
También mejoramos la búsqueda.
Cuando buscan en un video, ahora pueden elegir el comportamiento,
si quieren buscar al fotograma más cercano,
el fotograma clave siguiente, el fotograma clave previo,
o el fotograma de sincronización más cercano.
Y, por último, hicimos la reproducción DRM con Widevine mucho más fácil de utilizar
en todas las aplicaciones.
Hasta ahora, para grabar, el mezclador de medios
solo permitía añadir una pista de video y/o una pista de audio.
Pero ahora pueden tener tantas pistas como quieran.
También pueden crear pistas personalizadas.
El tipo MIME debe empezar con application/ y es básicamente una banda secundaria
donde pueden codificar cualquier tipo de datos que quieran.
Un ejemplo canónico es codificar datos JavaScript
si quieren ser capaces de volver a reproducir un video 360 o algo así.
La clase WebView viene con nuevas API realmente útiles.
Hemos añadido la capacidad de guardar la navegación,
que tanto conocen y adoran de Chrome,
que detecta malware y sitios web inseguros.
Si añaden esta etiqueta dentro de , esta etiqueta ,
utilizará la misma API que Chrome utiliza
para la seguridad al navegar.
WebView utiliza ahora procesos múltiples.
Y, en particular, hay un proceso de renderizado.
También tenemos nuevas API para tratar con estos multiprocesos.
Así que si se bloquea el proceso de renderizado,
pueden usar el método de la API para detectar el bloqueo
y decidir que hacer con su aplicación.
Pueden bloquear la aplicación si quieren,
pueden reiniciar el objeto WebView,
o simplemente pueden registrar algo y mostrar un mensaje al usuario.
Es mucho más elegante que antes.
También pueden usar la API Renderer Importance
para decidir qué hacer cuando hay poca memoria.
Cuando el sistema está bajo de memoria,
va a intentar reclamar RAM de algún sitio.
Y pueden decirle al sistema si el Webview
es muy importante o no para la aplicación.
Si el WebView es crítico en su aplicación,
definitivamente deberían mirar esta API.
Sabes que es el botón derecho, ¿verdad?
Sí, eso lo sé.
Hay un par de características muy solicitadas para animadores
específicamente AnimatorSet.
Fueron engañosamente complicadas de implementar, así que nos llevó un tiempo.
Pero ahora en Android O, tenemos en AnimatorSet
la capacidad de tener búsquedas.
Si tienen un animator que es una colección de animator infantiles,
pueden buscar esos animator infantiles dentro del AnimatorSet.
Ahora también tenemos
el reverse().
Chet, ¿no intentaste implementar esas API hace un tiempo?
Quizás.
¿Y quién implementó las API al final?
Yo no.
Exacto.
Como decía, nueva capacidad en AnimatorSet, el reverse(),
ya no tienen que inicializar otro AnimatorSet
con toda sus funciones y un método capturador y todo eso.
Nosotros hacemos todo el tedioso trabajo por ustedes.
Llenado automático, porque es realmente tedioso
dar toda esa información correcta una y otra vez.
Ya lo vimos en el Keynote,
es la capacidad de…
Tienen un formulario que llenar,
hay un proveedor que puede darle esa información,
así que cuando recibes esos textos,
la API introduce automáticamente esa información por ti.
Y hay un par de cosas respecto a esto.
Primero, desde luego pueden implementar su propio servicio
y proveer esa capacidad, dependiendo del servicio
que estemos proporcionando;
o, lo típico, implementar un cliente de eso.
La API funciona con las vistas estándares,
si están usando TextView, o usando EditText,
sabemos cómo recibir esa información para interactuar con un servicio.
Así que no necesitan hacer nada para vistas estándar.
Si están usando vistas personalizadas,
o quieren proporcionar más información con las vistas estándar,
tenemos API que nos aportan pistas sobre los tipos de atributo,
así como API que nos dicen de sus vistas personalizadas
y sus interacciones.
También si tienen una jerarquía de vistas personalizadas,
digamos que tienen una vista con otras vistas dentro
pero lo único que sabemos es que hay una vista principal,
ahí tenemos unas API para que especifiquen
la jerarquía con la que quieren que interactuemos.
Habrá más sobre esto en la sesión del viernes por la mañana,
así que vayan si quieren aprender más sobre el llenado automático.
Ahora hablemos un poquito sobre texto.
Hay un montón de cosas respecto al texto.
Creo que podemos reescribirlo.
Uso esa fuente solamente porque le hace daño a Dan,
le hace daño físicamente. Es increíble.
Creo que lo quebraste.
En primer lugar, pueden usar XML para declarar la fuente
usando una especie de pirateo pulcro con Data Binding,
pero es un poco complicado de hacer.
¿Y por qué no deberíamos proveerles realmente esa capacidad?
Así que ahora lo hacemos.
Ahora pueden poner un archivo de fuente
directamente en este recurso de directorio de fuentes.
Buenísimo, ciertamente.
Así que pongan eso en el directorio, o pueden decirnos la familia de fuentes,
para que pueden aportar varias fuentes con información sobre el estilo,
y podrán usarlas directamente como harían con cualquier otro recurso.
Y desde el código solo dicen dame ese recurso, y ahí lo tienen.
Fuentes descargables.
Ahora tenemos la capacidad para que ustedes puedan declarar una fuente
que quieren usar y que luego descargaremos y almacenaremos
en el sistema si aún no está allí,
o si ya está en el sistema la tomaremos de la caché.
Pueden hacerlo desde el código o desde XML y usarlo como recurso,
como hicieron con las fuentes XML en la apasionante diapositiva anterior.
Y también tenemos un proveedor de fuentes
que proporcionaremos en una versión aún sin lanzar de Google Play Services.
Hay disponible una versión beta de esto en la conferencia esta semana,
no sé los detalles sobre esto,
pero hay una sesión donde pueden saber los detalles,
o deberían ir al sitio web de Play Services para saber más de esto.
Esto les da acceso a todas las fuentes de Google.
Así que si quieren usar una de las habituales,
como esa hermosa fuente que utilicé al inicio de esta sección,
quizás esa esté allí y pueden pedirlas directamente.
Y también pueden tener un TextView auto-dimensionable.
Típicamente, si redimensionan un TextView
Nunca se sabe cuál va a ser el acierto de la temporada ¿verdad?
Pues, texto.
El texto es lo mejor, especialmente con la fuente adecuada.
Así que lo que obtienen ahora es el comportamiento de la izquierda,
donde solamente estamos redimensionando la vista,
no hay cambio en la fuente.
Pero a la derecha, si quieren TextView auto-dimensionable
entonces redimensionaremos la fuente por ustedes.
Y pueden especificar las características e incrementos que quieren usar
o el tamaño específico al que quieren llegar durante el redimensionamiento.
Hay unas API para esto,
hay API tanto para XML como para código Java, así que imagínense.
Y para todas estas herramienta de texto, fuentes XML, fuentes descargables
y TextView auto-redimensionable, estarán hablando sobre todas ellas
en la charla de lo nuevo en la biblioteca de compatibilidad mañana por la mañana.
¿Por qué hablan de eso en una charla de la biblioteca de compatibilidad?
¿No son API de la plataforma O?
Sí, lo son.
Y también están en la biblioteca de compatibilidad.
Así que pueden usar estas capacidades también con lanzamientos previos.
Utilidades del AccessibilityService.
Si están programando con AccessibilityService, los felicito.
Tenemos nuevas capacidades de las que pueden sacar provecho.
Detección de lenguaje, la capacidad de poner un botón
en la barra de navegación junto a los otros botones
para que sea más fácil acceder a tus cosas.
Control de volumen separado para la accesibilidad,
para no estar combinando ese control con otros en el dispositivo,
y también la capacidad de definir gestos de identificación personalizados.
Si quieren saber cualquier cosa más sobre esto, hay una sesión
sobre accesibilidad esta tarde en la que deberían fijarse.
Y finalmente, uno de mis minúsculos cambios favoritos
Voy a decir minúsculo porque es una línea de código para la API,
pero los CLs que fueron necesarios para arreglar todo ese código
que dependía de la implementación anterior fueron gigantescos.
Así que no quiero restarle valor al trabajo realizado,
pero en lo que se refiere a la API, es minúsculo, algo escondido,
parece lo mismo desde afuera.
El modo en que se solía declarar findViewById()
era algo como esto public View findViewById(),
luego lo invocan, pasan la ID del recurso
y reciben una vista, e inmediatamente le hacen una conversión de tipo.
Con TextView, tienen que quieres un TextView a la izquierda y a la derecha,
y están los paréntesis, un gran fastidio.
La gente utiliza bibliotecas de terceros solo porque esto es horrible.
Así que ahora
tenemos esto.
Llamo a esta característica Castaway.
Creo que soy el único que lo hace.
Muy bien, nos saltamos mi primera diapositiva.
No pasa nada.
Quiero hablar un poco sobre cosas del sistema de IU que van a ver.
Si tienen una app, necesitan conocer los iconos adaptables.
Creo que esto apenas se mencionó en una de las diapositivas de Steph hoy mismo.
En esencia, estamos intentando ahorrarles tiempo y dinero.
Hay tantos launchers, y cada uno de ellos
tiene una recomendación diferente para la forma de tu icono.
Los iconos adaptables son una nueva pieza de tecnología
que les hemos traído en O y les permite decir
aquí está mi fondo, aquí está mi primer plano,
corta a cualquier forma que gustes.
Incluso si el launcher tiene un círculo,
o tiene un rectángulo circular o cualquier cosa horrible,
ahora tendrás un icono que combina perfectamente con ese sabor.
Habrá una tonelada más de información sobre iconos adaptables
en una charla del jueves, definitivamente vayan a esa.
Muy bien, hablemos de shortcuts y widgets,
porque el launcher también es parte del sistema de IU.
Anteriormente, para poner shortcuts y widgets en la pantalla del usuario
había una diseminación de shortcuts que más o menos funciona,
y para los widgets solo tenían que suplicar al usuario, por favor, por favor,
mire si puede encontrar nuestro widget dentro del launcher.
En O, ahora puedes solicitar que una de estas cosas
se fije al espacio de trabajo del usuario
usando ShortcutManager para shortcuts, y AppWidgetManager para widgets.
Y el usuario tiene entonces la posibilidad de decir no, no quiero eso
en mi escritorio, o sí, sí lo quiero, y, de hecho, voy a hacerlo y a colocarlo
exactamente donde quiero. O pueden decir simplemente, claro,
encuentre un lugar para ello, que era el comportamiento anterior.
Ahora no tienen que acompañar al usuario a través de todo,
lo envía directamente a este diálogo. Es muy conveniente.
Miren todos los nuevos usuarios que usarán sus widgets.
Podría decir que estoy pausando para el aplauso
pero en realidad solo estoy lidiando con el pulsador este.
Sobre esto también hablaremos el jueves a las 4:30.
De acuerdo, notificaciones, sabían que esto iba a llegar.
Son súper útiles,
son geniales para la captación, los usuarios las aman;
quizá están un poco fuera de control.
Hay muchas que se están usando ahora mismo en el flujo de notificaciones,
y es muy difícil conseguir que el mensaje llegue a los usuarios que lo quieren.
Y es muy difícil para el usuario manejar todas las que piden su atención.
Si está fuera de control, el usuario debería tener siempre el control.
Esta ha sido nuestra regla desde el principio.
Añadimos la capacidad de bloquear notificaciones en Jelly Bean,
y en Nougat refinamos un poco y añadimos el silenciamiento.
Pero durante todo esto, la petición número uno que recibimos de los usuarios es
Bien, ¿pero puedo bloquear solo algunas de las notificaciones de una app?
Por otro lado, la petición número uno que recibimos de los programadores es
¿puede el usuario bloquear solo algunas de mis notificaciones?
Es lo mismo.
Todo el mundo está pidiendo lo mismo.
Y de aquí vienen los canales de notificación.
Es una nueva API en O.
Un canal es una categoría de notificaciones de una app
en donde todas tienen un cierto comportamiento.
Vibración, sonido, luz, si aparecen en pantalla,
el usuario tiene un control explícito y detallado.
En una app podrán configurar todos sus canales
definiendo el comportamiento por defecto para O.
Por ejemplo, si es un mensaje privado debe aparecer,
o si me etiquetaron quizás no aparecer o tiene una prioridad más baja;
y cuando los usuarios mantienen pulsada una notificación
o si la deslizan para revisarla
pueden ver en qué canal está y hacer cambios ahí mismo.
Cuando desarrollen para O,
si no se llevan nada más de mis dos minutos aquí, llévense esto,
deben usar canales para cada notificación
o serán descartadas.
Así que, mientras no programen para O, pueden empezar lentamente
a evolucionar su sistema de notificaciones hacia los canales.
Una vez que desarrollen para O tienen que estar todas canalizadas,
porque estamos intentando obtener una experiencia consistente
donde el usuario sabe qué va a recibir.
Vamos a hablar de esto y muchas otras cosas geniales,
incluyendo consideraciones de diseño,
todo el código que no puse ahí y lo que sea esa cosa parpadeante de allí,
en esta charla mañana a las 4:30.
Hay muchas otras cosas geniales llegando al sistema de IU,
hemos listado algunas de ellas aquí.
Otra vez se saltó al final,
me gusta hacer eso con las diapositivas.
Y les animo a echarle un vistazo a los avances de programadores
o instalar la beta y jugar un poco. Estamos muy orgullosos de esto.
Muy bien, nuevas API para programadores de EEUU.
Hemos expandido la API Strict Mode
que estoy seguro que todos ustedes usan en la depuración.
Ahora en ThreadPolicy reciben un aviso al usar I/O fuera del buffer.
Si usan un stream de entrada o de salida
sin encapsularlo en un stream del buffer
recibirán una advertencia o lo que sea, el aviso que hayan establecido.
En VmPolicy, si no etiquetan sus sockets también pueden recibir una advertencia.
El etiquetado de sockets es realmente útil
para depuración de tráfico usando Android Studio.
Y finalmente, si abren otra intención…
Si envían una intención fuera de su aplicación
y necesitan conceder permiso, también pueden recibir el aviso.
Así que es bastante fácil de usar.
Se parece a las API anteriores que teníamos.
Acceso a archivos de medios.
Presentamos los proveedores de documento hace un tiempo,
un par de lanzamientos atrás, y son extremadamente útiles,
excepto cuando tienen documentos grandes.
Si tienen un documento grande, necesitaban descargar todos los datos
antes de poder pasarlo al usuario del proveedor del documento.
Ahora pueden crear descriptores de archivo que pueden ser buscados.
Es extremadamente útil para audio, video, o cualquier tipo de contenido grande.
También es extremadamente fácil de usar.
Obtienen el StorageManager, abren el descriptor del archivo proxy,
utilizan un callback, luego invocas el callback
para solicitar el tamaño de los documentos,
para solicitar algunos datos en el array de bytes,
y le decimos cuándo cerrarlo.
Datos en caché.
Esta es una nueva API que le da el sistema para ser un ciudadano mejor.
Cada app tiene una cierta cantidad de datos
que puede usar en la partición de caché.
Cuando el sistema se queda sin espacio, sin espacio de almacenamiento,
va a empezar a eliminar algunos de sus datos de caché.
Si se mantienen por debajo de la cuota que se les ha dado,
pueden evitar que se eliminen sus datos.
Para esto, pueden usar StorageManager.
Pueden consultar el número de bytes que están asignados a su app.
Deberían consultar eso de vez en cuando,
porque la cuota puede cambiar dependiendo de la cuota utilizada
o qué tan a menudo el usuario usa la aplicación.
Cuando quieren más memoria, pueden simplemente usar allocateBytes(),
puedes hacerlo tú mismo.
Puedes crear un archivo, crear un flujo de salida.
Pero es mucho mejor hacerlo así,
porque cuando utilizas allocateBytes(), si es necesario,
el sistema eliminará los datos almacenados de otra app
para hacer espacio para sus datos.
Esto significa que getCacheQuotaBytes() puede ser más grande
que el espacio libre que queda en su dispositivo.
También puedes usar algo llamado setCacheBehaviorTombstone().
Esto es muy útil para que tu app pueda distinguir
entre un archivo que nunca estuvo en caché
y un archivo que sí estuvo pero se eliminó.
Así que cuando definan ese comportamiento
y el sistema elimine algunos de sus archivos en caché, truncará el archivo.
El archivo seguirá estando allí, pero el tamaño se pondrá en 0.
Esto les dice que la caché fue eliminada por el sistema.
Y, finalmente, el espacio utilizable y el espacio asignable son diferentes.
Hay mucho sobre seguridad de Android en este lanzamiento
y solo tenemos un poquito de tiempo para hablar sobre ello.
Quería destacar algunos de los acuerdos de privacidad que son nuevos en Android O.
Si han usado Android ID, deben saber ahora
que esto va a ser diferente para cada app, para cada usuario del dispositivo.
Así que ya no puede utilizarse para rastrear usuarios
entre apps en el mismo dispositivo.
Del mismo modo, si han pensado en las propiedades del sistema
para obtener net.hostname, ahora está vacío.
Así que si están diciendo que realmente necesitan
las ID de publicidades para enviar a los usuarios
los anuncios contextuales correctos,
para eso está la biblioteca Advertising ID de Google Play Services.
Así que échenle un vistazo en Google Play, pero no pueden usar Android ID.
Ya no pueden confiar en él del mismo modo que antes.
Tenía aquí una diapositiva sobre WebView, pero Romaine la tomó.
Otra cosa que quería mencionar sobre la navegación segura en WebView
es porque WebView se envía ahora a la Play Store cada seis meses,
podrán escoger características de navegación segura
hasta Lollipop, lo cual es fantástico.
También vimos el desvelamiento durante el keynote,
de algo que vamos a llamar Google Play Protect,
que en realidad son muchas tecnologías que ya teníamos antes
y nunca les habíamos dado la visibilidad que merecen
porque cuidamos de la gente todo el tiempo.
Así que cualquier dispositivo con Google Play tiene Protect habilitado.
Cada app que se sube a Play es filtrada y continuamente filtrada
con cada nueva versión que se sube.
Y cada vez que instalas una app donde tienen configurado Play Protect,
esa app también será filtrada,
incluso si la obtuvieron en otra tienda o en ADB Install.
Y estamos muy entusiasmados con esto.
Hay mucho más de qué hablar,
mucho más de qué hablar sobre seguridad en Android.
Me dieron todo un mazo de presentaciones sobre cosas,
así que dije, ¿por qué no hace su propia charla?
En realidad no dije eso, igual tenían su propia charla.
El jueves a las 2:30, irán y comprobarán de principio a fin
qué hay de nuevo en seguridad de Android,
Desde protección del kernell hasta más cosas de WebView.
Lenguaje y ejecución, creo que ya saben lo que voy a decir.
Esta mañana, anunciamos soporte oficial para Kotlin.
Vieron a Steph en el escenario, y la veo sentada ahí mismo en el pasillo.
Así que si la ven en el I/O, díganle gracias.
Steph y todo el equipo tras ella hicieron un trabajo increíble en el pasado,
durante mucho tiempo, para traerles esto.
Así que vayan a agradecérselo.
Ella pasará sus agradecimientos a todo el equipo.
Está disponible hoy en Android Studio 3.0, ya hay mucha documentación en línea.
Podría pasarme horas hablando de Kotlin y por qué es bueno para ustedes,
por qué es bueno para nosotros.
De hecho, ¿debería apropiarme de la charla?
Podría hacerlo, en serio. Lo hace, de hecho.
Pero por desgracia no tenemos mucho tiempo en esta sesión.
En su lugar, les invito a venir el viernes a las 10:30 aquí en este escenario.
Habrá una charla llamada Introducción a Kotlin de Andrey Breslav,
el jefe de diseño de lenguaje en JetBrains,
y Hadi, vicepresidente de Apoyo a Programación en JetBrains.
Y luego por la tarde en el escenario 4,
tendremos La vida es maravillosa y todo saldrá bien, Kotlin está aquí
de Christina Lee de Pinterest y Jack Wharton de Square.
Esto es importante para nosotros porque la razón
por la que les trajimos Kotlin es porque ustedes,
la comunidad, están usando Kotlin.
Les escuchamos, les oímos, les traemos lo que querían.
Queríamos que ustedes, la comunidad, estuvieran en el escenario
para hablar de ello mejor de lo que podemos hacerlo nosotros.
También, si tienen preguntas, pueden venir al sandbox de programadores
en la caseta Android Platform hoy de 3 a 4:30 y el jueves de 2 a 4,
y el viernes de mediodía a las 2 p.m.
Andrey, el diseñador de lenguaje, estará allí para responder a todas sus preguntas.
Por favor vengan si quieren saber cualquier cosa sobre Kotlin.
Vayan allí y hagan sus preguntas.
Como mencionó Steph, también nos atreveremos con nuestros otros lenguajes,
como el lenguaje de programación Java, y también tenemos C y C++.
Para el lenguaje de programación Java,
vamos a añadir nuevos paquetes en Android O.
Tenemos java.time, que facilita por fin la manipulación de tiempo y fechas.
Y tiene sentido, tiene mucho más sentido que las API más antiguas.
Ya era hora.
Sí, ya era hora.
También les traemos java.nio.file.
Mejora la vieja API java.io.file.
Les permite acceder a los atributos del archivo.
Les permite manipular rutas y leer archivos fácilmente.
Veremos un ejemplo.
Y, finalmente, java.lang.invoke, es una pequeña variación en reflexión.
Esto es una aproximación bruta, pero es genial porque les permite
transformar y encapsular controladores de método en tu aplicación.
Aquí hay un ejemplo de la nueva API para archivos.
Pueden usar la clase path para obtener una ruta.
Y luego pueden llamar a Files.lines() y leerá el contenido entero del archivo.
Van a obtener un stream.
En este ejemplo, estoy usando lambdas y funciones de string
para eliminar todas las líneas vacías, todas las líneas
que empiezan con almohadilla,
y luego lo vuelvo a reunir todo en un solo string al final.
Es mucho más fácil de lo que era antes.
Muy bien, algunos cambios en el runtime.
Ya oímos algunos de ellos esta mañana, y habrán más esta semana.
Nuevo recolector de copiado concurrente, que hace todo más rápido y mejor.
El copiado concurrente significa que no se detiene
excepto cuando hay un recolector completo.
Así que puede hacer todo lo que necesita hacer en segundo plano
mientras usted está haciendo otra cosa. En particular, una de las cosas
realmente geniales que puede hacer es compactar la pila en segundo plano.
Anteriormente, creo que en el lanzamiento previo,
tenía la capacidad de compactar la pila, lo cual es realmente bueno,
podía defragmentarla, hacer la pila más pequeña,
hacía asignaciones y recolecciones más rápido,
pero solo podía hacerlo cuando estas acciones estaban en segundo plano.
Cuando se entraba en inactividad lo hacía en ese estado inactivo.
Pero cuando estaba en segundo plano, no podía hacer nada sobre la pila,
expandirla o fragmentarla. Ahora puede recolectar en segundo plano,
defragmentar en segundo plano, y todo es más rápido.
También hay un nuevo mecanismo más rápido para asignaciones.
Puede hacer asignaciones bump-pointer, lo cual es mucho más rápido.
Las recolecciones son más rápidas
y el resultado de todo esto es menos tonterías para ustedes.
Más rápido asignando memoria, más rápido recolectando,
significa que tratar con basura y memoria en general
será mucho más rápido usando ART en la versión de O.
Muchas optimizaciones, loop unrolling, inlining.
Una de las cosas a tener en cuenta es que Dalvik se creó
con restricciones de tipo de memoria, ¿sí?
Lo importante era ahorrar memoria con Dalvik,
lo que significa que solo puede optimizarse hasta cierto punto,
más o menos llegó al final de su vida
en cuanto a lo que podían hacer en la optimización de cosas.
Cuando se subió ART, básicamente introdujeron una plataforma
sobre la cual podíamos construir optimizaciones futuras.
Así que ahora estamos empezando a ver los frutos de esto,
donde con cada versión, incluyendo O y futuros lanzamientos,
vamos a ser capaces de hacer más y más. Y hay muchos de ellos en esta versión.
Deberían echarle un vistazo a una sesión más tarde en la semana
con más información sobre esto. También aquí hay localización DEX.
Esto mejora particularmente el tiempo de lanzamiento de las actividades,
porque podemos compilar toda la memoria en el mismo espacio.
Así que es más fácil y rápido de acceder mientras se está iniciando la aplicación.
Hay una sesión el viernes por la mañana, Mejoras de Rendimiento y Memoria,
échenle un vistazo para más datos.
Más allá de la plataforma, tenemos la biblioteca de compatibilidad,
y tenemos otros mecanismos para colocar cosas
que no son solo están en la versión de O.
Queríamos destacar algunos de ellos.
Está la versión beta v26 que viene con el preview 2 para desarrolladores.
Todo lo que ya hablamos de texto, fuentes y XML, fuentes descargables,
así como TextView auto-dimensionable,
todo eso está ahí, pueden echarle un vistazo.
Además, hay algo que llamamos EmojiCompat.
Uno de los mayores problemas que tenemos con emojis
es que si sus amigos le están enviando emojis que son de un estándar futuro
diferente al que les damos nosotros en la versión que están utilizando,
ustedes no podrán ver esos emojis.
Y van a ver tofus en su lugar,
que dados algunos de los emojis que he visto puede ser más atractivo,
pero no muy significativos.
¿No sería lindo si realmente pudieran recibir
emojis actualizados en su dispositivo?
Ahora tenemos dos mecanismos
que las apps pueden usar para recibir emojis actualizados.
Una es que las apps realmente pueden empaquetarse con emojis actualizados.
Pueden actualizar las apps en la Play Store
antes que los usuarios para que los usuarios
reciban mejores actualizaciones de esos emojis.
La otra, y probablemente la mejor solución a largo plazo,
es utilizar realmente un servicio que podemos proveer
para las fuentes descargables que comentamos antes,
donde automáticamente pueden recibir fuentes actualizadas
a través de fuentes descargables, ¿sí?
Así que la app puede incorporar la capacidad de usar fuentes descargables
para tener emojis actualizados al mismo tiempo
que nosotros los proveemos al servicio.
Una vez más, vayan a Qué Hay de Nuevo en Biblioteca de Compatibilidad
mañana por la mañana para saber más sobre todo esto.
También teníamos más cosas sobre animación
además de las pequeñas cosas de AnimatorSet que comentamos antes.
Ahora tenemos la capacidad de tener cosas de animación basadas en física.
Así que si queremos ver eso en forma de animación,
la capacidad de tener básicamente animaciones
manejadas a través de velocidad, todas las capacidades de animación
que tenemos hasta la fecha en la plataforma
han sido manejadas a través de la idea de duración.
Ustedes dicen por cuánto tiempo quieren que se ejecute.
Pero con muchas animaciones, realmente quieren que se manejen según velocidad.
En particular, las animaciones que se manejan por interacciones del usuario.
Están arrastrando algo en la pantalla y lo sueltan,
¿no sería lindo que saliera disparado de su dedo
a la misma velocidad a la que lo arrastraban cuando lo soltaron?
Lanzados, desplazamientos, todo eso,
realmente requiere en su lugar un sistema de animación basado en velocidad.
Pueden hacer eso con los animadores, pero es realmente tedioso.
Requiere matemáticas, las matemáticas son difíciles.
Así que hemos incorporado esa capacidad a Physics Animation System
que resulta más natural, más interactiva y más interrumpible.
Porque realmente está prevista para funcionar
con ese modelo de interactividad con el usuario.
Aquí hay una pequeña demo de esto.
Mientras arrastramos la cosa de arriba,
los otros dos círculos están esencialmente sujetos
al de arriba a través de resortes que definieron ustedes.
Así que lo siguen por el espacio.
No lo siguen en fila india, sino que básicamente
están en resortes que están unidos,
e inmediatamente se benefician de esa interactividad
y la noción de esos resortes basada en la física.
Hay una charla sobre esto el viernes por la tarde,
todo sobre las cosas de animación basadas en física.
Por favor vengan si quieren saber más sobre esto.
Componentes de arquitectura.
Esto se mencionó en las keynotes.
Pensamos que a veces el desarrollo de Android
es quizás un poco más complicado de lo que necesita ser.
Así que dimos un paso atrás y dijimos bien, ¿cuáles son algunos
de los mayores problemas a los que deberíamos darles una vuelta
para intentar simplificarlos para los desarrolladores de apps?
Y a un par de ellos le hemos dado más vueltas específicamente
ahora mismo o alrededor del ciclo de vida.
En apariencia es bastante duro lidiar con el hecho
de que sus actividades puedan morir en cualquier momento
cuando rotan la pantalla o se va a segundo plano o lo que sea.
Y encontrar exactamente en qué estado se encuentran puede ser un poco tedioso.
Es un problema en curso con el que todos los programadores tienen que lidiar,
así que tomamos otro enfoque para hacerlo mucho más fácil.
Y además, también le dimos un vistazo a la persistencia.
Ahora pueden emitir SQL bruto, y eso es todo lo que tienen en el sistema.
Ahora tenemos un nuevo modo de hacer esto que construye sobre esa capacidad
y lo hace más fácil y más potente.
Vamos a hablar sobre todos ellos esta semana.
Tendremos una introducción a los componentes de arquitectura
a la que les animo a ir, esta tarde.
De hecho es inmediatamente después de esta sesión.
Y mañana por la mañana, tendremos una sobre el problema del ciclo de vida
y cómo lo hemos resuelto.
También tendremos una sobre persistencia y offline.
Todos estos son abrebocas que ya pueden probar
en una versión temprana. Así que échenles un vistazo,
con suerte hará que sus vidas de desarrolladores sea más fácil.
Hay algunos cambios de comportamiento,
algunos de los cuales les van a importar más que otros.
Hubo algunos cambios en el comportamiento
de aplicaciones en segundo plano, particularmente, en localización.
Si están ejecutando como aplicación en segundo plano,
solo obtendrán información de localización de grano grueso.
Todas estas cosas se están haciendo no para hacerlo más difícil,
sino para hacer mejores dispositivos, ¿verdad?
Si todas las aplicaciones tienen todas las capacidades en todo momento,
y pueden hacer lo que necesiten o quieren en cualquier momento,
entonces básicamente van a agotar la batería
porque todos están haciendo mucho trabajo al mismo tiempo.
Por eso estamos intentando ser sensatos sobre qué aplicaciones
realmente necesitan los servicios en qué momentos
para que podamos mejorar mucho la experiencia de usuario,
y también la experiencia de sus usuarios.
Así que una de ellas es la localización, información de grano grueso
cuando están en segundo plano. Otra son los wake locks.
Nos dimos cuenta de que era habitual para una aplicación
ir a un estado en segundo plano y luego a un estado en caché,
y en ese momento tiene un wake lock, y mantiene ese wake lock
por un tiempo muy largo. Eso realmente descarga la batería.
Así que ahora, un tiempo después de entrar en estado en caché,
el wake lock se libera automáticamente
para no poner al dispositivo en ese estado impropio.
También hay límites de ejecución cuando están ejecutando en segundo plano.
Hubo también cambios en las ventanas de alerta.
En particular, hay un nuevo tipo de ventana
llamada Type_Application_Overlay.
Si siguen el SDK de O, entonces este es el tipo de ventana
que deben usar si quieren tener capacidad de ventanas de alerta.
Si están en versiones anteriores, obviamente no existía,
no van a usar esto.
Solamente sepan que cualquier tipo de ventana que estén usando
va a estar estratificado bajo una de estas ventanas Type_Application_Overlay,
porque ahora tenemos una política de estratificación
mucho más definida al respecto.
Hay más información sobre esto esta tarde a las 5,
Chequeo de segundo plano y otros conocimientos.
Así que por favor vengan si quieren saber todos los detalles sobre esto.
Y, finalmente, habíamos prometido volver a esto, ¿verdad?
Lo hicimos.
Esto es nuestra otra cosa, ¿verdad?
De acuerdo.
Íbamos a hablar de esto, y creo…
Quiero decir, tenemos que tener un redoble de tambor, ¿no?
¿Qué tal un redoble de muslos?
¿Podemos tener un redoble de muslo?
Muy bien.
Eso suena bien.
Por desgracia, esto mirando el contador del escenario,
y voy a decir que la O significa…
¡Oooh!
Oh, no.
Nos quedamos sin tiempo.
Gracias.