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 angezeigtadb shell pm list
: gibt nur die Paketnamen anaapt
wäre in der Lage, den allgemeinen Namen zu erhalten, müsste aber zuerst die .apk
Datei 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 .apk
Datei jedes Mal analysiert, wenn die GUI den "allgemeinen Namen" benötigt). Gibt es also eine Möglichkeit, es mit ADB direkt zu bekommen?
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:
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 aapt
Binä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'
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 aapt
ist 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
aapt
Binärdatei zu verwenden. Sie können die Binärdatei sehr gut herunterladen und aapt
in PC umbenennen, Linux-kompatible ausführbare Berechtigungen für die Binärdatei festlegen und sie auf schieben /data/local/tmp
und dann den absoluten Pfad /data/local/tmp/aapt
verwenden, um die Binärdatei in diesen Befehlen zu verwenden.aapt d badging <path to apk> | grep 'package: name' | awk '{print $2}'
ares777
Izzy
ares777
Izzy
Feuerlord
Izzy
Feuerlord
<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.Izzy
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.Feuerlord
<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.Izzy
Izzy
aapt
es in Android-ROMs ab 4.4 (Kitkat) enthalten ist, siehe diese Antwort . Kann das jemand für Stock-ROMs bestätigen?