was passiert denn, wenn Du nur adb shell pm list packages eingibst? Kommt dabei eine Liste der Pakete? Möglicherweise funktioniert die adb-Verbindung nicht richtig, so dass beide Kommandos ein leeres Ergebnis liefern.
Alternativ könnte es sein, dass die Pakete gar nicht deinstalliert wurden, sondern nur deaktiviert. Die solltest Du mit adb shell pm list packages -d sehen können.
Kann man denn überhaupt so die Ausgabe beider Befehle direkt miteinander vergleichen? Der Befehl „diff“ vergleicht eigentlich nur Dateien miteinander, aber nicht Befehlsausgaben. Laut „man diff“: Compare FILES line by line.
Daher ist meine Idee, die Outputs beider Befehle je in einer Datei zu speichern und diese dann vergleichen:
adb shell pm list packages > Datei1
adb shell pm list packages -u > Datei2
diff Datei1 Datei2
Edit:
Die Ausgabe von pm in eine Datei funktioniert offensichtlich nicht mit „>“, sondern nur mit „tee“:
adb shell pm list packages | tee Datei1
adb shell pm list packages -u | tee Datei2
Ja, das geht, probiere beispielsweise mal folgendes:
diff <(ls -l / ) <(ls -la / )
Damit siehst Du z.B. den Unterschied von einem Listing mit bzw. ohne versteckte Dateien. Ich meine, dass <() so eine Art FIFO mit dem Output des Kommandos erzeugt, was dann wie eine Datei gelesen werden kann.
Das nennt sich process substitution und wird nicht von jeder Shell unterstützt.
Deshalb ist @klaus9987 Lösung in meinen Augen am besten, weil man dann auch den Out- und Input sehen kann.
Achso: Nur weil diff auf vielen Unix-Systemen vorhanden ist, ist es nicht dasselbe Programm. Das siehst du dann spätestens, wenn ein Parameter auf dem einen System funktioniert, aber auf dem nächsten nicht. Es könnte sich nur um eine neuere Version oder gar um ein ganz anderes Programm handeln, das zum Beispiel wegen der Lizenz erneut geschrieben worden ist.
War dann ja gar nicht so falsch mit dem FIFO. Die Seite sagt folgendes:
Under the hood, process substitution has two implementations. On systems which support /dev/fd (most Unix-like systems) it works by calling the pipe() system call, which returns a file descriptor $fd for a new anonymous pipe, then creating the string /dev/fd/$fd, and substitutes that on the command line. On systems without /dev/fd support, it calls mkfifo with a new temporary filename to create a named pipe, and substitutes this filename on the command line.
Deswegen hatte ich anfangs gefragt, ob ein adb shell pm list packages überhaupt ein Ergebnis liefert.
Du hattest ja gefragt, ob „man denn überhaupt so die Ausgabe beider Befehle direkt miteinander vergleichen“ kann. Und abgesehen von Shells die das nicht können ist die Antwort ja. Und das auch, wenn eines der Kommandos keine Antwortzeile liefert.
Beispiel:
mint@mint:~$ adb shell pm list packages -d
mint@mint:~$
mint@mint:~$ adb shell pm list packages | tee Datei1
mint@mint:~$ adb shell pm list packages -u | tee Datei2
mint@mint:~$ ls -li
total 16
424 -rw-rw-r-- 1 mint mint 4404 march 11 19:02 Datei1
817 -rw-rw-r-- 1 mint mint 4404 march 11 19:11 Datei2
33498 drwxr-xr-x 2 mint mint 60 march 11 18:51 Desktop
33506 drwxr-xr-x 2 mint mint 40 march 11 18:52 Documents
33521 drwxr-xr-x 2 mint mint 40 march 11 18:52 Images
33519 drwxr-xr-x 2 mint mint 40 march 11 18:52 Music
33504 drwxr-xr-x 2 mint mint 40 march 11 18:52 Public
33500 drwxr-xr-x 2 mint mint 40 march 11 18:52 Downloads
33523 drwxr-xr-x 2 mint mint 40 march 11 18:52 Videos
mint@mint:~$ diff Datei1 Datei2
mint@mint:~$
mint@mint:~$ diff <(adb shell pm list packages / ) <(adb shell pm list packages -u / )
mint@mint:~$
Hm, das sieht für mich so aus, als ob beide Kommandos einen Output liefern, der aber identisch ist. Die Dateigröße ist mit 4404 Byte jeweils gleich groß und ein diff Datei1 Datei2 gibt bei Dir ein leeres Ergebnis.
Ich habe den Befehl, der den Vergleich in einem Statement macht, gerade mal auf meinem alten Tablet (ebenfalls Android 7) ausprobiert. (Da darf am Ende kein / sein, das hatte ich nur exemplarisch mit dem ls gemacht, so dass da einige unkritische Dateien kommen.)
Auf meinem Tablet hatte ich tatsächlich Apps gelöscht, so dass ich da auch ein Ergebnis bekomme:
$ diff <(adb shell pm list packages) <(adb shell pm list packages -u)
7a8,9
> package:com.google.android.youtube
[...]
(Ich hab die Ausgabe auf ein gelöschtes Paket begrenzt, da erscheinen noch weitere.)
Meine Schlussfolgerung wäre, dass es keine deinstallierten Pakete auf Deinem Handy gibt, @ralph. Zumindest lassen sie sich so nicht über adb finden, obwohl es generell auch mit (m)einem Android 7 (Tablet) möglich ist.
Hier ist noch zu sehen, dass die App „Package:io.github.muntashirakon.AppManager“ tatsaechlich einmal installiert war und danach mit ADP effektiv deinstalliert wurde.
.
mint@mint:~$ adb shell pm list packages
..
package:com.android.inputmethod.latin
package:io.github.muntashirakon.AppManager
package:com.android.managedprovisioning
package:com.android.dreams.phototable
..
..
mint@mint:~$ adb uninstall io.github.muntashirakon.AppManager
Success
mint@mint:~$ adb shell pm list packages
..
package:com.android.inputmethod.latin
package:com.android.managedprovisioning
package:com.android.dreams.phototable
..
..
mint@mint:~$ adb shell pm list packages | tee Datei1
mint@mint:~$ adb shell pm list packages -u | tee Datei2
mint@mint:~$ diff <(adb shell pm list packages) <(adb shell pm list packages -u)
mint@mint:~$
Youtube war eine App, die bei dem Android schon mit dabei war und die ohne root nicht wirklich entfernt werden kann. Mit dem pm uninstall -k --user 0 $app wird eine Anwendung glaube ich nicht wirklich vom System entfernt, sondern nur für den User ausgeblendet.
Vielleicht können tatsächlich und komplett entfernte Apps auch mit adb shell pm list packages -u nicht mehr angezeigt werden?
Zuerst: Die Option „-k“ (keep the data and cache directories around after package removal) würde ich weglassen. Denn damit werden Daten/Cache beibehalten (s. pm --help).
Android Apps - sowohl System als auch Benutzer - werden folgendermaßen installiert:
*.apk => /data/app/PACKAGE
Appdaten => /data/user/0/PACKAGE
(wobei /data/user/0 ein Symlink ist, der zu /data/data führt!)
Der genannte ADB-Befehl ruft den Package Manager (pm) auf, der zur Verwaltung installierter Apps dient.
Mithilfe des pm wird dann festgelegt, dass das deklarierte Package keine Appdaten im Verzeichnis von user_0 ablegen darf und vorhandene Daten gelöscht werden sollen, sofern man die Option „-k“ nicht verwendet.
Also wird verhindert, dass unter /data/user/0 Daten für diese App angelegt werden, was einer Deinstallation ähnlich ist. Andereseits bleibt aber die APK unter /data/app weiterhin erhalten. Dies muss so sein, damit andere User, die nicht user_0 sind, die App nutzen können.
Wird nun der Befehl pm list packages ausgeführt, werden alle Packages gelistet, die sich in /data/app befinden und nicht nur jene, die in /data/user/0 zu finden sind. Es gibt für den pm keinen Grund, nur die Apps für user_0 zu listen, weil im Befehl keine Einschränkung diesbezüglich gemacht wird.