Los dispositivos Nexus y Pixel migrar a SDCardFS en Android O
Cada nueva versión de Android vienen con muchas características interesantes. Android O traerá canales de notificación, Autofill Framework para administradores de contraseñas, modo Picture-in-Picture para teléfonos, iconos adaptativos y más. Las características que he enumerado son sólo algunos de los cambios introducidos en Android O, pero hay muchas características que Google elige no dar a conocer, algunos sutiles y algunos no tan sutil, que sin embargo son bienvenidos adiciones a la experiencia de Google Android. A pesar de que es probable que finalmente se encuentran con algunas de las adiciones más sutiles características para el software de Android, que como usuario final, probablemente no saben acerca de muchos de los cambios realizados bajo el capó, como el kernel. Después de buscar algo en la Vista previa de desarrolladores de Android, descubrimos que SDCardFS, el reemplazo de FUSE en el núcleo para emular permisos de directorio de estilo FAT-on-sdcard, ahora está en uso.
Los beneficios de SDCardFS, esencialmente es un movimiento que debería reducir significativamente la sobrecarga de E/S en las operaciones realizadas en el almacenamiento externo, eliminar el caché doble del caché de páginas y elimina errores en la transferencia de archivos al PC.
Hemos descubierto este cambio comparando la salida de un comando de montaje en un Google Píxel (sailfish) con Android 7.1.2 Nougat y la primera Android O Developer Preview.
Salida del comando mount en Android 7.1.2 Nought:
rootfs on / type rootfs (ro,seclabel)
tmpfs on /dev type tmpfs (rw,seclabel,nosuid,relatime,size=1902076k,nr_inodes=475519,mode=755)
devpts on /dev/pts type devpts (rw,seclabel,relatime,mode=600)
proc on /proc type proc (rw,relatime,gid=3009,hidepid=2)
sysfs on /sys type sysfs (rw,seclabel,relatime)
selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,seclabel,relatime)
none on /acct type cgroup (rw,relatime,cpuacct)
none on /dev/stune type cgroup (rw,relatime,schedtune)
tmpfs on /mnt type tmpfs (rw,seclabel,relatime,size=1902076k,nr_inodes=475519,mode=755,gid=1000)
none on /config type configfs (rw,relatime)
none on /dev/cpuctl type cgroup (rw,relatime,cpu)
none on /dev/cpuset type cgroup (rw,relatime,cpuset,noprefix,release_agent=/sbin/cpuset_release_agent)
pstore on /sys/fs/pstore type pstore (rw,seclabel,relatime)
/dev/block/bootdevice/by-name/system_b on /system_root type ext4 (ro,seclabel,noatime,discard,data=ordered)
/dev/block/bootdevice/by-name/vendor_b on /vendor type ext4 (ro,seclabel,noatime,discard,data=ordered)
/dev/block/bootdevice/by-name/modem_b on /firmware/radio type vfat (ro,context=u:object_r:firmware_file:s0,noatime,uid=1000,fmask=0337,dmask=0227,codepage=437,iocharset=iso8859-1,shortname=lower,errors=remount-ro)
/dev/block/bootdevice/by-name/system_b on /system type ext4 (ro,seclabel,noatime,discard,data=ordered)
/dev/block/bootdevice/by-name/persist on /persist type ext4 (rw,seclabel,nosuid,nodev,relatime,data=ordered)
tmpfs on /storage type tmpfs (rw,seclabel,relatime,size=1902076k,nr_inodes=475519,mode=755,gid=1000)
adb on /dev/usb-ffs/adb type functionfs (rw,relatime)
/dev/block/bootdevice/by-name/userdata on /data type ext4 (rw,seclabel,nosuid,nodev,noatime,noauto_da_alloc,data=ordered)
/dev/block/loop0 on /su type ext4 (rw,seclabel,noatime,data=ordered)
/dev/block/loop0 on /system/xbin/su type ext4 (rw,seclabel,noatime,data=ordered)
Salida del comando mount en Android O Developer Preview:
rootfs on / type rootfs (rw,seclabel)
/dev/root on / type ext4 (ro,seclabel,relatime,data=ordered)
tmpfs on /dev type tmpfs (rw,seclabel,nosuid,relatime,size=1897196k,nr_inodes=474299,mode=755)
devpts on /dev/pts type devpts (rw,seclabel,relatime,mode=600)
proc on /proc type proc (rw,relatime,gid=3009,hidepid=2)
sysfs on /sys type sysfs (rw,seclabel,relatime)
selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,seclabel,relatime)
none on /acct type cgroup (rw,relatime,cpuacct)
none on /dev/stune type cgroup (rw,relatime,schedtune)
tmpfs on /mnt type tmpfs (rw,seclabel,relatime,size=1897196k,nr_inodes=474299,mode=755,gid=1000)
none on /config type configfs (rw,relatime)
none on /dev/cpuctl type cgroup (rw,relatime,cpu)
none on /dev/cpuset type cgroup (rw,relatime,cpuset,noprefix,release_agent=/sbin/cpuset_release_agent)
pstore on /sys/fs/pstore type pstore (rw,seclabel,relatime)
/dev/block/dm-1 on /vendor type ext4 (ro,seclabel,relatime,data=ordered)
/dev/block/sda25 on /firmware/radio type vfat (ro,context=u:object_r:firmware_file:s0,relatime,uid=1000,fmask=0337,dmask=0227,codepage=437,iocharset=iso8859-1,shortname=lower,errors=remount-ro)
/dev/block/sdd3 on /persist type ext4 (rw,seclabel,nosuid,nodev,noatime,data=ordered)
tmpfs on /storage type tmpfs (rw,seclabel,relatime,size=1897196k,nr_inodes=474299,mode=755,gid=1000)
tracefs on /sys/kernel/debug/tracing type tracefs (rw,seclabel,relatime)
adb on /dev/usb-ffs/adb type functionfs (rw,relatime)
mtp on /dev/usb-ffs/mtp type functionfs (rw,relatime)
/dev/block/sda35 on /data type ext4 (rw,seclabel,nosuid,nodev,noatime,noauto_da_alloc,data=ordered)
/data/media on /mnt/runtime/default/emulated type sdcardfs (rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=1015,multiuser,mask=6)
/data/media on /storage/emulated type sdcardfs (rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=1015,multiuser,mask=6)
/data/media on /mnt/runtime/read/emulated type sdcardfs (rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=9997,multiuser,mask=23)
/data/media on /mnt/runtime/write/emulated type sdcardfs (rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=9997,multiuser,mask=7)
Como se puede ver en los archivos de salida, /storage/emulated ahora está lo esta montando como “sdcardfs” que anteriormente no lo hacia así el caso en Android Nougat. Aunque no lo he confirmado yo mismo, el desarrollador de Moonlight Game Streaming, Miembro Senior de XDA cgutman, comentó sobre una reciente publicación de Google+ que su angler (Google Nexus 6P) también está usando sdcardfs para /storage/ mulated.
No estamos sorprendidos de ver este cambio de núcleo venir a Android O. Después de todo, los Googlers que estaban en el podcast de Android Developers Backstage que habló sobre este cambio mencionó que este proyecto fue uno de sus próximos cambios más grandes que ha llegado a la próxima versión de Android. Este cambio, aunque probablemente no es algo que el usuario promedio se nota, es algo más que añadir a la lista de cambios sutiles, pero en última instancia, es importante para Android. Aunque para ser justos, otros dispositivos de la talla de Samsung (que desarrolló SDCardFS en primer lugar), Huawei y OnePlus, entre otros, ya están utilizando SDCardFS en lugar de FUSE, así que supongo que es más exacto decir que Google está jugando a ponerse al día.