Lire le nom du package d'un APK Android

200

J'ai besoin d'obtenir le nom du package d'un APK Android. J'ai essayé de décompresser l'APK et de lire le contenu deAndroidManifest.xml , mais il semble que ce ne soit pas un fichier texte.

Comment puis-je extraire le nom du package de l'APK?

Dagang
la source

Réponses:

320
aapt dump badging <path-to-apk> | grep package:\ name
hackbod
la source
1
Existe-t-il un moyen d'appeler cela à partir du code Android? Je veux pouvoir lancer un package d'apk que je télécharge via mon application.
Matt Wear
7
appt dump badging <path-to-apk> | paquet grep: \ nom
herbertD
2
@Campiador, vous pouvez simplement taper jusqu'au tuyau |, appuyez sur Entrée, puis recherchez simplement la sortie pour le paramètre souhaité. N'oubliez pas que cela aaptdoit être sur votre chemin
Patrick
Voir ma réponse ci-dessous si vous avez besoin de l'obtenir par programme (pour un script).
Bruno Bronosky
15
aaptse trouve sous Android\SDK\build-tools\version. sur la commande windows peut être aapt dump badging <path-to-apk> | findstr -i "package: name"ouaapt dump badging <path-to-apk>
equiman
75

Vous pouvez installer l'apk sur votre téléphone, puis

connectez-vous en utilisant adb, vous pouvez lancer le shell adb et exécuter pm list packages -f, qui affiche le nom du package pour chaque apk installé.

Tiré du nom du package Rechercher pour les applications Android afin d'utiliser Intent pour lancer l'application Market à partir du Web

Danail
la source
1
De plus, vous devrez vous assurer que vous exécutez avec des privilèges élevés. Fondamentalement, dans le terminal, utilisez d'abord la sucommande.
palswim
4
rechercher un nom de package spécifiquepm list packages -f | grep term-to-search-for
Patrick Favre
14

Basé sur la réponse @hackbod ... mais lié aux fenêtres.

aaptse trouve sur Android\SDK\build-tools\version. Si vous avez besoin de plus d'informations sur ce qu'est appt command(Outil de création de package d'actifs Android), lisez ce https://stackoverflow.com/a/28234956/812915

La dumpsous-commande de aaptest utilisée pour afficher les valeurs des éléments individuels ou des parties d'un package:

aapt dump badging <path-to-apk>

Si vous souhaitez voir uniquement la ligne contenant les package: nameinformations, utilisezfindstr

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

J'espère que cela aidera les autres utilisateurs de Windows!

equiman
la source
13

Si vous regardez Google Play et que vous souhaitez connaître le nom de son package, vous pouvez consulter l'URL ou la barre d'adresse. Vous obtiendrez le nom du package. Voici com.landshark.yaumle nom du package

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

Si vous ouvrez le fichier AndroidManifest.xml à l'aide du bloc-notes MS, recherchez l'expression packageet vous trouverez ce qui suit:

package manifest $xxx.xxxxxxx.xxxxxxx |

où xxx.xxxxxxx.xxxxxxx est le nom de votre package, juste écrit avec un espace après chaque caractère.

C'est un moyen utile lorsque vous n'avez aucun outil spécifique installé.

Wojciech
la source
Ceci est particulièrement utile si le code de l'application est sur github! Beaucoup plus facile que les autres méthodes, merci!
Sarink
1
J'ai déballé l'APK, mais AndroidManifest.xml était un fichier binaire. Bizarre mais vrai.
phatmann
12

Le script bash suivant affichera le nom du package et le nom de l'activité principale:

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"

lancez-le comme ceci:

apk_package.sh /path/to/my.apk
Brad Parks
la source
Ne combinez jamais grep et sed avec awk. Utiliser awk est suffisant.
Bruno Bronosky
8

Une réponse programmatique

Si vous devez le faire par programme, c'est un peu plus compliqué que de simplement obtenir la réponse dans votre cerveau. J'ai un script que j'utilise pour signer toutes nos applications, mais chacune utilise une clé différente. Voici 2 façons d'obtenir uniquement le nom du package en sortie afin que vous puissiez le mettre dans une variable ou faire tout ce dont vous avez besoin avec.

Exemple de sortie: com.example.appname (et rien de plus)

Exigences

aapt - Android Asset Packaging Tool, partie de la téléchargement des outils SDK

Solution 1

En utilisant awkspécifier 'comme séparateur de champ, recherchez une ligne avec package: name=et imprimez uniquement le 2ème "champ" de la ligne:

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

Une faiblesse de cette méthode est qu'elle s'appuie sur aapt pour sortir les champs d'informations du package dans le même ordre:

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

Nous n'avons aucun engagement des développeurs pour maintenir ce format.

Solution 2

En utilisant awkspécifier "comme séparateur de champ, recherchez une ligne avec package=et imprimez uniquement le 2ème "champ" de la ligne:

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

Une faiblesse de cette méthode est qu'elle repose sur aapt pour sortir package=uniquement dans la Android Manifest:section de la sortie. Nous n'avons aucun engagement des développeurs pour maintenir ce format.

Solution 3

Développez le fichier apktool dapk avec et lisez le fichier AndroidManifest.xml.

Ce serait la meilleure méthode, mais AndroidManifest.xml est un fichier binaire et toutes les réponses SO que je vois pour le convertir en texte ne fonctionnent pas. (Utiliser apktool dau lieu d'un simple unzipest censé faire cela pour vous, mais ce n'est pas le cas.) Veuillez commenter si vous avez une solution à ce problème

Bruno Bronosky
la source
1
Merci d'avoir donné plus d'informations à comprendre plutôt que de donner une seule ligne de commande à copier.
Ali Zeynali
4

Une solution simple serait Open Android Studio -> Build -> Analyze Apk ... parcourez et sélectionnez l'APK maintenant vous pouvez trouver le nom du package et à peu près vous pouvez lire.

Sai
la source
2

Si vous voulez simplement connaître le nom du package, exécuter adb logcat, lancer l'activité souhaitée, vous obtiendrez un indice sur le nom du package.

Sam
la source
2

Une autre solution consiste à utiliser aapt list et à utiliser sed pour analyser cela:

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

JohnnyLambada
la source
Le nom du groupe de packages n'est que par hasard le même que le nom du package dans certaines applications. Vous devez vraiment utiliser le A:package="com.example.appname"dans la Android Manifest:section si vous le faitesaapt list -a
Bruno Bronosky
2

Une méthode très simple consiste à utiliser apkanalyzer.

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

Je pense que la façon la meilleure et la plus simple d'extraire uniquement le nom du package sous Linux est

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

Explication:

  1. AAPT extrait les informations APK
  2. Grep "package" pour ne garder que la ligne sur les informations du package
  3. Faites en sorte que sed remplace la ligne entière par le nom du package uniquement à l'aide de l'expression rationnelle suivante: package: name='([a-z0-9.]*)'.*et remplace par le premier (et le seul) groupe correspondant.
m0skit0
la source
1

Vous pouvez extraire AndroidManifest.xml de l'APK, supprimer tous les octets NULL, ignorer tout jusqu'à la chaîne `` manifest '', puis vous êtes à un octet de longueur suivi du nom du package (et de ce qui vient après). Pour la tâche difficile, j'utilise le grand outil GEMA , donc la commande ressemble à ceci:

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

Bien sûr, vous pouvez utiliser n'importe quel autre outil pour effectuer le filtrage.

Hartmut Schäfer
la source
1

Si vous n'avez pas installé le SDK Android, comme dans certains scénarios de test, vous pouvez obtenir le nom du package en utilisant la méthode bash suivante:

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

Testé sur un mac. 'strings' et 'unzip' sont standard sur la plupart des linux, donc devraient également fonctionner sur linux.

mmccabe
la source
0

vous pouvez installer Package_Name_Viewer.apk sur votre émulateur et ensuite vous pouvez voir le nom du package de toutes les applications installées sur votre émulateur.

esideli
la source
0

J'ai aussi essayé la décompilation, ça marche mais récemment j'ai trouvé le moyen le plus simple:

  1. Téléchargez et installez Appium à partir du site Web Appium

  2. Ouvrez Appium-> Paramètres Android, choisissez le fichier apk cible. Et puis vous obtenez tout ce que vous voulez, les informations sur le package, les informations sur l'activité.

wenwen
la source
0

Pour l'utiliser dans les scripts par lots, il est pratique que le script renvoie uniquement le nom du package (par exemple, pour désinstaller une application lorsque vous avez l'APK).

Voici le script que j'utilise:

# 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

disponible sur l'essentiel

Vous pouvez donc écrire:

adb désinstaller `./getPackageName.sh file.apk`

Ben Clayton
la source
0

Pour Windows, les éléments suivants ont fonctionné pour moi:

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

Remarque

Veuillez modifier les chemins d’adb, aapt, APKPath en fonction des chemins d’adb, aapt et de l’emplacement apk de votre système.

Travail:

  • Ici, j'ai ajouté l'apk dans un dossier sur le bureau "\ Desktop \ APK \ Instant_Instal \".
  • La commande %adb% install %apk%installe l'application si le périphérique est connecté.
  • Cela %aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txtrécupère le nom du paquet et quelques autres détails comme la version etc. de l'apk et stocke dans un fichier temp.txt au même emplacement que celui de l'apk.
  • Jetons FOR / F "= 2 delims = '" %% s IN (temp.txt) DO SET pkgName = %% s extracts the package name and assigns topkgName` variable
  • %adb% shell monkey -p %pkgName% -c android.intent.category.LAUNCHER 1Lance enfin l'application.

En substance, le code ci-dessus installe l'apk à partir d'un emplacement donné dans le bureau "Desktop \ APK \ Instant_Instal \" sur l'appareil et lance l'application.

Kailas
la source
0

Comme je n'ai pas pu trouver le nom du package dans le fichier .apk avec l'éditeur (comme suggéré ci-dessus), j'ai vérifié les fonctions de l'application "ES Datei Explorer" / "ES File Explorer" (version gratuite) que j'ai avait déjà installé. Dans cet outil, le nom du package s'affiche correctement.
Comme je pense qu'un bon explorateur de fichiers ne devrait pas manquer sur un téléphone, je suggère d'utiliser cet outil (si vous avez déjà installé l'apk sur un mobile et devez connaître le nom du package).

FredyWenger
la source
0

Comme il est mentionné dans la documentation Android qu'AAPT est obsolète , obtenir le nom du package à l'aide de la commande AAPT2 sous Linux est le suivant:

./aapt2 dump packagename <path_to_apk>

Comme j'utilise une ancienne version de Gradle build, j'ai dû télécharger une version plus récente d'AAPT2 comme mentionné ici:

Téléchargez AAPT2 depuis Google Maven

En utilisant les outils de build de mon sdk - 25.0.3, 26.0.1 et 27.0.3, l'exécution de la commande aapt2 affiche une erreur: Impossible d'ouvrir 'packagename': Aucun fichier ou répertoire de ce type. C'est pourquoi j'ai opté pour les nouvelles versions d'AAPT2.

J'ai utilisé 3.3.0-5013011 pour linux.

user198530
la source
0

Vous pouvez utiliser Analyze APK...dans le menu Construire dans Android Studio, il affichera le nom du package en haut de la nouvelle fenêtre.

Daniel Zolnai
la source
-1

aapt list -a "path_to_apk"

Je vous recommande de l'enregistrer dans un .txt, car il peut être très long. Alors:

aapt list -a "path_to_apk"> file.txt

Ensuite, voyez le fichier.txt dans votre répertoire actuel.

Delano
la source