<CarlosDev/>

Actual

Android 4.4 KitKat: Android en 512 MB

API 19, octubre de 2013. Project Svelte hizo caber Android en 512 MB de RAM, las apps recibieron el storage access framework y emulación de tarjetas NFC, y SELinux pasó a bloquear.

Publicado
Lectura
11 min
Redacción
Estable
Serie
Parte 2 de 19 · Android, versión por versión
Banner de Android 4.4 KitKat, con el logo de la versión.
En este registro7 secciones

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ónAndroid 4.4 (4.4W para relojes)
Nivel de API19 (20 para 4.4W)
NombreKitKat, público
Build.VERSION_CODESKITKAT (KITKAT_WATCH)
SDKRevisión 1 de la plataforma, octubre de 2013; anunciado el 31 de octubre de 2013
Lanzamiento31 de octubre de 2013, con el Nexus 5
Dispositivo de lanzamientoNexus 5 (LG)
Plazo de target API en Google PlayNinguno. 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

La pantalla de inicio del Nexus 5 con Android 4.4.2: la barra de estado y la de navegación dejan ver el fondo, los iconos de estado son blancos y Hangouts está en el dock
El Nexus 5 con Android 4.4.2. La barra de estado y la de navegación son translúcidas, y los iconos de estado son blancos. Wikimedia Commons · Apache 2.0
  • 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_DOCUMENT o ACTION_CREATE_DOCUMENT; los servicios de almacenamiento heredan de DocumentsProvider e implementan queryRoots(), queryChildDocuments(), queryDocument() y openDocument().
  • Impresión. android.print y android.printservice. Una app hereda de PrintDocumentAdapter, dibuja las páginas en un PdfDocument y llama a PrintManager.print(). Los fabricantes de impresoras publican un PrintService.
  • 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_IMMERSIVE y SYSTEM_UI_FLAG_IMMERSIVE_STICKY ocultan 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, o windowTranslucentStatus y windowTranslucentNavigation.
  • WebView con Chromium. WebView pasó a una implementación basada en Chromium, con evaluateJavascript() y depuración remota mediante WebView.setWebContentsDebuggingEnabled().
  • App de SMS predeterminada. El usuario elige una “Default SMS app” en Settings. Solo esa app recibe SMS_DELIVER_ACTION y 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_HOME preferida. 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 screenrecord graba 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, netd y vold, 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_SOURCE nivel 2.
  • Escritura de SMS. Solo la app de SMS predeterminada puede escribir en el proveedor de SMS. SMS_RECEIVED_ACTION pasa 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.

sí no principal secundario, como una tarjeta SD o La app necesita un archivo del almacenamiento externo ¿Está en su carpeta Android/data/paquete? Lee y escribe sin permiso ¿Qué volumen? READ_EXTERNAL_STORAGE para leer, WRITE_EXTERNAL_STORAGE para escribir Lee con READ_EXTERNAL_STORAGE; escribir requiere WRITE_MEDIA_STORAGE, solo apps del sistema ACTION_OPEN_DOCUMENT: el usuario elige el archivo, sin permiso
  • La lectura se aplica. READ_EXTERNAL_STORAGE existía desde la API 16, pero no se aplicaba. Desde la API 19, una app sin él no puede leer archivos compartidos. En el platform.xml de AOSP, WRITE_EXTERNAL_STORAGE incluye 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 permiso signature|system que las apps de terceros no pueden obtener.
  • Nuevos. TRANSMIT_IR (normal), más los permisos de launcher INSTALL_SHORTCUT y UNINSTALL_SHORTCUT como 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

CambioQué hacer
El almacenamiento externo compartido requiere READ_EXTERNAL_STORAGEDecláralo si lees archivos fuera de tu propia carpeta
Las apps no pueden escribir en el almacenamiento secundarioEscribe 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 SMSDeclara 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 ChromiumPrueba tu contenido web; las apps con target API 18 o menor corren en un “quirks mode”
Existen dispositivos con poca RAMConsulta ActivityManager.isLowRamDevice() y apaga las funciones que consumen mucha memoria
La action bar siempre muestra su botón de overflowCuenta 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

CambioQué hacer
AlarmManager.set() y setRepeating() son inexactas y se agrupanUsa setExact() para una hora precisa y setWindow() para un rango
addPeriodicSync() usa un margen de cerca del 4% del períodoUsa requestSync() con SyncRequest.Builder para fijar el tuyo
PreferenceActivity.isValidFragment() lanza una excepción si no se sobrescribeSobrescríbelo y acepta solo tus propias clases de fragment
Una URL javascript: en WebView reemplaza la página con su resultadoEjecuta scripts con evaluateJavascript()
getSharedPreferences() rechaza un nombre nullPasa un nombre
Las carpetas de la app en el almacenamiento externo no requieren permisoDeja 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_TREE para carpetas completas.
  • Las alarmas exactas se endurecieron otra vez: las apps con target Android 12 necesitan SCHEDULE_EXACT_ALARM para 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.java llama 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.”

Clasificado en

Citas

48

Referencias externas