Ottieni il nome del pacchetto E il nome comune delle app tramite ADB


15

Sto cercando una possibilità per recuperare entrambi , i nomi dei pacchetti e i nomi comuni delle app installate su un dispositivo Android tramite ADB - o almeno per recuperare il nome comune se il nome del pacchetto è noto. Una rapida ricerca sul nostro sito ha sollevato due domande correlate, ma non risolvono il mio problema:

Sto cercando un modo per recuperare le informazioni direttamente dal dispositivo, se possibile - non un modo "qualsiasi" (incluse le "ricerche sul web" o "tramite un'app") come hanno queste due domande.

So che ci sono più strumenti disponibili per ottenere i dettagli del pacchetto:

  • adb dumpsys package: Mentre questo elenca tutti i pacchetti con un mucchio di dettagli, il "nome comune" non viene mostrato
  • adb shell pm list: fornisce solo i nomi dei pacchetti
  • aaptsarebbe in grado di ottenere il nome comune, ma richiederebbe innanzitutto di estrarre il .apkfile dal dispositivo, il che non è molto comodo (e ovviamente sarà piuttosto lento con molte e / o grandi app installate)

Ho dimenticato qualcosa? So che le informazioni devono essere sul dispositivo (in quale altro modo potrebbe mostrare i nomi delle app nella GUI? Dubito che Android analizzi il .apkfile ogni volta che la GUI necessita del "nome comune"). Quindi c'è un modo per ottenerlo, usando direttamente ADB?


TL; DR

Background (se qualcuno è curioso): voglio essere in grado di ottenere rapidamente un elenco di app utente da uno qualsiasi dei miei dispositivi, senza dover tornare alle acrobazie. È possibile recuperare un elenco dei nomi dei loro pacchetti adb shell pm list -3, ma poiché si tratta solo di nomi di pacchetti, riconoscere le app è un'ipotesi. Quindi, se ci fosse un comando ADB per recuperare il nome comune per un determinato nome di pacchetto, potrei semplicemente usare un ciclo simile for pkg in $(adb shell pm list -3); do echo "- $(adb <whatever_the_command_is> $pkg) ($pkg)"; done- e ottenere un elenco di tutte le app installate dall'utente in un "formato leggibile dall'uomo" insieme ai loro nomi di pacchetto.

Casi d'uso:

  • Guarda quali app "superflue" sono installate (che potrei rimuovere)
  • Elenchi di controllo incrociato da più dispositivi
  • Documentazione ;)
  • e probabilmente di più (ma i precedenti 3 sono ciò di cui ho bisogno)

Solo un ideea (penso che tu abbia già provato?). Perché semplicemente non compili aapt per Android ed esegui invece dalla shell? : D
user3344236

1
@ user3344236 Sono a conoscenza di tale possibilità; ma non è sempre un'opzione per installare qualcosa sul dispositivo in questione, specialmente non un binario autocompilato (a volte ricevo dispositivi consegnati che non sono rootati e devo mantenere "condizioni forensi" - cioè "fare non alterare il dispositivo, basta esplorarlo ").
Izzy

Quindi la seconda idea è quella di scrivere uno strumento che funziona tramite la shell adb ... senza usare adbd modificato sul dispositivo e senza inviare alcuni file lì. Penso che ci vorrà del tempo per farlo (se mai ci riuscirai): D
user3344236

@ user3344236 troppo preoccupante, soprattutto perché non sono uno sviluppatore Android. Attualmente utilizzo una "soluzione basata sul Web" (simile a quella "Ricerca Google Play"), poiché qui non sembra esserci una soluzione nativa (ancora?).
Izzy

Ciao Izzy! Considerando i commenti (sopra), significa che hai bisogno di una soluzione considerando un dispositivo non rootato?
Firelord

Risposte:


8

Questa non è una risposta finale, in quanto non è generica (funziona solo su alcuni dispositivi) - ma almeno è un inizio:

Come abbiamo capito , almeno le ROM basate su CM con Kitkat (Android 4.4) e superiori vengono fornite con il aaptbinario disponibile in /system/bin1 . Se la tua ROM non ce l'ha, e l'installazione del binario sul dispositivo è un'opzione, puoi trovarla qui .

Utilizzando aapt, è possibile recuperare il nome dell'app con

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

L'output sarà qualcosa del genere label='Funny App', che potrai facilmente analizzare per il nome dell'app, ad es

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

(non va bene se il nome dell'app contiene virgolette singole, ma potrebbe essere considerato come un cosmetico o se pensi a come migliorare la parte sed per gestirlo).


1: non l'abbiamo trovato nelle ROM stock di Kitkat-and-above che abbiamo controllato, quindi potrebbero essere solo ROM basate su CM


3
Nota per i lettori: non è necessario disporre di un dispositivo rooted per utilizzare quel file aaptbinario. Puoi scaricare e rinominare molto bene il binario aaptin PC, impostare l'autorizzazione eseguibile compatibile Linux sul binario e spingerlo a /data/local/tmp, quindi usare il percorso assoluto /data/local/tmp/aaptper usare il binario in quei comandi.
Firelord

Quindi, per il nome del pacchetto (prima parte della domanda originale), lo farestiaapt d badging <path to apk> | grep 'package: name' | awk '{print $2}'
gmoz22

8

Ecco la mia soluzione per un telefono non rootato che aveva bisogno di alcune lievi modifiche dall'alto che ho eseguito su una Moto G 2nd gen con Android 5.0.2.

Non avevo un file binario in / system / bin, quindi ho provato a scaricare da: https://android.izzysoft.de/downloads

ma quando ho provato a eseguirlo ho ricevuto un errore che diceva:

errore: sono supportati solo eseguibili indipendenti di posizione (PIE).

Quindi ho cercato una versione PIE e ho trovato: https://github.com/Calsign/APDE/blob/master/APDE/src/main/assets/aapt-binaries/aapt-arm-pie

e questo ha funzionato copiando binario in / data / local / tmp:

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

Allora:

adb shell pm list packages -3 -f

ottiene un elenco di app di terze parti (app installate, non app di sistema) e quindi è possibile utilizzare il pacchetto dal comando sopra in aapt per ottenere informazioni sul pacchetto - esempio:

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

Quindi sotto è lo script (per un client Linux) per ottenere solo un nome "comune" per le app di terze parti: ``

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

Se vuoi anche il pacchetto e la versione, cambia l'ultima ma una riga da:

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

per:

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

Esempio di output:

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'

Mike


Grazie mille e due volte, Mike: una volta per lo script della shell, e secondo per il puntatore alla variante ARM di aapt! Lo verificherò non appena il tempo lo permetterà (sono un po 'di fretta al momento). Eseguito l'upgrade per ora, forse accettato dopo aver verificato :)
Izzy

PS: la mia pagina di download ora si collega anche alla fonte che hai specificato - solo "a un livello superiore", quindi la gente può scegliere tra build ARM e x86.
Izzy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.