web-dev-qa-db-fra.com

Lire le nom du paquet d'un APK Android

Je dois obtenir le nom du paquet d'un APK Android. J'ai essayé de décompresser le fichier APK et de lire le contenu de AndroidManifest.xml, mais il semble que ce ne soit pas un fichier texte.

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

170
Dagang
aapt dump badging <path-to-apk> | grep package:\ name
276
hackbod

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

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

Cela provient de Trouver le nom du package pour les applications Android à utiliser pour pouvoir lancer l’application Market à partir du Web

66
Danail

Si vous ouvrez le fichier AndroidManifest.xml à l'aide de MS Notepad, recherchez la phrase package. Vous trouverez les informations suivantes:

package manifest $xxx.xxxxxxx.xxxxxxx |

où xxx.xxxxxxx.xxxxxxxx est le nom de votre package, il suffit d'écrire avec un espace après chaque caractère.

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

13
Wojciech

Si vous consultez google play et souhaitez connaître le nom de son package, vous pouvez consulter l'url ou la barre d'adresse. Vous obtiendrez le nom du paquet. Ici com.landshark.yaum est le nom du paquet

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

Le script bash suivant affiche 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 ça:

apk_package.sh /path/to/my.apk
12
Brad Parks

Basé sur @hackbod answer ... mais lié aux fenêtres.

La commande aapt est située sur Android\SDK\build-tools\version. Si vous avez besoin de plus d’informations sur ce qui est appt command (Outil de création d’actifs Android), lisez ceci https://stackoverflow.com/a/28234956/812915

La sous-commande dump de aapt permet d'afficher les valeurs d'éléments individuels ou de parties d'un package: 

aapt dump badging <path-to-apk>

Si vous voulez voir uniquement la ligne avec package: name info, utilisez findstr

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

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

8
equiman

Une réponse programmatique

Si vous avez besoin de faire cela 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 paquet en sortie afin de pouvoir le mettre dans une variable ou en faire ce dont vous avez besoin.

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

Exigences

aapt - Android Asset Packaging Tool, composant du Téléchargement du SDK Tools

Solution 1

Utilisez awk pour spécifier ' en tant que séparateur de champs, recherchez une ligne avec package: name= et n'imprimez que le deuxième "champ" dans la ligne:

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

Une des faiblesses de cette méthode est qu’elle repose sur aapt pour sortir les champs d’information du paquet dans le même ordre:

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

Les développeurs ne se sont pas engagés à maintenir ce format.

Solution 2

Utilisez awk pour spécifier " en tant que séparateur de champs, recherchez une ligne avec package= et n'imprimez que le deuxième "champ" dans la ligne:

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

Une des faiblesses de cette méthode est qu’elle repose sur aapt pour générer package= uniquement dans la section Android Manifest: de la sortie. Les développeurs ne se sont pas engagés à maintenir ce format.

Solution 3

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

Ce serait la meilleure méthode, mais le fichier 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 d au lieu d'une simple unzip est censé le faire pour vous, mais ce n'est pas le cas.) Veuillez commenter si vous avez une solution à ce problème

4
Bruno Bronosky

Si vous voulez juste connaître le nom du paquet, lancez adb logcat, lancez l'activité souhaitée, vous obtiendrez un indice sur le nom du paquet.

2
sat

Une autre solution consiste à utiliser une liste et d’utiliser sed pour analyser:

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

2
JohnnyLambada

Il existe un moyen très simple de placer votre APPS sur votre smartphone. Il suffit d'utiliser l'une de ces applications:

Applications de visualisation de nom de paquet

1
Hexodus

Une solution simple serait Open Studio Android -> Construire -> Analyser Apk ... parcourir et sélectionnez le fichier APK maintenant, vous pouvez trouver le nom du paquet et à peu près, vous pouvez lire.

1
Sai Kiran

Je pense que le meilleur moyen et le plus simple d'extraire seulement le nom du paquet 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 de l'APK
  2. Grep "package" pour ne garder que la ligne concernant les informations sur le paquet
  3. Pour que sed remplace la ligne entière par le nom du paquet, utilisez uniquement l’expression rationnelle suivante: package: name='([a-z0-9.]*)'.* et remplacez-le par le premier (et seul) groupe correspondant.
1
m0skit0

Vous pouvez extraire AndroidManifest.xml de l'APK, supprimer tous les octets NULL, tout ignorer jusqu'à la chaîne 'manifest', pour obtenir un octet de longueur suivi du nom du paquet (et de ce qui le suit). Pour la tâche difficile, j'utilise le formidable outil GEMA , ainsi 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.

1
Hartmut Schäfer

Si le SDK Android n'est pas installé, comme dans certains scénarios de test, vous pouvez obtenir le nom du package à l'aide de 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 travaillez aussi sur linux.

0
mmccabe

N'ayant pas réussi à trouver le nom du paquet 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 avait déjà installé. Dans cet outil, le nom du paquet est affiché 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 paquet).

0
FredyWenger

Pour utiliser cela 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 Gist

Pour que vous puissiez écrire:

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

0
Ben Clayton

Pour Windows, la suite a 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'accès d'adb, aapt, APKPath en fonction des chemins d'accès d'adb, aapt et de l'emplacement apk de votre système.

Travail:

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

En substance, le code ci-dessus installe l'apk à partir de l'emplacement spécifié sur le bureau "Bureau\APK\Instant_Instal \" sur le périphérique et lance l'application.

0
Kailas

J'ai aussi essayé la chose de la 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-> Android setting, choisissez le fichier apk cible. Et puis vous obtenez tout ce que vous voulez, les informations de package, les informations d'activité.

0
wenwen

Comme il est mentionné dans la documentation Android que AAPT est obsolète, obtenir le nom du paquet à 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, j'ai dû télécharger une version plus récente de AAPT2, comme mentionné ici:

Téléchargez AAPT2 depuis Google Maven

À l'aide des outils de compilation de mon sdk - 25.0.3, 26.0.1 et 27.0.3, l'exécution de la commande aapt2 indique une erreur: Impossible d'ouvrir 'nom_package': Aucun fichier ni répertoire de ce type. C'est pourquoi j'ai opté pour les nouvelles versions de AAPT2.

J'ai utilisé 3.3.0-5013011 pour Linux.

0
user198530

vous pouvez installer Package_Name_Viewer.apk sur votre émulateur, puis vous pouvez voir le nom du paquet de toutes les applications installées sur votre émulateur.

0
esideli