Abrufen von App-Speicherdetails über ADB

TL;DR:

Auf dem Gerät können wir zu Einstellungen › Apps navigieren und für jede App separat Details zum verwendeten Speicher abrufen: von der App selbst, von ihren Daten, von ihrem Cache. Ist es möglich, diese Details über die Befehlszeile zu erhalten, idealerweise über ADB – und ohne Root-Zugriff?

Im Detail:

Ich habe schon im Netz gesucht, aber keine Informationen dazu gefunden. Ich habe bereits versucht, die Paketliste ( pm list packages), den Pfad zur APK-Datei ( adb shell pm path $pkgname | awk -F':' '{print $2}') und die Dateigröße davon abzurufen ( adb shell stat $path | grep Size) – aber das hat eine Reihe von Nachteilen:

  • es gibt mir nur die Größe der APK (für aktualisierte System-Apps nur des neuesten Updates)
  • Selbst wenn es geskriptet ist, dauert es ~ 2 Sekunden pro App, um auch das zu erhalten. Da die heutigen Geräte bereits mit weit über 100 System-Apps ausgeliefert werden, würde es „ewig“ dauern, selbst wenn nur wenige Benutzer-Apps installiert wären (fast 6 Minuten auf einem fast jungfräulichen Wiko Sunny 3, wo ich das gerade ausprobiert habe).
  • Angaben zu Daten und Cache fehlen komplett

Idealerweise hat Android diese Details bereits irgendwo gesammelt; Über die GUI dauert es nicht so lange. Vielleicht gibt es eine Datenbank, die man ohne Root-Rechte abfragen könnte – oder etwas XML zum Parsen, oder einen Shell-Befehl, den ich übersehen habe?

PS: Wenn Sie eine reine Root-Lösung kennen, wäre das "besser als nichts". Bitte geben Sie dies in einem Kommentar an, damit ich zurückkommen und Sie bitten kann, darauf eine Antwort zu geben, wenn es keine Nicht-Root-Lösungen gibt.

Antworten (1)

Mein erster Instinkt, solche Informationen auszugraben, die oft über die Programmierroute verfügbar sind, besteht darin, die Dumps verschiedener Systemdienste zu durchsuchen. Ein solcher Dienst ist diskstats , dessen einziger Zweck darin besteht, den Status der Festplatte auszugeben. Als ich mir den Java-Code von DiskStatsService.java für verschiedene Android-Versionen ansah , bemerkte ich, dass die gesuchten Informationen seit Android Oreo verfügbar sind. Der Dump zeigt unter anderem alle Paketnamen, ihre Paketgrößen, ihre App-Datengröße und ihre Cache-Größen. Diese Informationen werden auch in die Datei /data/system/diskstats_cache.json abgelegt , auf diese Datei kann jedoch nicht ohne Root-Zugriff zugegriffen werden.

Der Dump ist ziemlich hässlich, also habe ich ein Bash-Skript geschrieben, um die Daten ordentlich anzuzeigen. Führen Sie dieses Skript in Ihrem Linux aus.

Hier ist das Skript (und es erfordert auch keinen Root-Zugriff):

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

# HINWEIS: Überprüfen Sie, ob ADB gut funktioniert oder nicht
adb shell dumpsys diskstats > "$F_DISK_STATS"

# Trennen von Daten in relevant benannte Dateien
sed -n '/Paketnamen:/p' "$F_DISK_STATS" | sed -e 's/,/\n/g' -e 's/"//g' -e 's/.*\[//g' -e 's/\].*//g' > "$F_PKG_NAMES"
sed -n '/App-Größen:/p' "$F_DISK_STATS" | sed -e 's/,/\n/g' -e 's/.*\[//g' -e 's/\].*//g' > "$F_PKG_SIZE"
sed -n '/App-Datengrößen:/p' "$F_DISK_STATS" | sed -e 's/,/\n/g' -e 's/.*\[//g' -e 's/\].*//g' > "$F_DAT_SIZE"
sed -n '/Cache-Größen:/p' "$F_DISK_STATS" | sed -e 's/,/\n/g' -e 's/.*\[//g' -e 's/\].*//g' > "$F_CACHE_SIZE"

# Drucken von Paketnamen und deren Größen
ttl_apps=$(wc -l "$F_PKG_NAMES" | cut -d ' ' -f1)
Anzahl = 1
while [ $count -le $ttl_apps ]; Tun
    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 "Paketname: $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));
Erledigt

Ausgabe beim Test auf OnePlus 6 (Android 9):

Paketname: org.xbmc.kodi
     Pkg_size=144297984 Bytes
     Data_size=55771136 Bytes
     Cache_size=54341632 Bytes
     Gesamtgröße = 254410752 Byte

Paketname: rikka.appops
     Pkg_size=10330112 Bytes
     Data_size=1740800 Byte
     Cache_size=163840 Bytes
     Gesamtgröße = 12234752 Byte

Paketname: com.a0soft.gphone.aSpotCat
     Pkg_size=16228352 Bytes
     Data_size=1101824 Bytes
     Cache_size=163840 Bytes
     Gesamtgröße = 17494016 Bytes
Das ist cool, danke & +1! Ich habe die Android-Version nicht angegeben – aber ich denke, ich kann mit dieser Einschränkung leben. Zu sagen, dass das viel schneller ist, ist definitiv eine Untertreibung LOL – 1,6 Sekunden für alle Apps in Summe! // Ich habe es gerade auf dem Wiko (Android Go 8.1) ausprobiert, im Dump fehlt dort leider die Zeile "App Data Sizes:". "Normales" 8.1 hat es in sich, gut. Und, Überraschung: mein Nougat-Gerät (7.1.1, LOS) hat das gleiche wie das Go, dh alle Daten ohne Data_size! Das war es, was dumpsysich gesucht und vermisst habe. Vielen Dank!
Ja, tut mir leid wegen Android Go. Ich habe keinen Zugriff auf ein Go-Gerät, daher konnte ich meine Lösung dort beim Testen nicht ausprobieren. Mir ist nicht einmal in den Sinn gekommen, dass es da draußen andere Android-Versionen als die große, aufgeblähte Mainstream-Version gibt. :D
Ich habe mich nicht beschwert :) Sogar das Go-Gerät kommt mit 160 vorinstallierten Apps. Und hey, das funktioniert sogar mit Nougat. adb shell dumpsys diskstatsBefehl ist sogar auf LP verfügbar, aber ohne die App-spezifischen Details in seiner Ausgabe (versucht auf einem alten Tablet, das ich hier habe), aber (noch) keine Idee für MM.
Die Schnittstelle dieses Befehls scheint ein bisschen schwierig zu sein. Warum zum Teufel sollten sie sich nicht für eine einfache Liste von Zeilen entscheiden, wie zum Beispiel: "appname",pkg_size,data_size,total_size ? Eine rethorische Frage :)