List uninstalled packages über ADB

Hallo,

ich moechte die unistallierten (-u) Pakete eines aelteren Mobiles (LOS 14.1 = Android 7.1) anzeigen. Verbindung zum Linux-Rechner via USB/ADB.

Auf android.stackexchange.com (siehe URL unter PS2) habe ich gelesen, dass -u „also includes uninstalled packages“. Deshalb die Sache mit ‚diff‘

Mit diesem Kommando habe ich es versucht:
mint@mint:~$ diff <(adb shell pm list packages) <(adb shell pm list packages -u)

[Leider wir wird gar nichts angezeigt/auf dem Bildschirm ausgegeben…]

Frage:
Was ist falsch mit diesem Kommando?

Vielen Dank im Voraus fuer jede Rueckmeldung!

PS 1:
Ich glaube das Kommando ‚shell pm list packages‘ hat irgendwann einmal geaendert (neuer als Andorid 7 ? )

PS 2:
ttps://android.stackexchange.com/questions/226964/how-to-list-system-packages-uninstalled-for-a-user-via-adb

Schau dir mal App Manager an. Der hat ein „Uninstalled Apps“ Anzeige Filter.
https://f-droid.org/packages/io.github.muntashirakon.AppManager/

1 „Gefällt mir“

Hallo ralph,

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

1 „Gefällt mir“

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.

Der Output des Befehls ist ja min. 1 Datei. Darum funktioniert das.

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.

Und zu @klaus9987 Kommentar:

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:

 diff <(ls -l / ) <(ls -la /this_file_does_not_exist )
1 „Gefällt mir“

Vielen Dank euch allen. Leider hat ich wohl nicht genuegend Infos geliefert, was ich aber mit diesem Post aber nachholen moechte:

Danke im Voraus fuer jede weitere Hilfe!



mint@mint:~$ adb shell pm list packages
package:com.android.fmradio
package:com.android.cts.priv.ctsshim
package:ca.cmetcalfe.locationshare
package:com.android.providers.telephony
package:org.cyanogenmod.snap
..
..
..

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.

Das toent sehr plausibel. Danke fuer die Hilfe!

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:~$

Ich glaube ich hatte bei mir youtube in Ermanglung von root-Rechten nur für den Hauptnutzer entfernt:

pm uninstall -k --user 0 com.google.android.youtube

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?

1 „Gefällt mir“

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.

1 „Gefällt mir“