Obtención de detalles de almacenamiento de aplicaciones a través de ADB

TL;RD:

En el dispositivo, podemos navegar a Configuración › Aplicaciones, y para cada aplicación por separado podemos obtener detalles sobre el almacenamiento utilizado: por la aplicación en sí, por sus datos, por su caché. ¿Es posible obtener esos detalles desde la línea de comandos, idealmente a través de ADB, y sin tener acceso a la raíz?

En detalle:

Ya he buscado en la web, pero no encontré información al respecto. Ya intenté recorrer la lista de paquetes ( pm list packages), obtener la ruta al archivo APK ( adb shell pm path $pkgname | awk -F':' '{print $2}') y obtener el tamaño del archivo ( adb shell stat $path | grep Size), pero eso tiene una serie de desventajas:

  • solo me da el tamaño del APK (para apps de sistema actualizadas, solo de la última actualización)
  • incluso si está programado, se necesitan ~ 2 segundos por aplicación para obtener incluso eso. Como los dispositivos actuales ya se envían con más de 100 aplicaciones del sistema, tomaría "años" incluso si solo se instalaran unas pocas aplicaciones de usuario (casi 6 minutos en un Wiko Sunny 3 casi virgen donde acabo de probar eso)
  • faltan detalles sobre datos y caché

Idealmente, Android ya ha recopilado esos detalles en alguna parte; no lleva tanto tiempo a través de la GUI. ¿Tal vez hay alguna base de datos que uno podría consultar sin tener privilegios de root , o algún XML para analizar, o algún comando de shell que me perdí?

PD: si conoce una solución solo para root, sería "mejor que nada". Indique eso en un comentario para que pueda volver y pedirle que responda si no hay soluciones no raíz.

Respuestas (1)

Mi primer instinto para extraer dicha información, que a menudo está disponible a través de la ruta de programación, es revisar los volcados de varios servicios del sistema. Uno de esos servicios es diskstats , cuyo único propósito es volcar el estado del disco. Al examinar el código java de DiskStatsService.java para varias versiones de Android, noté que la información que está buscando está disponible desde Android Oreo. Entre otras cosas, el volcado muestra todos los nombres de los paquetes, sus tamaños de paquete, el tamaño de los datos de su aplicación y sus tamaños de caché. Esa información también se descarga en el archivo /data/system/diskstats_cache.json , pero no se puede acceder a este archivo sin acceso de root.

El volcado es bastante feo, así que escribí un script bash para mostrar los datos de forma clara. Ejecute este script en su Linux.

Aquí está el script (y tampoco requiere acceso de root):

#!/bin/bash

USRDIR="$INICIO"
F_DISK_STATS="$USRDIR"/diskstats.txt
F_PKG_NAMES="$USRDIR"/nombres_paquete.txt
F_PKG_SIZE="$USRDIR"/app_pkg_sizes.txt
F_DAT_SIZE="$USRDIR"/app_data_sizes.txt
F_CACHE_SIZE="$USRDIR"/app_cache_sizes.txt

# CONSEJO: verifique si ADB funciona bien o no
adb shell dumpsys diskstats > "$F_DISK_STATS"

# Separación de datos en archivos con nombres relevantes
sed -n '/Nombres de paquetes:/p' "$F_DISK_STATS" | sed -e 's/,/\n/g' -e 's/"//g' -e 's/.*\[//g' -e 's/\].*//g' > "$F_PKG_NAMES"
sed -n '/Tamaños de aplicación:/p' "$F_DISK_STATS" | sed -e 's/,/\n/g' -e 's/.*\[//g' -e 's/\].*//g' > "$F_PKG_SIZE"
sed -n '/Tamaños de datos de la aplicación:/p' "$F_DISK_STATS" | sed -e 's/,/\n/g' -e 's/.*\[//g' -e 's/\].*//g' > "$F_DAT_SIZE"
sed -n '/Tamaños de caché:/p' "$F_DISK_STATS" | sed -e 's/,/\n/g' -e 's/.*\[//g' -e 's/\].*//g' > "$F_CACHE_SIZE"

# Imprimir nombres de paquetes y sus tamaños
ttl_apps=$(wc -l "$F_PKG_NAMES" | cut -d ' ' -f1)
cuenta=1
while [ $contar -le $ttl_apps ]; hacer
    paquete=$(sed -n "${contar}p" "$F_PKG_NAMES")
    pkg_size=$(sed -n "${count}p" "$F_PKG_SIZE")
    dat_size=$(sed -n "${count}p" "$F_DAT_SIZE")
    csh_size=$(sed -n "${count}p" "$F_CACHE_SIZE")
    echo -e "Nombre del paquete: $paquete"
    echo -e "\t Pkg_size=$pkg_size bytes"
    echo -e "\t Data_size=$dat_size bytes"
    echo -e "\t Cache_size=$csh_size bytes"
    echo -e "\t Total_size=$(($pkg_size + $dat_size + $csh_size)) bytes\n"
    cuenta=$(( $cuenta + 1));
hecho

Salida cuando se prueba en OnePlus 6 (Android 9):

Nombre del paquete: org.xbmc.kodi
     Pkg_size=144297984 bytes
     Tamaño_datos=55771136 bytes
     Cache_size=54341632 bytes
     Tamaño_total=254410752 bytes

Nombre del paquete: rikka.appops
     Pkg_size=10330112 bytes
     Tamaño_datos=1740800 bytes
     Cache_size=163840 bytes
     Tamaño_total=12234752 bytes

Nombre del paquete: com.a0soft.gphone.aSpotCat
     Pkg_size=16228352 bytes
     Tamaño_datos=1101824 bytes
     Cache_size=163840 bytes
     Tamaño_total=17494016 bytes
Eso es genial, gracias y +1! No especifiqué la versión de Android, pero supongo que puedo vivir con esa limitación. Decir que es mucho más rápido definitivamente es un eufemismo LOL : ¡1.6 segundos para todas las aplicaciones en total! // Acabo de probarlo en Wiko (Android Go 8.1), el volcado carece de la línea "App Data Sizes:" desafortunadamente. "Normal" 8.1 lo tiene, bien. Y, sorpresa: mi dispositivo Nougat (7.1.1, LOS) tiene lo mismo que el Go, es decir, ¡todos los datos sin Data_size! Ese era el que dumpsysestaba buscando y me perdí. ¡Muchas gracias!
Sí, lo siento por Android Go. No tengo acceso a ningún dispositivo Go, por lo que no pude probar mi solución allí cuando la probé. Ni siquiera se me pasó por la cabeza que hay versiones de Android que no sean la principal, grande e inflada. :D
No me quejaba :) Incluso el dispositivo Go viene con 160 aplicaciones preinstaladas. Y oye, esto incluso funciona en Nougat. adb shell dumpsys diskstatsEl comando está disponible incluso en LP pero sin los detalles específicos de la aplicación en su salida (probado en una tableta antigua que tengo aquí), pero no tengo idea (todavía) para MM.
La interfaz de ese comando parece un poco difícil. ¿Por qué diablos no buscarían una lista simple de líneas como: "appname",pkg_size,data_size,total_size ? Una pregunta retorica :)