Przeczytaj nazwę pakietu APK na Androida


200

Muszę uzyskać nazwę pakietu aplikacji na Androida. Próbowałem rozpakować AndroidManifest.xmlplik APK i przeczytać zawartość , ale wygląda na to, że nie jest to plik tekstowy.

Jak mogę wyodrębnić nazwę pakietu APK?

Odpowiedzi:


320
aapt dump badging <path-to-apk> | grep package:\ name

1
Czy istnieje sposób na wywołanie tego z poziomu kodu Androida? Chcę móc uruchomić pakiet aplikacji, którą pobieram za pośrednictwem mojej aplikacji.
Matt Wear

7
appt dump badging <path-to-apk> | pakiet grep: \ name
herbertD

2
@Campiador możesz po prostu pisać aż do potoku |, naciśnij klawisz enter, a następnie po prostu wyszukaj dane wyjściowe dla żądanego parametru. Pamiętaj tylko, że to aaptmusi być na twojej drodze
Patrick

Zobacz moją odpowiedź poniżej, jeśli musisz uzyskać to programowo (dla skryptu).
Bruno Bronosky

15
aaptpolecenie znajduje się pod Android\SDK\build-tools\version. komendą w aapt dump badging <path-to-apk> | findstr -i "package: name"aapt dump badging <path-to-apk>
systemie

75

Następnie możesz zainstalować apk na swoim telefonie

połącz używając adb, możesz uruchomić powłokę adb i wykonać pakiety listy pm -f, która pokazuje nazwę pakietu dla każdego zainstalowanego apka.

To pochodzi z Znajdź nazwę pakietu dla aplikacji na Androida, aby używać aplikacji Intent do uruchomienia aplikacji Market z sieci


1
Musisz także upewnić się, że korzystasz z podwyższonych uprawnień. Zasadniczo w terminalu sunajpierw użyj polecenia.
palswim

4
szukać konkretnej nazwy pakietupm list packages -f | grep term-to-search-for
Patrick Favre

14

Na podstawie odpowiedzi @hackbod ... ale dotyczy systemu Windows.

aaptpolecenie znajduje się na Android\SDK\build-tools\version. Jeśli potrzebujesz więcej informacji na temat tego, co to jest appt command(Android Asset Packaging Tool), przeczytaj to https://stackoverflow.com/a/28234956/812915

Polecenie dumppodrzędne aaptsłuży do wyświetlania wartości poszczególnych elementów lub części pakietu:

aapt dump badging <path-to-apk>

Jeśli chcesz zobaczyć tylko linię z package: nameinformacjami, użyjfindstr

aapt dump badging <path-to-apk> | findstr -n "package: name" | findstr "1:"

Mam nadzieję, że pomoże to innemu użytkownikowi systemu Windows!


13

Jeśli patrzysz na Google Play i chcesz poznać jego nazwę pakietu, możesz spojrzeć na adres URL lub pasek adresu. Otrzymasz nazwę pakietu. Oto com.landshark.yaumnazwa pakietu

 https://play.google.com/store/apps/details?id=com.landshark.yaum&feature=search_result#?t=W251bGwsMSwyLDEsImNvbS5sYW5kc2hhcmsueWF1bSJd

12

Jeśli otworzysz plik AndroidManifest.xml za pomocą MS Notepad, wyszukaj frazę, packagea znajdziesz następujące informacje:

package manifest $xxx.xxxxxxx.xxxxxxx |

gdzie xxx.xxxxxxx.xxxxxxx to nazwa pakietu, zapisana po prostu spacją po każdym znaku.

Jest to przydatny sposób, gdy nie masz zainstalowanych żadnych konkretnych narzędzi.


Jest to szczególnie przydatne, jeśli kod aplikacji znajduje się na github! O wiele łatwiej niż inne metody, dzięki!
sarink

1
Rozpakowałem plik APK, ale plik AndroidManifest.xml był plikiem binarnym. Dziwne, ale prawdziwe.
phatmann

12

Poniższy skrypt bash wyświetli nazwę pakietu i główną nazwę działania:

apk_package.sh

package=$(aapt dump badging "$*" | awk '/package/{gsub("name=|'"'"'","");  print $2}')
activity=$(aapt dump badging "$*" | awk '/activity/{gsub("name=|'"'"'","");  print $2}')
echo
echo "   file : $1"
echo "package : $package"
echo "activity: $activity"

uruchom tak:

apk_package.sh /path/to/my.apk

Nigdy nie łącz grepa i seda z awk. Wystarczy użyć awk.
Bruno Bronosky,

8

Odpowiedź programowa

Jeśli musisz to zrobić programowo, jest to trochę bardziej zaangażowane niż tylko uzyskanie odpowiedzi w twoim mózgu. Mam skrypt, którego używam do podpisywania wszystkich naszych aplikacji, ale każdy używa innego klucza. Oto 2 sposoby uzyskania samej nazwy pakietu jako wyniku, dzięki czemu można umieścić ją w zmiennej lub zrobić z nią, co trzeba.

Przykładowe dane wyjściowe: com.example.appname(i nic więcej)

Wymagania

aapt- Android Asset Packaging Tool, część do pobrania SDK Tools

Rozwiązanie 1

Używając awkokreślenia 'jako separatora pól, wyszukaj wiersz za pomocą package: name=i wypisz tylko drugie „pole” w wierszu:

aapt dump badging /path/to/file.apk | awk -v FS="'" '/package: name=/{print $2}'

Słabością tej metody jest to, że polega ona na aapt, aby wyświetlała pola informacji o pakiecie w tej samej kolejności:

package: name='com.example.appname' versionCode='3461' versionName='2.2.4' platformBuildVersionName='4.2.2-1425461'

Nie mamy żadnych zobowiązań ze strony programistów do utrzymania tego formatu.

Rozwiązanie 2

Używając awkokreślenia "jako separatora pól, wyszukaj wiersz za pomocą package=i wypisz tylko drugie „pole” w wierszu:

aapt list -a /path/to/file.apk | awk -v FS='"' '/package=/{print $2}'

Słabością tej metody jest to, że polega ona na aapt na wyjściu package=tylko w Android Manifest:sekcji danych wyjściowych. Nie mamy żadnych zobowiązań ze strony programistów do utrzymania tego formatu.

Rozwiązanie 3

Rozwiń plik apk za pomocą apktool di przeczytaj plik AndroidManifest.xml.

To byłaby najlepsza metoda, ale AndroidManifest.xml jest plikiem binarnym i wszystkie odpowiedzi SO, które widzę w celu konwersji na tekst, nie działają. (Używanie apktool dzamiast zwykłego unzippowinno robić to za Ciebie, ale tak nie jest.) Proszę o komentarz, jeśli masz rozwiązanie tego problemu


1
Dziękujemy za podanie większej ilości informacji do zrozumienia niż po prostu podanie jednego wiersza polecenia do skopiowania.
Ali Zeynali,

4

Prostym rozwiązaniem byłoby Open Android Studio -> Kompilacja -> Analiza Apk ... przeglądaj i wybierz APK, teraz możesz znaleźć nazwę pakietu i prawie wszystko, co możesz przeczytać.


2

Jeśli chcesz tylko poznać nazwę pakietu, uruchom adb logcat, uruchom żądane działanie, otrzymasz wskazówkę dotyczącą nazwy pakietu.


2

Innym rozwiązaniem jest użycie listy aapt i użycie sed do analizy:

aapt list -a $PATH_TO_YOUR_APK | sed -n "/^Package Group[^s]/s/.*name=//p"


Nazwa grupy pakietów jest przypadkowo taka sama jak nazwa pakietu w niektórych aplikacjach. Naprawdę trzeba być pomocą A:package="com.example.appname"w Android Manifest:części, jeśli nieaapt list -a
Bruno Bronosky


2

Bardzo prostą metodą jest użycie apkanalizatora.

apkanalyzer manifest application-id "${_path_to_apk}"

1

Myślę, że najlepszym i najprostszym sposobem na wyodrębnienie tylko nazwy pakietu w systemie Linux jest

aapt dump badging <APK_path> | grep package | sed -r "s/package: name='([a-z0-9.]*)'.*/\1/"

Wyjaśnienie:

  1. AAPT wyodrębnia informacje APK
  2. Grep „pakiet”, aby zachować tylko wiersz o informacji o pakiecie
  3. Niech sed zamieni całą linię na nazwę pakietu tylko przy użyciu następującego wyrażenia regularnego: package: name='([a-z0-9.]*)'.*i zastąpi pierwszą (i jedyną) pasującą grupą.

1

Możesz wyodrębnić plik AndroidManifest.xml z pliku APK, usunąć wszystkie bajty NULL, pomijać wszystko aż do napisu „manifest”, a następnie znajdujesz się w bajcie długości, po którym następuje nazwa pakietu (i co następuje po nim). Do trudnego zadania używam doskonałego narzędzia GEMA , więc polecenie wygląda następująco:

7z e -so MyApp.apk AndroidManifest.xml | gema '\x00=' | gema -match 'manifest<U1><U>=@substring{0;@char-int{$1};$2}'

Oczywiście do filtrowania można użyć dowolnego innego narzędzia.


1

Jeśli nie masz zainstalowanego zestawu Android SDK, jak w niektórych scenariuszach testowych, możesz uzyskać nazwę pakietu, używając następującej metody bash:

getAppIdFromApk() {
  local apk_path="$1"

  # regular expression (required)
  local re="^\"L.*/MainActivity;"
  # sed substitute expression
  local se="s:^\"L\(.*\)/MainActivity;:\1:p"
  # tr expression
  local te=' / .';

  local app_id="$(unzip -p $apk_path classes.dex | strings | grep -Eo $re | sed -n -e $se | tr $te)"

  echo "$app_id"
}

Testowane na komputerze Mac. „strings” i „unzip” są standardem w większości Linuksów, więc powinny działać również na Linuksie.


0

możesz zainstalować Package_Name_Viewer.apk na emulatorze, a następnie możesz zobaczyć nazwę pakietu wszystkich zainstalowanych aplikacji na emulatorze.


0

Próbowałem też rzeczy do dekompilacji, działa, ale ostatnio znalazłem najłatwiejszy sposób:

  1. Pobierz i zainstaluj Appium ze strony Appium

  2. Otwórz Appium-> ustawienia Androida, wybierz docelowy plik apk. A potem dostajesz wszystko, czego chcesz, informacje o pakiecie, informacje o aktywności.


0

Aby użyć tego w skryptach wsadowych, przydatne jest, aby skrypt zwrócił tylko nazwę pakietu (np. Do odinstalowania aplikacji, gdy masz APK).

Oto skrypt, którego używam:

# extract the android package id from a built apk file
# usage ./getPackageName.sh <path-to-apk>
line=`aapt dump badging "$1" | grep package:\ name`

# above returns:
# package: name='com.calvium.myapp' versionCode='1' versionName='1.0'
if [[ $line =~ name=\'(.+)\'\ versionCode ]]; then
    echo ${BASH_REMATCH[1]}
else
    echo "Failed to find package name"
    exit 1
fi

dostępne na gist

Abyś mógł napisać:

adb odinstaluj `./getPackageName.sh file.apk`


0

W przypadku systemu Windows działało dla mnie:

:: // Initializing variables
SET adb="C:\Users\<User name>\AppData\Local\Android\Sdk\platform-tools\adb"
SET aapt="C:\Users\<User name>\AppData\Local\Android\Sdk\build-tools\22.0.0\aapt"
SET APKPath=C:\Users\<User name>\Desktop\APK\Instant_Instal\

CD %APKPath%

:: // Searching for apk file and storing it
FOR /F "delims=" %%f IN ('dir /S /B *.apk') DO SET "APKFullPath=%%f"
SET apk=%APKFullPath%

:: // Command adb install apk, run apk
%adb% install %apk%

:: // Fetching package name from apk
%aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txt
FOR /F "tokens=2 delims='" %%s IN (temp.txt) DO SET pkgName=%%s
del temp.txt

:: // Launching apk
%adb% shell monkey -p %pkgName% -c android.intent.category.LAUNCHER 1

pause

Uwaga

Edytuj ścieżki adb, aapt, APKPath zgodnie ze ścieżkami adb, aapt i lokalizacją apk w twoim systemie.

Pracujący:

  • Tutaj dodałem apk w folderze na pulpicie „\ Desktop \ APK \ Instant_Instal \”.
  • Komenda %adb% install %apk% instaluje aplikację, jeśli urządzenie jest podłączone.
  • To %aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txt nazwa pakietu pobierające i kilka innych szczegółów, takich jak wersja itp z apk i zapisuje w pliku temp.txt w tym samym miejscu, co ich apk.
  • Żetony FOR / F = 2 delims = '"%% s IN (temp.txt) DO SET pkgName = %% sextracts the package name and assigns to pkgName`
  • Wreszcie %adb% shell monkey -p %pkgName% -c android.intent.category.LAUNCHER 1uruchamia aplikację.

Zasadniczo powyższy kod instaluje apk z podanej lokalizacji na pulpicie „Desktop \ APK \ Instant_Instal \” na urządzenie i uruchamia aplikację.


0

Ponieważ nie byłem w stanie znaleźć nazwy pakietu w pliku apk za pomocą edytora (jak sugerowano powyżej), sprawdziłem funkcje w aplikacji „ES Datei Explorer” / „ES File Explorer” (wersja darmowa) już zainstalowałem. W tym narzędziu nazwa pakietu jest wyświetlana poprawnie.
Ponieważ uważam, że na telefonie nie powinno zabraknąć dobrego eksploratora plików, sugeruję skorzystanie z tego narzędzia (jeśli już zainstalowałeś apk na telefonie komórkowym i musisz znać nazwę pakietu).


0

Ponieważ w dokumentacji Androida wspomniano, że AAPT jest przestarzałe , uzyskanie nazwy pakietu za pomocą komendy AAPT2 w systemie Linux wygląda następująco:

./aapt2 dump packagename <path_to_apk>

Ponieważ używam starszej wersji kompilacji Gradle, musiałem pobrać nowszą wersję AAPT2, jak wspomniano tutaj:

Pobierz AAPT2 z Google Maven

Używając narzędzi kompilacji w moim pliku SDK - 25.0.3, 26.0.1 i 27.0.3, wykonanie polecenia aapt2 pokazuje błąd: Nie można otworzyć „nazwa-pakietu”: Brak takiego pliku lub katalogu. Właśnie dlatego wybrałem nowsze wersje AAPT2.

Użyłem 3.3.0-5013011 dla Linuksa.


0

Możesz użyć Analyze APK...z menu kompilacji w Android Studio, wyświetli nazwę pakietu w górnej części nowego okna.


-1

aapt list -a "ścieżka_do_apk”

Polecam zapisać go w formacie .txt, ponieważ może być bardzo długi. Więc:

aapt list -a "ścieżka_do_apk"> plik.txt

Następnie zobacz plik.txt w bieżącym katalogu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.