9 votes

Obtention des détails du stockage des applications via ADB

TL;DR :

Sur l'appareil, nous pouvons naviguer vers Paramètres ' Apps, et pour chaque application séparément, vous pouvez obtenir des détails sur le stockage utilisé : par l'application elle-même, par ses données, par son cache. Est-il possible d'obtenir ces détails à partir de la ligne de commande, idéalement par le biais d'ADB ? sans avoir l'accès Root ?

En détail :

J'ai déjà fait des recherches sur le web, mais je n'ai trouvé aucune information à ce sujet. J'ai déjà essayé de parcourir la liste des paquets ( pm list packages ), obtenir le chemin vers le fichier APK ( adb shell pm path $pkgname | awk -F':' '{print $2}' ), et obtenir la taille de ce fichier ( adb shell stat $path | grep Size ) - mais cela présente une série d'inconvénients :

  • il me donne seulement la taille de l'APK (pour les applications système mises à jour, seulement de la dernière mise à jour)
  • même si c'est un script, il faut ~2s par application pour obtenir même ça. Comme les appareils d'aujourd'hui sont déjà livrés avec plus de 100 applications système, cela prendrait une éternité même si seulement quelques applications utilisateur étaient installées (presque 6 minutes sur un Wiko Sunny 3 presque vierge où je viens d'essayer).
  • les détails sur les données et le cache sont complètement absents

Idéalement, Android a déjà recueilli ces détails quelque part ; cela ne prend pas beaucoup de temps via l'interface graphique. Il existe peut-être une base de données que l'on peut interroger. sans avoir les privilèges de Root - ou un XML à analyser, ou une commande shell que j'ai manquée ?

PS : si vous connaissez une solution uniquement basée sur la racine, ce serait "mieux que rien". Veuillez l'indiquer dans un commentaire afin que je puisse revenir et vous demander d'en faire une réponse s'il n'y a pas de solution non-Root.

10voto

Firelord Points 23064

Mon premier réflexe pour trouver ce genre d'informations, qui sont souvent disponibles par la voie de la programmation, est de parcourir les vidages de divers services système. L'un de ces services est diskstats dont le seul but est de vider l'état du disque. En regardant dans le code java de DiskStatsService.java pour différentes versions d'Android, j'ai remarqué que les informations que vous recherchez sont disponibles depuis Android Oreo. Entre autres choses, le vidage indique tous les noms des paquets, leur taille, la taille des données de l'application et la taille de leur cache. Ces informations sont également placées dans le fichier /data/system/diskstats_cache.json mais ce fichier n'est pas accessible sans l'accès Root.

La décharge est jolie laid J'ai donc écrit un script bash pour afficher les données proprement. Exécutez ce script dans votre Linux.

Voici le script (et il ne nécessite pas non plus d'accès Root) :

#!/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

Sortie lors du test sur 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

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X