8 votos

Obtención de los detalles de almacenamiento de la aplicación a través de ADB

TL;DR:

En el dispositivo, podemos navegar a Ajustes ' Aplicaciones, y para cada aplicación por separado puede llamar a los detalles sobre el almacenamiento utilizado: por la propia aplicación, 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 root?

En detalle:

Ya he buscado en la web, pero no he encontrado información al respecto. Ya he intentado recorrer la lista de paquetes ( pm list packages ), obteniendo la ruta del 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:

  • sólo me da el tamaño del APK (para aplicaciones de sistema actualizadas, sólo de la última actualización)
  • incluso si se hace con guión, se tarda ~2s por aplicación para obtener incluso eso. Como los dispositivos de hoy en día ya vienen con mucho más de 100 aplicaciones de sistema, tardaría "siglos" incluso si sólo se instalaran unas pocas aplicaciones de usuario (casi 6 minutos en un Wiko Sunny 3 casi virgen en el que acabo de probar eso)
  • los detalles sobre los datos y el caché faltan por completo

En el mejor de los casos, Android ya ha recogido esos datos en algún lugar; no se tarda tanto en hacerlo a través de la interfaz gráfica de usuario. Quizá haya alguna base de datos que se pueda consultar sin tener privilegios de Root - o algún XML para analizar, o algún comando del shell que me he perdido?

PS: si sabes de una solución sólo Root, eso sería "mejor que nada". Por favor, indícalo en un comentario entonces para que pueda volver y pedirte que hagas esa respuesta si no hay soluciones no Root.

10voto

Firelord Puntos 161

Mi primer instinto para desenterrar esa 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 estos servicios es diskstats cuyo único propósito es volcar el estado del disco. Buscando en el código java de DiskStatsService.java para varias versiones de Android, me he dado cuenta de que la información que buscas está disponible desde Android Oreo. Entre otras cosas, el volcado muestra todos los nombres de los paquetes, su tamaño, el tamaño de los datos de la app y el tamaño de la caché. Esa información también se vuelca en el archivo /data/system/diskstats_cache.json pero no se puede acceder a este archivo sin acceso a root.

El vertedero es bastante feo así que escribí un bash script para mostrar los datos de forma ordenada. Ejecuta este script en tu Linux.

Aquí está el script (y no requiere acceso Root también):

#!/bin/bash

USRDIR="$HOME"
F\_DISK\_STATS="$USRDIR"/diskstats.txt
F\_PKG\_NAMES="$USRDIR"/package\_names.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

# ADVISE: do a check whether ADB is working fine or not
adb shell dumpsys diskstats > "$F\_DISK\_STATS"

# Separating data into relevant named files
sed -n '/Package Names:/p' "$F\_DISK\_STATS" | sed -e 's/,/\\n/g' -e 's/"//g' -e 's/.\*\\\[//g' -e 's/\\\].\*//g' > "$F\_PKG\_NAMES"
sed -n '/App Sizes:/p' "$F\_DISK\_STATS" | sed -e 's/,/\\n/g' -e 's/.\*\\\[//g' -e 's/\\\].\*//g' > "$F\_PKG\_SIZE"
sed -n '/App Data Sizes:/p' "$F\_DISK\_STATS" | sed -e 's/,/\\n/g' -e 's/.\*\\\[//g' -e 's/\\\].\*//g' > "$F\_DAT\_SIZE"
sed -n '/Cache Sizes:/p' "$F\_DISK\_STATS" | sed -e 's/,/\\n/g' -e 's/.\*\\\[//g' -e 's/\\\].\*//g' > "$F\_CACHE\_SIZE"

# Printing package names and their sizes 
ttl\_apps=$(wc -l "$F\_PKG\_NAMES" | cut -d ' ' -f1)
count=1
while \[ $count -le $ttl\_apps \]; do 
    pkg=$(sed -n "${count}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 "Pkg Name: $pkg" 
    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"
    count=$(( $count + 1)); 
done

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

Pkg Name: org.xbmc.kodi
     Pkg\_size=144297984 bytes
     Data\_size=55771136 bytes
     Cache\_size=54341632 bytes
     Total\_size=254410752 bytes

Pkg Name: rikka.appops
     Pkg\_size=10330112 bytes
     Data\_size=1740800 bytes
     Cache\_size=163840 bytes
     Total\_size=12234752 bytes

Pkg Name: com.a0soft.gphone.aSpotCat
     Pkg\_size=16228352 bytes
     Data\_size=1101824 bytes
     Cache\_size=163840 bytes
     Total\_size=17494016 bytes

1 votos

¡Eso es genial, gracias y +1! No he especificado 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,6s para todo ¡aplicaciones en suma! // Acabo de probarlo en el Wiko (Android Go 8.1), el volcado carece de la línea "App Data Sizes:" allí por desgracia. "Normal" 8.1 lo tiene, bueno. ¡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 dumpsys que buscaba y que se me escapó. Muchas gracias.

0 votos

Sí, siento lo de Android Go. No tengo acceso a ningún dispositivo Go, así que no pude probar mi solución allí al probarla. Ni siquiera se me pasó por la cabeza que hay versiones de Android por ahí que no sea la corriente principal grande hinchada. :D

0 votos

No me quejo :) Incluso el dispositivo Go viene con 160 apps preinstaladas. Y oye, esto funciona incluso en Nougat. adb shell dumpsys diskstats está disponible incluso en LP pero sin los detalles específicos de la aplicación en su salida (probado en una vieja tablet que tengo aquí), pero ni idea (todavía) para MM.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X