<CarlosDev/>

Actual

Android 6.0 Marshmallow: permisos en ejecución

API 23, octubre de 2015. Las apps empezaron a pedir permisos peligrosos mientras corren, Doze frenó el trabajo en segundo plano y el nivel de parche pasó a ser una fecha.

Publicado
Lectura
16 min
Redacción
Estable
Serie
Parte 5 de 19 · Android, versión por versión
Banner de Android 6.0 Marshmallow, con el logo de la versión.
En este registro10 secciones

Android 6.0 Marshmallow es la versión en la que las apps dejaron de recibir todos sus permisos al instalarse. Desde API 23, una app pide cada permiso peligroso mientras corre, y el usuario puede negarlo. También trajo Doze, que aparca el trabajo en segundo plano cuando el teléfono está quieto, y un nivel de parche de seguridad que los dispositivos informan como una fecha.

La pantalla de inicio de Android 6.0 en el emulador: una barra de búsqueda de Google, un widget de reloj, un acceso a Camera y un dock con Phone, Contacts, el cajón de apps, Messaging y Browser
Pantalla de inicio de Android 6.0 sin capa del fabricante, en el emulador de Android con el perfil de un Nexus 5. Wikimedia Commons · Apache License 2.0

De un vistazo

VersiónAndroid 6.0
Nivel de API23
NombreMarshmallow, público
Build.VERSION_CODESM
SDK final17 de agosto de 2015
LanzamientoDespliegue en Nexus desde el 5 de octubre de 2015
Dispositivos de lanzamientoNexus 5X (LG) y Nexus 6P (Huawei), anunciados el 29 de septiembre de 2015
Plazo de target API en Google PlayNinguno. La regla de target API de Play empezó en 2018, con API 26

Google lanzó la primera vista previa para desarrolladores, entonces llamada Android M, en Google I/O el 28 de mayo de 2015. El 17 de agosto publicó el SDK final, le dio el nombre Marshmallow y abrió Play a las apps con target API 23. El 29 de septiembre anunció que la actualización llegaría “a partir de la próxima semana” a Nexus 5, 6, 7 (2013), 9, Nexus Player y Android One. El blog oficial de Android anunció el 5 de octubre que el despliegue empezaba ese mismo día, y Phone Scoop informó la misma fecha. Las tres vistas previas para desarrolladores anteriores al lanzamiento son las partes que siguen a esta nota: Preview 1, Preview 2 y Preview 3.

En el mismo evento del 29 de septiembre se presentó la tablet Pixel C, que usa Marshmallow; sus primeras compilaciones en AOSP son de Android 6.0.1. Android 6.0.1 llegó el 7 de diciembre de 2015 con el parche de seguridad de diciembre, los emoji de Unicode 8 y la vuelta de “until next alarm” en No molestar.

Qué trajo

  • Permisos en tiempo de ejecución. Tienen su propia sección más abajo.
  • Doze. Un teléfono desenchufado, quieto y con la pantalla apagada entra en Doze. Se corta la red, se ignoran los wake locks, y las alarmas, los jobs y las sincronizaciones esperan a breves ventanas de mantenimiento.
  • App Standby. Una app que el usuario no toca hace tiempo, sin proceso en primer plano ni notificación visible, pierde la red, sus jobs y sus sincronizaciones mientras el teléfono está desenchufado.
  • App Links. Con android:autoVerify="true" en un intent filter, Android 6.0 consulta https://<host>/.well-known/assetlinks.json al instalar. Si coincide, los enlaces a ese sitio abren la app sin el diálogo de selección.
  • API de huella digital. FingerprintManager.authenticate(), con el permiso USE_FINGERPRINT y ligada a claves del Android Keystore.
  • Auto Backup for Apps. Las apps con target API 23 respaldan sus datos en una carpeta privada del Google Drive del usuario, sin escribir código. El límite es de 25 MB por app y no cuenta contra la cuota de Drive.
  • Almacenamiento adoptable. El usuario puede formatear una tarjeta SD como almacenamiento interno. Las apps deben pedir las rutas con getFilesDir() y getCacheDir() en lugar de escribirlas a mano. Samsung y LG lo dejaron fuera del Galaxy S7 y el LG G5, así que no des por hecho que existe.
  • Assist API. Las apps pueden pasarle contexto al asistente con Activity#onProvideAssistContent(). Ars Technica describe Google Now on Tap como la función que se apoya en ella: una pulsación larga en inicio envía la pantalla a Google.
  • Otros añadidos. Direct Share (ChooserTargetService), interacciones por voz (VoiceInteractor), la linterna (CameraManager#setTorchMode()), android.media.midi, los botones del lápiz Bluetooth y los modos de pantalla 4K.

Seguridad y privacidad

  • Actualizaciones mensuales. El 5 de agosto de 2015 Google anunció que los Nexus recibirían cada mes una OTA centrada en seguridad. El primer boletín público, del 13 de agosto de 2015, cubrió las fallas de Stagefright. Google prometió parches para los Nexus durante tres años desde su lanzamiento o 18 meses desde su última venta en Google Store, lo que fuera más largo.
  • Nivel de parche de seguridad. API 23 agregó Build.VERSION.SECURITY_PATCH, la fecha del último parche aplicado. Ajustes lo muestra como “Android security patch level” en “About phone”.
  • Cifrado. El CDD de 6.0 exige cifrado de disco completo en todo dispositivo con pantalla de bloqueo segura que no sea de poca RAM. Si su velocidad AES supera los 50 MiB/s, el cifrado debe quedar activo por defecto tras la configuración inicial.
  • Verified Boot. Según el mismo CDD, los dispositivos con AES por encima de 50 MiB/s deben soportar Verified Boot, desde una raíz de confianza en hardware hasta la partición del sistema.
  • Claves aisladas en hardware. Una nueva HAL protege las claves de la API de huella, la pantalla de bloqueo, el cifrado del dispositivo y los certificados de cliente ante un kernel comprometido.
  • Reglas para la huella. El CDD limita la tasa de falsa aceptación a 0.002 %, bloquea al menos 30 segundos tras cinco intentos fallidos y exige que la comparación ocurra dentro del Trusted Execution Environment.
  • Identificadores de hardware. WifiInfo.getMacAddress() y BluetoothAdapter.getAddress() devuelven 02:00:00:00:00:00 a todas las apps. Los escaneos de Wi-Fi y Bluetooth en segundo plano usan una MAC aleatoria.
  • Cambios menores. La política de SELinux se endureció (filtrado de IOCTL, /proc muy restringido). El USB arranca en modo solo carga y el acceso a archivos requiere la aprobación del usuario. Un nuevo chequeo de StrictMode marca el tráfico sin cifrar. Android pasó de OpenSSL a BoringSSL. Las SD adoptadas van cifradas y solo funcionan en un dispositivo.

Permisos

Ahora hay dos clases de permisos. Los normales se siguen otorgando al instalar. Los peligrosos (ubicación, contactos, cámara, micrófono, SMS y similares) hay que pedirlos en tiempo de ejecución si la app tiene target API 23.

otorgado denegado Permitir Rechazar La función necesita CAMERA checkSelfPermission Usar la cámara requestPermissions Diálogo del sistema Seguir sin él

El diálogo es del sistema (con borde punteado arriba), así que la app no puede cambiar su texto. Llama a shouldShowRequestPermissionRationale() para saber cuándo conviene explicar el pedido antes. En Android 6.0, un segundo pedido después de un rechazo agregaba la casilla “Never ask again”.

La pantalla Permisos de la app en Ajustes, con un interruptor por grupo: Calendar, Camera, Contacts, Location, Microphone, Phone, SMS y Storage
Interruptores de permisos por app, uno por grupo, como llegaron en Android 6.0. Captura subida en 2017. Wikimedia Commons · Apache License 2.0
  • Grupos. El usuario otorga y revoca por grupo de permisos. Hasta Android 8.0, otorgar uno le daba a la app los demás permisos de ese grupo declarados en su manifiesto.
  • Apps antiguas. Las apps con target API 22 o menor siguen recibiendo sus permisos al instalar. Aun así, el usuario puede desactivarlos, tanto en apps viejas como nuevas.
  • Nuevo. USE_FINGERPRINT.
  • Eliminados. READ_HISTORY_BOOKMARKS y WRITE_HISTORY_BOOKMARKS, junto con Browser.getAllBookmarks() y Browser.saveBookmark().
  • Ubicación para escanear. Leer identificadores de dispositivos cercanos con WifiManager.getScanResults(), BluetoothDevice.ACTION_FOUND o BluetoothLeScanner.startScan() requiere ACCESS_FINE_LOCATION o ACCESS_COARSE_LOCATION.
  • Device owners. DevicePolicyManager#setPermissionPolicy() permite que el administrador de una empresa defina cómo se otorgan los permisos.

Qué cambió para tu app

Todas las apps en Android 6.0

CambioQué hacer
Doze y App StandbyPrueba con adb shell dumpsys deviceidle force-idle y adb shell am set-inactive <package> true. Usa setAndAllowWhileIdle() o setExactAndAllowWhileIdle() para alarmas que deben sonar. Envía los push urgentes como mensajes FCM de alta prioridad: reciben acceso breve a la red durante Doze
Apps que quieren quedar fuera de DozeACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS lleva al usuario a Ajustes. ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS lo pide directamente, pero la política de Play solo lo permite cuando Doze rompe la función principal de la app
El usuario puede desactivar permisos en cualquier appPrueba con los permisos apagados, aunque no tengas target API 23
La MAC devuelve 02:00:00:00:00:00No la uses como identificador del dispositivo
Se eliminaron las APIs de marcadoresGuarda los marcadores en tu propio almacenamiento
setStreamSolo() y setStreamMute() quedan obsoletosUsa requestAudioFocus() y adjustStreamVolume()
El Keystore deja de soportar DSAUsa ECDSA
El acceso a la cámara sigue la prioridad del procesoManeja onError() (Camera) u onDisconnected() (Camera2)
Un APK al que le falta un archivo declarado en el manifiesto se considera corruptoVuelve a firmar tras quitar contenido

El cliente HTTP de Apache salió del SDK, así que con compileSdkVersion 23 ya no compila. Cambia a HttpURLConnection o agrega useLibrary 'org.apache.http.legacy' en build.gradle. Los dispositivos mantuvieron las clases en el bootclasspath hasta Android 9.

Apps con target API 23

CambioQué hacer
Los permisos peligrosos se piden en ejecucióncheckSelfPermission() antes de cada acceso, requestPermissions() si está denegado
Auto Backup viene activadoElige qué se respalda con android:fullBackupContent, o usa android:allowBackup="false"
Se rechazan bibliotecas nativas con text relocationsRecompílalas sin text relocations
El lápiz informa BUTTON_STYLUS_PRIMARY y BUTTON_STYLUS_SECONDARYLéelos con MotionEvent#getButtonState()

Qué perduró

  • Los permisos en ejecución siguen siendo el modelo. Android 8.0 corrigió el otorgamiento por grupo, Android 10 separó ACCESS_BACKGROUND_LOCATION y Android 11 sumó los permisos de una sola vez.
  • Doze creció en Android 7.0: una parte se aplica también con el teléfono en movimiento, en el bolsillo y con la pantalla apagada.
  • Verified Boot pasó a ser obligatorio en Android 7.0: un dispositivo comprometido no arranca.
  • Apache HTTP salió del bootclasspath en Android 9. Las apps con target 9 que todavía lo usan declaran <uses-library android:name="org.apache.http.legacy" android:required="false"/>.
  • Huella digital: Android 9 pide pasar de FingerprintManager a BiometricPrompt.
  • El almacenamiento adoptable no podía combinarse con el cifrado basado en archivos en Android 7.0 a 8.1. Desde Android 9, ambos funcionan juntos.
  • Los boletines mensuales se siguen publicando. El requisito de target API de Play, que no existía en 2015, empezó en 2018 y sube cada año.
  • Fin del soporte. El boletín de agosto de 2018 fue el último en incluir Android 6.0 y 6.0.1 entre sus versiones de AOSP actualizadas. La última compilación de Marshmallow en la lista de Google, android-6.0.1_r81 (MOI10E), tiene el nivel de parche de octubre de 2017. Google Play services hoy exige como mínimo Android 7.0 (API 24); OSnews informó el abandono de 6.0 el 24 de julio de 2026.

Para saber

  • La constante M en AOSP lleva un comentario de una línea: M comes after L.
  • El Easter egg es Marshmallow Land, un juego al estilo Flappy Bird. Su código admite hasta seis jugadores (MAX_PLAYERS = 6) y corre en un proceso llamado :sweetsweetdesserts.
  • 02:00:00:00:00:00 es lo que toda app en Marshmallow lee como dirección MAC de Wi-Fi y Bluetooth.
  • Android Police informó en mayo de 2015 que el nombre interno era Macadamia Nut Cookie, de ahí el nombre de la rama mnc-dev en AOSP.

Parte 1 de 3

2 min

M Developer Preview 1: Android M en I/O

28 de mayo de 2015. La primera build de Android M, presentada en Google I/O, llevó permisos en tiempo de ejecución, App Links, Doze y las APIs de huella a cuatro Nexus.

Leer por separado: M Developer Preview 1: Android M en I/O

Google anunció Android M en Google I/O el 28 de mayo de 2015 y publicó la primera vista previa para desarrolladores ese mismo día, justo después de la keynote. La versión aún no tenía número ni nombre: el SDK la llamaba “Android MNC Preview” y los proyectos compilaban contra ella con compileSdkVersion 'android-MNC'.

Fecha28 de mayo de 2015
BuildMPZ44Q
DispositivosNexus 5, Nexus 6, Nexus 9 y Nexus Player, flasheando imágenes de sistema
Emuladorx86 y ARM, 32 y 64 bits
Google Play services7.5
Estado de la APIAPIs de vista previa, no finales; todavía sin nivel de API

Lo que trajo la Preview 1

El anuncio de Google presentó M como una versión para “mejorar los fundamentos”. Los cambios principales para desarrolladores ya estaban en esta build:

  • Permisos en tiempo de ejecución. Las apps piden permisos en contexto mientras se ejecutan, y el usuario puede conceder o rechazar cada uno y cambiarlo después en ajustes. Google pidió a los desarrolladores contemplar los permisos que no se concedan.
  • App Links. Un atributo autoVerify en el manifiesto permite que una app verificada abra sus propias URL sin el diálogo de elección de app.
  • Doze. Cuando la detección de movimiento significativo indica que el dispositivo lleva un rato sin uso, Android reduce la actividad en segundo plano. Google recomendó a las apps de chat usar mensajes de alta prioridad para despertarlas.
  • Huella digital. Nuevas APIs permiten a las apps autorizar con el sensor de huella, el mismo mecanismo de Android Pay y de las compras en Play.
  • Now on tap. Las APIs de asistencia pasan la pantalla actual a Google Now; Google pidió implementar App Indexing para aparecer ahí.

Junto con la preview, Google publicó Android Studio 1.3 Preview, con edición y depuración de C y C++ para el NDK, y la Android Design Support Library.

El calendario previsto

Esta vez Google prometió un calendario claro. El sitio de la preview lo detallaba: la Preview 2 a finales de junio o principios de julio, la Preview 3, casi final, a finales de julio, y el SDK final más adelante en el tercer trimestre. Los dispositivos con una build de preview recibirían cada actualización por OTA.

Parte 2 de 3

2 min

M Developer Preview 2: APIs casi finales

9 de julio de 2015. La segunda preview rehízo el modelo de permisos, convirtió el almacenamiento externo en permiso de tiempo de ejecución y dejó el USB solo en carga.

Leer por separado: M Developer Preview 2: APIs casi finales

La Preview 2 llegó el 9 de julio de 2015, dentro del plazo de finales de junio o principios de julio que Google había fijado. Google la describió como APIs “near-final” con correcciones a partir de lo que reportaron los desarrolladores. Casi todos sus cambios fueron en el modelo de permisos.

Fecha9 de julio de 2015
BuildMPZ79M (Nexus 5, 6, 9); MPZ79N (Nexus Player)
DispositivosLos mismos cuatro Nexus; por OTA desde MPZ44Q o flasheando
Emuladorx86 y ARM, 32 y 64 bits, desde el SDK Manager
Google Play services7.6
Estado de la APICasi final

Cómo rehízo los permisos la Preview 2

  • Almacenamiento. WRITE_EXTERNAL_STORAGE pasó a “dangerous”, así que las apps deben pedirlo en tiempo de ejecución. Junto con READ_EXTERNAL_STORAGE forma el grupo STORAGE.
  • Huella digital. USE_FINGERPRINT pasó a “normal” y ya no necesita la aprobación del usuario. No da acceso al registro de huellas.
  • Wi-Fi y Bluetooth. BLUETOOTH, BLUETOOTH_ADMIN, CHANGE_WIFI_STATE, CHANGE_WIMAX_STATE y CHANGE_WIFI_MULTICAST_STATE pasaron a “normal”. Leer la dirección MAC de un dispositivo Bluetooth o Wi-Fi remoto ahora exige ACCESS_COARSE_LOCATION o ACCESS_FINE_LOCATION.
  • Cuentas. Algunos permisos de cuentas e identidad pasaron al grupo CONTACTS; USE_CREDENTIALS, MANAGE_ACCOUNTS y AUTHENTICATE_ACCOUNTS quedaron sin grupo a la espera de más cambios. Se eliminaron los permisos de marcadores y de feeds suscritos.
  • Apps del sistema. Las apps de la imagen del sistema dejaron de recibir permisos peligrosos de forma automática.
  • Justificación. Activity.shouldShowRequestPermissionRationale(String) indica si el usuario ya rechazó un permiso, para que la app explique por qué lo necesita.

Otros cambios de la Preview 2

  • Las conexiones USB quedan en solo carga por defecto; el usuario debe permitir el acceso a datos.
  • android.app.AssistContent y AssistStructure pasaron al nuevo paquete android.app.assist.
  • Los listeners del lápiz cambiaron de nombre: View.OnContextClickListener y GestureDetector.OnContextClickListener sustituyen a las versiones OnStylusButtonPress.
  • InputDevice.hasMicrophone() indica si un dispositivo de entrada tiene micrófono.

El tema de sistema “Dark” de la Preview 1 desapareció. 9to5Google citó después a un empleado de Google en el issue tracker de la preview: “This will not be included in the M release.”

Parte 3 de 3

2 min

M Developer Preview 3: SDK final y nombre

17 de agosto de 2015. La última preview trajo el SDK oficial de Android 6.0 con API 23, dio a la versión el nombre Marshmallow y abrió Google Play a las apps con ese target.

Leer por separado: M Developer Preview 3: SDK final y nombre

La Preview 3 salió el 17 de agosto de 2015, con el SDK oficial de Android 6.0. El mismo anuncio le dio a la versión el nombre Marshmallow y la fijó en el nivel de API 23. Google Play empezó a aceptar apps con target API 23 en todos los canales: Alpha, Beta y Production.

Fecha17 de agosto de 2015
BuildMPA44I
DispositivosNexus 5, Nexus 6, Nexus 9 y Nexus Player, por OTA o flasheando
Emuladorx86 y ARM, 32 y 64 bits; SDK de Android 6.0 desde el SDK Manager
Google Play services7.8
Estado de la APIFinal, nivel de API 23; imágenes de sistema casi finales, no pensadas para consumidores

Llegó tarde. El plan era tenerla casi final a finales de julio; el 31 de julio Android Police informó que Google no cumpliría esa fecha. Las primeras imágenes de la Preview 3 eran la build MPA44G, y Google las sustituyó ese mismo día por MPA44I, la build que el sitio de la preview registra como Preview 3.

Lo que cerró la Preview 3

Google calificó los cambios de API desde la Preview 2 como “fairly incremental”:

  • Interfaz de permisos. Los diálogos y los ajustes de permisos tomaron su forma final, con algunos cambios de comportamiento.
  • GET_ACCOUNTS. Entró al grupo CONTACTS como “dangerous”, así que las apps con target API 23 deben pedirlo en tiempo de ejecución. READ_PROFILE y WRITE_PROFILE salieron del grupo CONTACTS.
  • Escaneos de Wi-Fi y Bluetooth LE. Las apps con target API 23 necesitan un permiso de ubicación para recibir resultados. Las apps con target API 22 o menor los siguen recibiendo, pero solo en primer plano.
  • API de huella digital. Mejor reporte de errores, mejor flujo de registro de huellas y soporte de enumeración.

La Support Library 23 salió el mismo día, con las nuevas bibliotecas customtabs, percent, recommendation y preference, y ayudas compatibles con versiones anteriores para las APIs de permisos y de huella.

Las builds de preview no podían recibir actualizaciones de consumo. Para obtener la versión pública, que llegó a los Nexus el 5 de octubre, había que flashear a mano una imagen de fábrica.

Clasificado en

Citas

58

Referencias externas