Erhalten Sie den Paketnamen UND den allgemeinen Namen der Apps über ADB

Ich suche nach einer Möglichkeit, sowohl die Paketnamen als auch die allgemeinen Namen von Apps, die auf einem Android-Gerät installiert sind, über ADB abzurufen – oder zumindest den allgemeinen Namen abzurufen, wenn der Paketname bekannt ist. Eine schnelle Suche auf unserer Website hat zwei verwandte Fragen aufgeworfen, aber sie lösen mein Problem nicht:

Ich suche nach einer Möglichkeit, die Informationen nach Möglichkeit direkt vom Gerät abzurufen – nicht „irgendwie“ (einschließlich „Web-Lookups“ oder „über eine App“), wie diese beiden Fragen es haben.

Ich weiß, dass es mehrere Tools gibt, um Paketdetails zu erhalten:

  • adb dumpsys package: Während dies alle Pakete mit einer Reihe von Details auflistet, wird der "allgemeine Name" nicht angezeigt
  • adb shell pm list: gibt nur die Paketnamen an
  • aaptwäre in der Lage, den allgemeinen Namen zu erhalten, müsste aber zuerst die .apkDatei vom Gerät ziehen, was nicht wirklich praktisch ist (und offensichtlich ziemlich langsam sein wird, wenn viele und/oder große Apps installiert sind).

Habe ich etwas verpasst? Ich weiß, dass sich die Informationen auf dem Gerät befinden müssen (wie könnte es sonst die App-Namen in der GUI anzeigen? Ich bezweifle, dass Android die .apkDatei jedes Mal analysiert, wenn die GUI den "allgemeinen Namen" benötigt). Gibt es also eine Möglichkeit, es mit ADB direkt zu bekommen?


TL;DR

Hintergrund (falls es jemanden interessiert): Ich möchte in der Lage sein, schnell eine Liste von Benutzer-Apps von jedem meiner Geräte zu erhalten, ohne auf Akrobatik zurückgreifen zu müssen. Eine Liste ihrer Paketnamen kann ich mit abrufen adb shell pm list -3, aber da es sich nur um Paketnamen handelt, ist das Erkennen von Apps ein Rätselraten. Wenn es also einen ADB-Befehl gäbe, um den allgemeinen Namen für einen bestimmten Paketnamen abzurufen, könnte ich einfach eine Schleife wie verwenden for pkg in $(adb shell pm list -3); do echo "- $(adb <whatever_the_command_is> $pkg) ($pkg)"; done– und eine Liste aller installierten Benutzer-Apps in einem „vom Menschen lesbaren Format“ zusammen mit ihren Paketnamen erhalten.

Anwendungsfälle:

  • Sehen Sie, welche "überflüssigen" Apps installiert sind (die ich entfernen könnte)
  • Cross-Check-Listen von mehreren Geräten
  • Dokumentation ;)
  • und wahrscheinlich mehr (aber die obigen 3 sind das, wofür ich es brauche)
Nur eine Idee (ich glaube, du hast es schon versucht?). Warum kompilieren Sie aapt nicht einfach für Android und führen es stattdessen von der Shell aus? :D
@ user3344236 Ich bin mir dieser Möglichkeit bewusst; aber es ist nicht immer eine Option, etwas auf dem betreffenden Gerät zu installieren, insbesondere keine selbst kompilierte Binärdatei (manchmal bekomme ich Geräte abgegeben, die nicht gerootet sind und "forensikähnliche Bedingungen" einhalten müssen - dh "tun das Gerät nicht verändern, es einfach erkunden").
Die zweite Idee ist also, sich selbst ein Tool zu schreiben, das über die ADB-Shell läuft ... ohne modifiziertes ADBD auf dem Gerät zu verwenden und ohne einige Dateien dorthin zu schieben. Ich denke, Sie werden einige Zeit brauchen, um dies zu erreichen (falls Sie jemals Erfolg haben): D
@ user3344236 zu besorgniserregend, zumal ich kein Android-Entwickler bin. Ich verwende derzeit eine "webbasierte Lösung" (ähnlich dieser "Google Play-Suche"), da es hier (noch?) keine native Lösung zu geben scheint.
Hallo Izzy! Bedeutet dies in Anbetracht der Kommentare (oben), dass Sie eine Lösung benötigen, die ein nicht gerootetes Gerät berücksichtigt?
@Firelord Vorzugsweise ja, obwohl reine Root-Lösungen besser wären als gar keine;)
Es ist nicht so, dass dies die gewünschte Lösung wäre, aber man kann davon ausgehen, dass ein nicht gerootetes Gerät wahrscheinlich einen aktiven Google Play Store hat, und wenn das der Fall ist, können Sie zumindest einige <APP_NAME> and <PKG_NAME>aus den darin enthaltenen Datenbanken ( localappstate.db) abrufen. Hast du es versucht? Ich habe nicht überprüft, ob das ADB-Backup den Play Store abdeckt oder nicht.
Gute Idee, @Firelord – aber sicher, dass das auch für Apps gelten würde, die auf andere Weise installiert wurden (Aptoide, F-Droid, adb install), die der Playstore nicht kennt? Und zweitens, unter der Annahme eines nicht gerooteten Geräts: Wäre diese Datenbank auf irgendeine Weise über ADB zugänglich? "Aus den darin enthaltenen Datenbanken" bedeutet sicherlich irgendwo darunter /data/data, was ohne Root nicht "offen zugänglich" ist. Es muss überprüft werden, ob diese Datenbank von einem ADB-Backup aus zugänglich wäre – was immer noch erfordern würde, dass die SSL-Bibliotheken verfügbar sind, um das zu entschlüsseln.
@Izzy Ich habe drei Bestätigungen: Wenn auf dem Nicht-Root-Gerät Aptoide oder F-Droid installiert ist, betrachten Sie sie als Goldmine, da ihre Datenbanken durch ADB-Backups abgedeckt sind und sie einzeln über <APP_NAME> and <PKG_NAME>alle System- und Benutzer-Apps verfügen. Apropos Play Store, seine Datenbank wird auch von ADB-Backup abgedeckt, aber es würde <APP_NAME>nur für die Apps geben, die mit Play Store installiert wurden. Der Rest wird <PKG_NAMES>nur von aufgeführt. // Es könnte helfen, denke ich.
Ja, aber es würde bedeuten, viel zu rätseln und nach allen möglichen App-Stores zu suchen, die möglicherweise installiert sind, bis Sie alle Apps abgedeckt haben. Nicht wirklich machbar. Es muss einen "zentralen Ort" geben, der Dinge wie die App-Schublade versorgt. Das wäre dann der Ort, an dem ich meine Diamanten finden würde :)
Es scheint , dass aaptes in Android-ROMs ab 4.4 (Kitkat) enthalten ist, siehe diese Antwort . Kann das jemand für Stock-ROMs bestätigen?

Antworten (2)

Hier ist meine Lösung für ein nicht gerootetes Telefon, das einige geringfügige Änderungen von oben erforderte, die ich auf einem Moto G der 2. Generation mit Android 5.0.2 ausgeführt habe.

Ich hatte keine aaptBinärdatei in /system/bin, also habe ich zuerst versucht, sie von https://android.izzysoft.de/downloads herunterzuladen

aber als ich versuchte, es auszuführen, bekam ich eine Fehlermeldung:

error: only position independent executables (PIE) are supported.

Also suchte ich nach einer PIE-Version und fand: https://github.com/Calsign/APDE/blob/fdc22eb31048862e1484f4b6eca229accda61466/APDE/src/main/assets/aapt-binaries/aapt-arm-pie

und dies funktionierte durch Kopieren von Binärdateien nach /data/local/tmp:

adb push aapt-arm-pie /data/local/tmp
adb shell chmod 0755 /data/local/tmp/aapt-arm-pie

Also dann:

adb shell pm list packages -3 -f

erhält eine Liste von Drittanbieter-Apps (Apps, die Sie installiert haben, keine System-Apps) und dann können Sie das Paket aus dem obigen Befehl verwenden aapt, um Informationen über das Paket zu erhalten - Beispiel:

adb shell /data/local/tmp/aapt-arm-pie d badging /data/app/com.facebook.katana-3/base.apk

Nachfolgend finden Sie ein Skript (für einen Linux-Client), um nur einen "gemeinsamen" Namen für Apps von Drittanbietern zu erhalten:

for pkg in `adb shell pm list packages -3 -f | awk -F= '{sub("package:","");print $1}'`
do
  adb shell /data/local/tmp/aapt-arm-pie d badging $pkg | awk -F: '
      $1 == "application-label" {print $2}'
done

Wenn Sie Paket und Version auch wollen, dann ändern Sie die vorletzte Zeile von:

$1 == "application-label" {print $2}'

zu:

$1 == "package" { split($2,space," ")
name=space[1];version=space[3]}
$1 == "application-label" {print name, version, $2 }'

Beispielausgabe:

name='com.ultimarom.launchnavigation' versionName='1.28' 'Navigation'
name='com.enhanced.skineditorstudio' versionName='3.3' 'Custom Skin Creator'
name='com.mojang.minecraftpe' versionName='1.2.6.60' 'Minecraft'
name='org.videolan.vlc' versionName='2.5.13' 'VLC'
name='com.jrustonapps.myauroraforecast' versionName='1.7.2' 'My Aurora Forecast'
name='de.j4velin.wifiAutoOff' versionName='1.7.6' 'WiFi Automatic'
name='com.facebook.katana' versionName='153.0.0.54.88' 'Facebook'
name='com.metago.astro' versionName='6.0.5' 'ASTRO File Manager'
name='za.co.hardrive.smartinfo.parkrun' versionName='2.0.2' 'My 5krun'
name='com.PYOPYO.StarTrackerVR' versionName='1.0.1' 'StarTracker VR'
name='cz.aponia.bor3.offlinemaps' versionName='1.1.19' 'Offline Maps'
name='com.groupon' versionName='16.11.63973' 'Groupon'
name='com.ebay.mobile' versionName='5.16.1.2' 'eBay'
name='com.runtastic.android' versionName='8.1.1' 'Runtastic
name='com.google.android.diskusage' versionName='3.8.3' 'DiskUsage'
PS: Meine Download-Seite verlinkt jetzt auch auf die von Ihnen angegebene Quelle – nur "eine Ebene höher", damit die Leute zwischen ARM- und x86-Builds wählen können.

Dies ist keine endgültige Antwort, da sie nicht generisch ist (funktioniert nur auf einigen Geräten) – aber es ist zumindest ein Anfang:

Wie wir herausgefunden haben , werden zumindest CM-basierte ROMs mit Kitkat (Android 4.4) und höher mit der in 1aapt verfügbaren Binärdatei ausgeliefert . Wenn Ihr ROM es nicht hat und die Installation der Binärdatei auf dem Gerät eine Option ist, finden Sie es hier ./system/bin

Mit aaptist das Abrufen des App-Namens mit möglich

aapt d badging <path to apk> | grep "application: label" |awk '{print $2}'

Die Ausgabe sieht in etwa so label='Funny App'aus, die Sie dann leicht nach dem App-Namen durchsuchen können, z

aapt d badging <path to apk> | grep 'application: label' | sed -n \"s/.*label\='\([^']*\)'.*/\1/p\"

(Nicht gut, wenn der App-Name einfache Anführungszeichen enthält, aber das könnte als Kosmetik gelten – oder Sie finden heraus, wie Sie den sed-Teil verbessern können, um damit umzugehen).


1: Wir haben dies nicht in den von uns überprüften Kitkat- und höheren Stock-ROMs gefunden, also könnten es nur CM-basierte ROMs sein

Hinweis für die Leser: Sie müssen kein gerootetes Gerät haben, um diese aaptBinärdatei zu verwenden. Sie können die Binärdatei sehr gut herunterladen und aaptin PC umbenennen, Linux-kompatible ausführbare Berechtigungen für die Binärdatei festlegen und sie auf schieben /data/local/tmpund dann den absoluten Pfad /data/local/tmp/aaptverwenden, um die Binärdatei in diesen Befehlen zu verwenden.
Für den Namen des Pakets (erster Teil der ursprünglichen Frage) würden Sie dies tunaapt d badging <path to apk> | grep 'package: name' | awk '{print $2}'