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.

De un vistazo
| Versión | Android 6.0 |
| Nivel de API | 23 |
| Nombre | Marshmallow, público |
Build.VERSION_CODES | M |
| SDK final | 17 de agosto de 2015 |
| Lanzamiento | Despliegue en Nexus desde el 5 de octubre de 2015 |
| Dispositivos de lanzamiento | Nexus 5X (LG) y Nexus 6P (Huawei), anunciados el 29 de septiembre de 2015 |
| Plazo de target API en Google Play | Ninguno. 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 consultahttps://<host>/.well-known/assetlinks.jsonal 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 permisoUSE_FINGERPRINTy 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()ygetCacheDir()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()yBluetoothAdapter.getAddress()devuelven02:00:00:00:00:00a 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,
/procmuy restringido). El USB arranca en modo solo carga y el acceso a archivos requiere la aprobación del usuario. Un nuevo chequeo deStrictModemarca 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.
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”.

- 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_BOOKMARKSyWRITE_HISTORY_BOOKMARKS, junto conBrowser.getAllBookmarks()yBrowser.saveBookmark(). - Ubicación para escanear. Leer identificadores de dispositivos cercanos con
WifiManager.getScanResults(),BluetoothDevice.ACTION_FOUNDoBluetoothLeScanner.startScan()requiereACCESS_FINE_LOCATIONoACCESS_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
| Cambio | Qué hacer |
|---|---|
| Doze y App Standby | Prueba 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 Doze | ACTION_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 app | Prueba con los permisos apagados, aunque no tengas target API 23 |
La MAC devuelve 02:00:00:00:00:00 | No la uses como identificador del dispositivo |
| Se eliminaron las APIs de marcadores | Guarda los marcadores en tu propio almacenamiento |
setStreamSolo() y setStreamMute() quedan obsoletos | Usa requestAudioFocus() y adjustStreamVolume() |
| El Keystore deja de soportar DSA | Usa ECDSA |
| El acceso a la cámara sigue la prioridad del proceso | Maneja onError() (Camera) u onDisconnected() (Camera2) |
| Un APK al que le falta un archivo declarado en el manifiesto se considera corrupto | Vuelve 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
| Cambio | Qué hacer |
|---|---|
| Los permisos peligrosos se piden en ejecución | checkSelfPermission() antes de cada acceso, requestPermissions() si está denegado |
| Auto Backup viene activado | Elige qué se respalda con android:fullBackupContent, o usa android:allowBackup="false" |
| Se rechazan bibliotecas nativas con text relocations | Recompílalas sin text relocations |
El lápiz informa BUTTON_STYLUS_PRIMARY y BUTTON_STYLUS_SECONDARY | Lé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_LOCATIONy 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
FingerprintManageraBiometricPrompt. - 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
Men 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:00es 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-deven AOSP.
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/OGoogle 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'.
| Fecha | 28 de mayo de 2015 |
| Build | MPZ44Q |
| Dispositivos | Nexus 5, Nexus 6, Nexus 9 y Nexus Player, flasheando imágenes de sistema |
| Emulador | x86 y ARM, 32 y 64 bits |
| Google Play services | 7.5 |
| Estado de la API | APIs 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
autoVerifyen 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.
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 finalesLa 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.
| Fecha | 9 de julio de 2015 |
| Build | MPZ79M (Nexus 5, 6, 9); MPZ79N (Nexus Player) |
| Dispositivos | Los mismos cuatro Nexus; por OTA desde MPZ44Q o flasheando |
| Emulador | x86 y ARM, 32 y 64 bits, desde el SDK Manager |
| Google Play services | 7.6 |
| Estado de la API | Casi final |
Cómo rehízo los permisos la Preview 2
- Almacenamiento.
WRITE_EXTERNAL_STORAGEpasó a “dangerous”, así que las apps deben pedirlo en tiempo de ejecución. Junto conREAD_EXTERNAL_STORAGEforma el grupoSTORAGE. - Huella digital.
USE_FINGERPRINTpasó 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_STATEyCHANGE_WIFI_MULTICAST_STATEpasaron a “normal”. Leer la dirección MAC de un dispositivo Bluetooth o Wi-Fi remoto ahora exigeACCESS_COARSE_LOCATIONoACCESS_FINE_LOCATION. - Cuentas. Algunos permisos de cuentas e identidad pasaron al grupo
CONTACTS;USE_CREDENTIALS,MANAGE_ACCOUNTSyAUTHENTICATE_ACCOUNTSquedaron 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.AssistContentyAssistStructurepasaron al nuevo paqueteandroid.app.assist.- Los listeners del lápiz cambiaron de nombre:
View.OnContextClickListeneryGestureDetector.OnContextClickListenersustituyen a las versionesOnStylusButtonPress. 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.”
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 nombreLa 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.
| Fecha | 17 de agosto de 2015 |
| Build | MPA44I |
| Dispositivos | Nexus 5, Nexus 6, Nexus 9 y Nexus Player, por OTA o flasheando |
| Emulador | x86 y ARM, 32 y 64 bits; SDK de Android 6.0 desde el SDK Manager |
| Google Play services | 7.8 |
| Estado de la API | Final, 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 grupoCONTACTScomo “dangerous”, así que las apps con target API 23 deben pedirlo en tiempo de ejecución.READ_PROFILEyWRITE_PROFILEsalieron del grupoCONTACTS.- 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.