Android 4.4 KitKat es la versión que Google aligeró para que funcionara en
teléfonos con 512 MB de RAM. A los desarrolladores les trajo el storage access
framework, la impresión, la emulación de tarjetas NFC (host card emulation) y
el modo inmersivo a pantalla completa. También puso SELinux en modo enforcing y
cerró el almacenamiento compartido detrás de READ_EXTERNAL_STORAGE.
De un vistazo
| Versión | Android 4.4 (4.4W para relojes) |
| Nivel de API | 19 (20 para 4.4W) |
| Nombre | KitKat, público |
Build.VERSION_CODES | KITKAT (KITKAT_WATCH) |
| SDK | Revisión 1 de la plataforma, octubre de 2013; anunciado el 31 de octubre de 2013 |
| Lanzamiento | 31 de octubre de 2013, con el Nexus 5 |
| Dispositivo de lanzamiento | Nexus 5 (LG) |
| Plazo de target API en Google Play | Ninguno. La regla de target API de Play empezó en 2018, con API 26 |
Google anunció Android 4.4 y el Nexus 5 el 31 de octubre de 2013 y dijo que el teléfono estaba “available today on Google Play”. Phone Scoop informó ese mismo día que los pedidos se enviarían el 5 de noviembre. Google prometió la actualización “in the next few weeks” para Nexus 4, Nexus 7, Nexus 10 y las ediciones Google Play del Galaxy S4 y el HTC One.
Android 4.4W, API 20
La API 20 existe solo para relojes. Las notas de versión del SDK describen
Android 4.4W como la versión que “makes KitKat available for Android Wear”, con
la revisión 1 en junio de 2014. TechCrunch informó el lanzamiento del SDK
completo de Android Wear en Google I/O el 25 de junio de 2014. Su único cambio
de comportamiento documentado: un AlertDialog puede quedarse sin fondo
predeterminado si el tema no define uno.
Qué trajo

- Project Svelte. El nombre que Google dio al trabajo de reducir la memoria de Android “so Android can run comfortably on only 512MB of RAM”, desde el kernel hasta sus propias apps, como Chrome y YouTube. Los detalles están más abajo, en “Qué cambió en los dispositivos con poca RAM”.
- Storage access framework. Un selector del sistema abre documentos de
cualquier proveedor, local o en la nube. Las apps usan
ACTION_OPEN_DOCUMENToACTION_CREATE_DOCUMENT; los servicios de almacenamiento heredan deDocumentsProvidere implementanqueryRoots(),queryChildDocuments(),queryDocument()yopenDocument(). - Impresión.
android.printyandroid.printservice. Una app hereda dePrintDocumentAdapter, dibuja las páginas en unPdfDocumenty llama aPrintManager.print(). Los fabricantes de impresoras publican unPrintService. - Host card emulation. Cualquier app puede emular una tarjeta NFC
heredando de
HostApduService, sin elemento seguro. Ars Technica señaló la consecuencia: Google Wallet podía funcionar en cualquier teléfono KitKat con NFC, y Settings sumó la pantalla “Tap & pay” para elegir la app de pago. - Modo inmersivo.
SYSTEM_UI_FLAG_IMMERSIVEySYSTEM_UI_FLAG_IMMERSIVE_STICKYocultan la barra de estado y la de navegación mientras el usuario sigue tocando la app. Un deslizamiento desde el borde las devuelve. - Barras del sistema translúcidas.
Theme.Holo.NoActionBar.TranslucentDecor, owindowTranslucentStatusywindowTranslucentNavigation. - WebView con Chromium. WebView pasó a una implementación basada en
Chromium, con
evaluateJavascript()y depuración remota medianteWebView.setWebContentsDebuggingEnabled(). - App de SMS predeterminada. El usuario elige una “Default SMS app” en
Settings. Solo esa app recibe
SMS_DELIVER_ACTIONy puede escribir en el proveedor de SMS. Ars Technica vio que en el Nexus 5 Hangouts reemplazaba a la app Messaging como predeterminada. - Launcher predeterminado. Settings sumó una pantalla “Home” que fija la
activity
CATEGORY_HOMEpreferida. Aparece solo cuando hay dos o más apps de inicio instaladas, y luego se queda: el comentario de AOSP dice “Once we decide to show Home settings, keep showing it forever”. - Grabación de pantalla.
adb shell screenrecordgraba la pantalla en MP4, sin audio, hasta tres minutos. - Otras novedades. El framework de transiciones (
android.transition), sensores de hardware de detector y contador de pasos, sensores por lotes, una API para emisores infrarrojos (ConsumerIrManager), el modo lector NFC, Bluetooth MAP y HID over GATT,ImageReader, ajustes de subtítulos y drawables que se reflejan solos en idiomas de derecha a izquierda.
Seguridad y privacidad
- SELinux en enforcing. Android 4.3 usaba SELinux en modo permissive; 4.4
lo aplica. La aplicación era parcial: el CDD de 4.4 exige enforcing en
dominios como
installd,netdyvold, mientras que el dominio de las apps de terceros “SHOULD remain in permissive mode”. About phone muestra “SELinux status”. - Arranque verificado. Android 4.4 admite el arranque verificado mediante
dm-verity, una función opcional del kernel. - Cifrado. El cifrado de disco completo usa scrypt para derivar su clave. El CDD exige que todo dispositivo con pantalla de bloqueo lo admita.
- Avisos y fijación de certificados. Android avisa al usuario cuando se agrega un certificado al almacén del dispositivo. También detecta y bloquea certificados fraudulentos de Google en conexiones TLS.
- Cambios menores. El Android Keystore suma ECDSA. Las VPN se aplican por
usuario en dispositivos multiusuario. Todo el código de la plataforma se
compila con
FORTIFY_SOURCEnivel 2. - Escritura de SMS. Solo la app de SMS predeterminada puede escribir en el
proveedor de SMS.
SMS_RECEIVED_ACTIONpasa a ser un broadcast que ninguna app puede abortar. - Captura de pantalla.
SurfaceView.setSecure()deja el contenido protegido fuera de las grabaciones de pantalla.
Permisos
Todos los permisos se seguían otorgando al instalar. Las solicitudes en ejecución llegaron dos años después, con Android 6.0. Lo que cambió en 4.4 fue el almacenamiento externo.
- La lectura se aplica.
READ_EXTERNAL_STORAGEexistía desde la API 16, pero no se aplicaba. Desde la API 19, una app sin él no puede leer archivos compartidos. En elplatform.xmlde AOSP,WRITE_EXTERNAL_STORAGEincluye ahora también el grupo de lectura. - Las carpetas de la app no requieren permiso. Una app puede leer y
escribir
Android/data/<package>/en el almacenamiento externo sin permiso. Un daemon FUSE sintetiza el propietario y el modo de los archivos para que funcione. - Se cierra la escritura en la SD. El CDD prohíbe que las apps escriban en
el almacenamiento externo secundario fuera de sus carpetas, para que el
sistema pueda limpiar los archivos al desinstalar una app. En AOSP, escribir
en esos volúmenes pasa por
WRITE_MEDIA_STORAGE, un permisosignature|systemque las apps de terceros no pueden obtener. - Nuevos.
TRANSMIT_IR(normal), más los permisos de launcherINSTALL_SHORTCUTyUNINSTALL_SHORTCUTcomo constantes del SDK. - Roles elegidos en Settings. Ser la app de SMS predeterminada, recibir notificaciones como listener y atender “Tap & pay” los concede el usuario en Settings, no un diálogo de permisos.
Qué cambió para tu app
Todas las apps en Android 4.4
| Cambio | Qué hacer |
|---|---|
El almacenamiento externo compartido requiere READ_EXTERNAL_STORAGE | Decláralo si lees archivos fuera de tu propia carpeta |
| Las apps no pueden escribir en el almacenamiento secundario | Escribe en tus carpetas de getExternalFilesDirs(), o deja que el usuario elija el destino con ACTION_CREATE_DOCUMENT |
| Solo la app de SMS predeterminada escribe en el proveedor de SMS | Declara los receivers, la activity y el service que te hacen elegible como predeterminada; las demás apps leen con SMS_RECEIVED_ACTION |
| WebView se basa en Chromium | Prueba tu contenido web; las apps con target API 18 o menor corren en un “quirks mode” |
| Existen dispositivos con poca RAM | Consulta ActivityManager.isLowRamDevice() y apaga las funciones que consumen mucha memoria |
| La action bar siempre muestra su botón de overflow | Cuenta con que el usuario llegue a las acciones de overflow en pantalla, aunque el dispositivo tenga tecla Menu |
Una app de mensajes que no es la predeterminada no se cae al escribir en el proveedor de SMS. Google advirtió que la escritura “will silently fail”.
El cambio del overflow está en ActionBarPolicy de AOSP. En 4.3,
showsOverflowMenuButton() devolvía true solo si el dispositivo no tenía
tecla Menu física o era un televisor. En 4.4 siempre devuelve true.
Apps con target API 19
| Cambio | Qué hacer |
|---|---|
AlarmManager.set() y setRepeating() son inexactas y se agrupan | Usa setExact() para una hora precisa y setWindow() para un rango |
addPeriodicSync() usa un margen de cerca del 4% del período | Usa requestSync() con SyncRequest.Builder para fijar el tuyo |
PreferenceActivity.isValidFragment() lanza una excepción si no se sobrescribe | Sobrescríbelo y acepta solo tus propias clases de fragment |
Una URL javascript: en WebView reemplaza la página con su resultado | Ejecuta scripts con evaluateJavascript() |
getSharedPreferences() rechaza un nombre null | Pasa un nombre |
| Las carpetas de la app en el almacenamiento externo no requieren permiso | Deja de pedir permisos de almacenamiento que solo usabas para tu carpeta |
Para isValidFragment(), la implementación por defecto de AOSP lanza una
RuntimeException en apps con target API 19: “Subclasses of PreferenceActivity
must override isValidFragment(String) to verify that the Fragment class is
valid!”
Qué cambió en los dispositivos con poca RAM
La guía “Low RAM” archivada de source.android.com enumera lo que hizo Project Svelte. El equipo de Google armó primero el objetivo. Dave Burke, jefe de ingeniería de Android, contó a ReadWrite que usaron un Nexus 4 con 512 MB, a 960×540, con dos núcleos en lugar de cuatro y a menor frecuencia, y que lo llevaban como teléfono diario.
Del lado del kernel, validó Kernel Same-page Merging (KSM) y swap en
ZRAM. El framework pasó a matar procesos en caché que crecían demasiado y a
iniciar los servicios en segundo plano de uno en uno. system_server y
SystemUI se redujeron, y los nuevos ArrayMap y ArraySet reemplazaron a
HashMap y HashSet en buena parte del framework para ahorrar memoria. Con
ello llegaron dos herramientas: adb shell dumpsys procstats y la opción de
desarrollador “Process Stats”.
El CDD de 4.4 fija el mínimo en 340 MB de memoria para el kernel y el espacio
de usuario. Un dispositivo con menos de 512 MB debe devolver true en
ActivityManager.isLowRamDevice().
Qué perduró
- ART. Android 4.4 incluyó el Android Runtime, que compila antes de ejecutar, como experimento detrás de “Select runtime” en las opciones de desarrollador, con Dalvik como predeterminado. ART pasó a ser el runtime predeterminado en Android 5.0.
- SELinux pasó de la aplicación parcial a la total en Android 5.0: más de 60 dominios en lugar de unos pocos.
- El storage access framework sigue siendo la forma de abrir archivos del
usuario sin permiso de almacenamiento. Android 5.0 sumó
ACTION_OPEN_DOCUMENT_TREEpara carpetas completas. - Las alarmas exactas se endurecieron otra vez: las apps con target
Android 12 necesitan
SCHEDULE_EXACT_ALARMpara programarlas. - Los flags inmersivos quedaron obsoletos en la API 30, reemplazados por
WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE. - Play services dejó de actualizarse en KitKat en agosto de 2023. Google dijo que KitKat estaba por debajo del 1% de los dispositivos activos y que no recibiría ninguna versión de Play services posterior a la 23.30.99.
- Los parches de seguridad terminaron antes. El boletín de octubre de 2017 es el último que incluye 4.4.4 entre las versiones de AOSP actualizadas; desde noviembre de 2017 la más antigua es 5.0.2.
Para saber
- El nombre. Nestlé y Google anunciaron “Android KitKat” el 3 de septiembre de 2013, con más de 50 millones de barras KitKat con la marca en 19 mercados. Nestlé contó que muchos comentaristas esperaban “Key Lime Pie”. Los desarrolladores la seguían llamando “KLP” internamente. John Lagerling, director de alianzas globales de Android en Google, dijo a la BBC: “We realised that very few people actually know the taste of a key lime pie”, y que no era “a money-changing-hands kind of deal”.
- Comentarios en AOSP.
Build.javallama a la API 19 “KitKat, another tasty treat” y a la API 20 “KitKat for watches, snacks on the run.” - El Easter egg. Tocar tres veces “Android version” en About phone muestra
la primera letra del build ID, una K en builds como KRT16M, que gira con cada
toque. Una pulsación larga la convierte en el logo al estilo KitKat, y otra
abre un muro de postres en un proceso llamado
:sweetsweetdesserts. Su código marca el postre KitKat como “used with permission” y el de Key Lime Pie como “from an alternative timeline”. - Para la posteridad. La primera vez que se abre, Android guarda la hora en
Settings.System.EGG_MODE, bajo el comentario “For posterity: the moment this user unlocked the easter egg”. Si el Easter egg no logra abrirse, registra “Couldn’t catch a break.”