Uzyskaj nazwę pakietu ORAZ nazwę pospolitą aplikacji za pośrednictwem ADB

15

Szukam możliwości pobrania zarówno nazw pakietów, jak i nazw pospolitych aplikacji zainstalowanych na urządzeniu z systemem Android za pośrednictwem ADB - lub przynajmniej odzyskania nazwy pospolitej, jeśli nazwa pakietu jest znana. Szybkie wyszukiwanie w naszej witrynie przyniosło dwa powiązane pytania, ale nie rozwiązały mojego problemu:

Szukam sposobu, aby uzyskać informacje bezpośrednio z urządzenia, jeśli to możliwe - nie „w żaden sposób” (w tym „wyszukiwania w Internecie” lub „za pośrednictwem aplikacji”), ponieważ mają to dwa pytania.

Wiem, że dostępnych jest wiele narzędzi do uzyskania szczegółowych informacji o pakiecie:

  • adb dumpsys package: Chociaż zawiera listę wszystkich pakietów z wieloma szczegółami, „nazwa zwyczajowa” nie jest wyświetlana
  • adb shell pm list: podaje tylko nazwy pakietów
  • aaptbyłby w stanie uzyskać wspólną nazwę, ale wymagałby najpierw pobrania .apkpliku z urządzenia, co nie jest tak naprawdę wygodne (i oczywiście będzie dość powolne przy zainstalowanych wielu i / lub dużych aplikacjach)

Przegapiłem coś? Wiem, że informacje muszą znajdować się na urządzeniu (jak inaczej może wyświetlać nazwy aplikacji w GUI? Wątpię, czy Android analizuje .apkplik za każdym razem, gdy GUI potrzebuje „nazwy pospolitej”). Czy jest więc sposób, aby go opanować, używając bezpośrednio ADB?


TL; DR

Tło (jeśli ktoś jest ciekawy): Chcę móc szybko uzyskać listę aplikacji użytkownika z dowolnego z moich urządzeń, bez konieczności powrotu do akrobatyki. Lista ich nazw pakietów, których mogę użyć adb shell pm list -3, ale ponieważ są to tylko nazwy pakietów, rozpoznawanie aplikacji jest zgadywaniem. Więc jeśli byłoby jakieś polecenie ADB do odzyskania wspólnej nazwy dla danej nazwy pakietu, mógłbym po prostu użyć pętli podobnej do for pkg in $(adb shell pm list -3); do echo "- $(adb <whatever_the_command_is> $pkg) ($pkg)"; done- i uzyskać listę wszystkich zainstalowanych aplikacji użytkownika w „czytelnym dla człowieka formacie” wraz z nazwami ich pakietów.

Przypadków użycia:

  • Zobacz, jakie aplikacje „zbędne” są zainstalowane (które mogę usunąć)
  • Listy kontrolne z wielu urządzeń
  • Dokumentacja;)
  • i prawdopodobnie więcej (ale do tego potrzebne są powyższe 3)
Izzy
źródło
Po prostu ideea (myślę, że już próbowałeś?). Dlaczego po prostu nie kompilujesz aapt dla Androida i uruchamiasz zamiast powłoki? : D
user3344236
1
@ user3344236 Mam świadomość tej możliwości; ale nie zawsze jest opcja zainstalowania czegoś na danym urządzeniu, zwłaszcza nie skompilowanego pliku binarnego (czasami dostaję urządzenia, które nie są zrootowane i muszę zachować „warunki podobne do kryminalistyki” - tzn. „zrobić” nie zmieniaj urządzenia, po prostu je eksploruj ”).
Izzy
Tak więc drugim pomysłem jest napisanie sobie narzędzia, które działa przez powłokę adb ... bez użycia zmodyfikowanego adbd na urządzeniu i bez wypychania tam niektórych plików. Myślę, że osiągnięcie tego zajmie trochę czasu (jeśli kiedykolwiek Ci się uda): D
user3344236
@ user3344236 zbyt niepokojący, zwłaszcza że nie jestem programistą dla Androida. Obecnie używam „rozwiązania internetowego” (podobnego do tego „wyszukiwania Google Play”), ponieważ wydaje się, że nie ma tutaj rozwiązania natywnego (jeszcze?).
Izzy
Cześć Izzy! Biorąc pod uwagę komentarze (powyżej), czy oznacza to, że potrzebujesz rozwiązania, biorąc pod uwagę niezrootowane urządzenie?
Firelord

Odpowiedzi:

8

To nie jest ostateczna odpowiedź, ponieważ nie jest ogólna (działa tylko na niektórych urządzeniach) - ale to przynajmniej początek:

Jak się dowiedzieliśmy , przynajmniej ROM oparte na CM z Kitkat (Android 4.4) i wyżej są dostarczane z plikiem aaptbinarnym dostępnym w /system/bin1 . Jeśli twój ROM go nie ma, a instalacja pliku binarnego na urządzeniu jest opcją, możesz go znaleźć tutaj .

Za pomocą aaptmożna pobrać nazwę aplikacji

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

Wynik będzie podobny do tego label='Funny App', który następnie możesz łatwo przeanalizować dla nazwy aplikacji, np

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

(nie jest dobrze, jeśli nazwa aplikacji zawiera pojedyncze cudzysłowy, ale to może się liczyć jako kosmetyki - lub zastanawiasz się, jak poprawić część sed, aby sobie z tym poradzić).


1: nie znaleźliśmy tego w sprawdzonych ROM-ach Kitkat i powyżej, więc mogą to być tylko ROMy oparte na CM

Izzy
źródło
3
Uwaga dla czytelników: Aby korzystać z tego pliku aaptbinarnego, nie trzeba mieć zrootowanego urządzenia . Możesz bardzo dobrze pobrać i zmienić nazwę pliku binarnego na aaptPC, ustawić uprawnienia do pliku wykonywalnego kompatybilnego z Linuksem na plik binarny i pchnąć go /data/local/tmp, a następnie użyć bezwzględnej ścieżki /data/local/tmp/aaptdo użycia pliku binarnego w tych poleceniach.
Firelord
Tak więc dla nazwy pakietu (pierwsza część oryginalnego pytania) zrobiłbyśaapt d badging <path to apk> | grep 'package: name' | awk '{print $2}'
gmoz22
8

Oto moje rozwiązanie dla niezrootowanego telefonu, który wymagał drobnych zmian od powyższego, które uruchomiłem na Moto G 2. generacji z systemem Android 5.0.2.

Nie miałem aapt binary w / system / bin, więc najpierw spróbowałem pobrać z: https://android.izzysoft.de/downloads

ale kiedy próbowałem go uruchomić, wystąpił błąd:

błąd: obsługiwane są tylko pliki wykonywalne niezależne od pozycji (PIE).

Więc wtedy szukałem wersji SROKI i znalazłem: https://github.com/Calsign/APDE/blob/master/APDE/src/main/assets/aapt-binaries/aapt-arm-pie

i działało to poprzez skopiowanie pliku binarnego do / data / local / tmp:

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

Więc wtedy:

adb shell pm list packages -3 -f

pobiera listę aplikacji innych firm (aplikacje, które zainstalowałeś, a nie aplikacje systemowe), a następnie możesz użyć pakietu z powyższego polecenia w aapt, aby uzyskać informacje o pakiecie - przykład:

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

Poniżej znajduje się skrypt (dla klienta Linux), aby uzyskać po prostu „powszechną” nazwę dla aplikacji innych firm: ``

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

Jeśli chcesz także pakiet i wersję, zmień ostatni wiersz z:

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

do:

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

Przykładowe dane wyjściowe:

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'

Mikrofon

Mike Bounds
źródło
Wielkie dzięki, dwa razy, Mike: raz za skrypt powłoki, a drugi za wskaźnik do wariantu ARM aapt! Sprawdzę to, gdy tylko pozwoli na to czas (obecnie trochę się spieszę). Na razie głosowany, być może zaakceptowany po weryfikacji :)
Izzy
PS: Moja strona pobierania teraz prowadzi również do podanego źródła - tylko „jeden poziom wyżej”, aby ludzie mogli wybierać między wersjami ARM i x86.
Izzy