Lesen Sie den Paketnamen eines Android APK

200

Ich muss den Paketnamen eines Android APK erhalten. Ich habe versucht, die APK zu entpacken und den Inhalt von zu lesen AndroidManifest.xml, aber es scheint keine Textdatei zu sein.

Wie kann ich den Paketnamen der APK extrahieren?

Dagang
quelle

Antworten:

319
aapt dump badging <path-to-apk> | grep package:\ name
Hackbod
quelle
1
Gibt es eine Möglichkeit, dies aus dem Android-Code heraus aufzurufen? Ich möchte in der Lage sein, ein Paket einer Apk zu starten, die ich über meine App heruntergeladen habe.
Matt Wear
7
Appt Dump Badging <Pfad-zu-Kap> | grep package: \ name
herbertD
2
@Campiador Sie können einfach bis zur Pipe tippen, die |Eingabetaste drücken und dann einfach die Ausgabe nach Ihrem gewünschten Parameter durchsuchen. Denken Sie daran, dass aaptdas auf Ihrem Weg sein muss
Patrick
Siehe meine Antwort unten, wenn Sie dies programmgesteuert erhalten müssen (für ein Skript).
Bruno Bronosky
15
aaptBefehl befindet sich unter Android\SDK\build-tools\version. unter Windows Befehl kann aapt dump badging <path-to-apk> | findstr -i "package: name"oderaapt dump badging <path-to-apk>
Equiman
75

Sie können die apk dann auf Ihrem Telefon installieren

Wenn Sie eine Verbindung mit adb herstellen, können Sie die adb-Shell starten und pm list-Pakete -f ausführen, in denen der Paketname für jede installierte apk angezeigt wird.

Dies stammt aus dem Paketnamen für Android-Apps suchen, um mit Intent die Market-App über das Web zu starten

Danail
quelle
1
Außerdem müssen Sie sicherstellen, dass Sie mit erhöhten Berechtigungen ausgeführt werden. Verwenden Sie im Terminal grundsätzlich suzuerst den Befehl.
Palswim
4
um nach einem bestimmten Paketnamen zu suchenpm list packages -f | grep term-to-search-for
Patrick Favre
14

Basierend auf @hackbod Antwort ... aber im Zusammenhang mit Windows.

aaptBefehl befindet sich auf Android\SDK\build-tools\version. Wenn Sie weitere Informationen zu appt command(Android Asset Packaging Tool) benötigen, lesen Sie diese https://stackoverflow.com/a/28234956/812915

Mit dem dumpUnterbefehl von aaptwerden die Werte einzelner Elemente oder Teile eines Pakets angezeigt:

aapt dump badging <path-to-apk>

Wenn Sie nur die Zeile mit package: nameInformationen sehen möchten , verwenden Siefindstr

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

Hoffe es hilft anderen Windows-Benutzern!

Equiman
quelle
13

Wenn Sie sich Google Play ansehen und den Paketnamen wissen möchten, können Sie sich die URL oder die Adressleiste ansehen. Sie erhalten den Paketnamen. Hier com.landshark.yaumist der Paketname

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

Wenn Sie die Datei AndroidManifest.xml mit MS Notepad öffnen, suchen Sie nach Phrasen packageund Sie werden Folgendes finden:

package manifest $xxx.xxxxxxx.xxxxxxx |

Dabei ist xxx.xxxxxxx.xxxxxx Ihr Paketname, der nur mit einem Leerzeichen nach jedem Zeichen geschrieben wird.

Dies ist nützlich, wenn Sie keine bestimmten Tools installiert haben.

Wojciech
quelle
Dies ist besonders nützlich, wenn der Code für die App auf Github ist! Viel einfacher als die anderen Methoden, danke!
Sarink
1
Ich habe die APK entpackt, aber AndroidManifest.xml war eine Binärdatei. Seltsam aber wahr.
Phatmann
12

Das folgende Bash-Skript zeigt den Paketnamen und den Namen der Hauptaktivität an:

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"

Führen Sie es so aus:

apk_package.sh /path/to/my.apk
Brad Parks
quelle
Kombiniere niemals grep und sed mit awk. Awk zu verwenden ist genug.
Bruno Bronosky
8

Eine programmatische Antwort

Wenn Sie dies programmgesteuert tun müssen, ist es etwas komplizierter, als nur die Antwort in Ihr Gehirn zu bekommen. Ich habe ein Skript, mit dem ich alle unsere Apps signiere, aber jede verwendet einen anderen Schlüssel. Hier sind zwei Möglichkeiten, um nur den Paketnamen als Ausgabe abzurufen, damit Sie ihn in eine Variable einfügen oder alles tun können, was Sie benötigen.

Beispielausgabe: com.example.appname(und nichts weiter)

Bedarf

aapt- Android Asset Packaging Tool, Teil des Downloads der SDK-Tools

Lösung 1

Mit awkangeben 'als Feldtrennzeichen , die Suche nach einer Linie mit package: name=, und nur das zweite „Feld“ in der Zeile drucken:

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

Eine Schwäche dieser Methode besteht darin, dass aapt die Paketinformationsfelder in derselben Reihenfolge ausgibt:

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

Wir haben keine Zusagen der Entwickler, dieses Format beizubehalten.

Lösung 2

Mit awkangeben "als Feldtrennzeichen , die Suche nach einer Linie mit package=, und nur das zweite „Feld“ in der Zeile drucken:

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

Eine Schwäche dieser Methode besteht darin, dass sie package=nur im Android Manifest:Abschnitt der Ausgabe für die Ausgabe geeignet ist . Wir haben keine Zusagen der Entwickler, dieses Format beizubehalten.

Lösung 3

Erweitern Sie die apk-Datei mit apktool dund lesen Sie die Datei AndroidManifest.xml.

Dies wäre die beste Methode, aber die Datei AndroidManifest.xml ist eine Binärdatei, und alle SO-Antworten, die ich für die Konvertierung in Text sehe, funktionieren nicht. (Die Verwendung apktool danstelle einer einfachen unzipsoll dies für Sie tun, tut dies jedoch nicht.) Bitte kommentieren Sie, ob Sie eine Lösung für dieses Problem haben

Bruno Bronosky
quelle
1
Vielen Dank, dass Sie mehr Informationen zum Verstehen geben, anstatt nur eine einzige Befehlszeile zum Kopieren zu geben.
Ali Zeynali
4

Eine einfache Lösung wäre Open Android Studio -> Erstellen -> Apk analysieren ... Durchsuchen und wählen Sie die APK aus. Jetzt können Sie den Paketnamen finden und so ziemlich alles lesen.

Sai
quelle
2

Wenn Sie nur den Paketnamen kennen möchten, adb logcat ausführen und die gewünschte Aktivität starten möchten, erhalten Sie einen Hinweis auf den Paketnamen.

saß
quelle
2

Eine andere Lösung besteht darin, eine Aapt-Liste zu verwenden und sed zu verwenden, um Folgendes zu analysieren:

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

Johnny Lambada
quelle
Der Paketgruppenname ist in einigen Apps nur zufällig mit dem Paketnamen identisch. Sie müssen wirklich die A:package="com.example.appname"in der Android Manifest:Sektion verwenden, wenn Sie dies tunaapt list -a
Bruno Bronosky
2

Es gibt einen sehr einfachen Weg, wenn Sie Ihre APK bereits auf Ihrem Smartphone haben. Verwenden Sie einfach eine dieser APPs:

Paket Name Viewer Apps

Hexodus
quelle
2

Eine sehr einfache Methode ist die Verwendung von apkanalyzer.

apkanalyzer manifest application-id "${_path_to_apk}"
William George
quelle
1

Ich denke, der beste und einfachste Weg, nur den Paketnamen unter Linux zu extrahieren, ist

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

Erläuterung:

  1. AAPT extrahiert die APK-Informationen
  2. Grep "package", um nur die Zeile über die Paketinformationen beizubehalten
  3. Lassen Sie sed die gesamte Zeile durch den Paketnamen ersetzen, indem Sie nur den folgenden regulären Ausdruck verwenden: package: name='([a-z0-9.]*)'.*und durch die erste (und einzige) übereinstimmende Gruppe ersetzen.
m0skit0
quelle
1

Sie können AndroidManifest.xml aus der APK extrahieren, alle NULL-Bytes entfernen, alles bis nach der Zeichenfolge 'manifest' überspringen und dann ein langes Byte gefolgt vom Paketnamen (und dem, was danach kommt). Für die schwierige Aufgabe verwende ich das großartige GEMA- Tool, daher sieht der Befehl folgendermaßen aus:

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

Natürlich können Sie jedes andere Tool verwenden, um die Filterung durchzuführen.

Hartmut Schäfer
quelle
1

Wenn Sie das Android SDK nicht installiert haben, wie in einigen Testszenarien, können Sie den Paketnamen mithilfe der folgenden Bash-Methode abrufen:

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"
}

Auf einem Mac getestet. 'Strings' und 'Unzip' sind bei den meisten Linux-Geräten Standard und sollten daher auch unter Linux funktionieren.

mmccabe
quelle
0

Sie können Package_Name_Viewer.apk auf Ihrem Emulator installieren und als nächstes sehen Sie den Paketnamen aller installierten Apps auf Ihrem Emulator.

esideli
quelle
0

Ich habe auch die Dekompilierungssache ausprobiert, sie funktioniert, aber kürzlich habe ich den einfachsten Weg gefunden:

  1. Laden Sie Appium von der Appium-Website herunter und installieren Sie es

  2. Öffnen Sie Appium-> Android und wählen Sie die Ziel-APK-Datei. Und dann bekommen Sie alles, was Sie wollen, die Paketinformationen, Aktivitätsinformationen.

wenwen
quelle
0

Um dies in Batch-Skripten zu verwenden, ist es praktisch, wenn das Skript nur den Paketnamen zurückgibt (z. B. zum Deinstallieren einer App, wenn Sie über die APK verfügen).

Hier ist das Skript, das ich benutze:

# 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

im Kern verfügbar

Sie könnten also schreiben:

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

Ben Clayton
quelle
0

Für Windows hat folgendes bei mir funktioniert:

:: // 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

Hinweis

Bitte bearbeiten Sie die Pfade von adb, aapt, APKPath entsprechend den Pfaden von adb, aapt und dem apk-Speicherort in Ihrem System.

Arbeiten:

  • Hier habe ich die apk in einem Ordner auf Desktop "\ Desktop \ APK \ Instant_Instal \" hinzugefügt.
  • Der Befehl %adb% install %apk%installiert die Anwendung, wenn das Gerät angeschlossen ist.
  • Dadurch werden der %aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txtPaketname und einige andere Details wie die Version usw. der apk abgerufen und in einer temp.txt-Datei am selben Speicherort wie die der apk gespeichert.
  • FOR / F "tokens = 2 delims = '" %% s IN (temp.txt) SET SET pkgName = %% s extracts the package name and assigns topkgName` Variable
  • Schließlich %adb% shell monkey -p %pkgName% -c android.intent.category.LAUNCHER 1startet die App.

Im Wesentlichen installiert der obige Code die apk von einem bestimmten Speicherort im Desktop "Desktop \ APK \ Instant_Instal \" auf dem Gerät und startet die Anwendung.

Kailas
quelle
0

Da ich den Paketnamen in der APK-Datei mit dem Editor nicht finden konnte (wie oben vorgeschlagen), habe ich die Funktionen in der App "ES Datei Explorer" / "ES File Explorer" (kostenlose Version) überprüft, die ich hatte bereits installiert. In diesem Tool wird der Paketname korrekt angezeigt.
Da ich denke, dass ein guter Datei-Explorer auf einem Telefon nicht fehlen sollte, empfehle ich, dieses Tool zu verwenden (wenn Sie die apk bereits auf einem Mobiltelefon installiert haben und den Paketnamen kennen müssen).

FredyWenger
quelle
0

Da in der Android-Dokumentation erwähnt wird, dass AAPT veraltet ist, lautet der Abruf des Paketnamens mithilfe des Befehls AAPT2 unter Linux wie folgt:

./aapt2 dump packagename <path_to_apk>

Da ich eine ältere Version von Gradle Build verwende, musste ich eine neuere Version von AAPT2 herunterladen, wie hier erwähnt:

Laden Sie AAPT2 von Google Maven herunter

Wenn Sie die Build-Tools in meinem SDK - 25.0.3, 26.0.1 und 27.0.3 verwenden, wird beim Ausführen des Befehls aapt2 ein Fehler angezeigt: 'Paketname' kann nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis. Deshalb habe ich mich für die neueren Versionen von AAPT2 entschieden.

Ich habe 3.3.0-5013011 für Linux verwendet.

user198530
quelle
0

Sie können Analyze APK...das Menü "Erstellen" in Android Studio verwenden. Der Paketname wird oben im neuen Fenster angezeigt.

Daniel Zolnai
quelle
-1

aapt list -a "path_to_apk"

Ich empfehle Ihnen, es in einer .txt zu speichern, da es sehr lang sein kann. So:

aapt list -a "path_to_apk"> file.txt

Dann sehen Sie die Datei file.txt in Ihrem aktuellen Verzeichnis.

Delano
quelle