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?
aapt dump badging <path-to-apk> | grep package:\ name
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
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é.
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
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
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!
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)
aapt
- Android Asset Packaging Tool, composant du Téléchargement du SDK Tools
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.
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.
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
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.
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"
Il existe un moyen très simple de placer votre APPS sur votre smartphone. Il suffit d'utiliser l'une de ces applications:
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.
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:
package: name='([a-z0-9.]*)'.*
et remplacez-le par le premier (et seul) groupe correspondant.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.
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.
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).
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
Pour que vous puissiez écrire:
adb désinstaller `./getPackageName.sh fichier.apk`
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:
%adb% install %apk%
installe l'application si le périphérique est connecté.%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.extracts the package name and assigns to
pkgName` variable%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.
J'ai aussi essayé la chose de la compilation, ça marche mais récemment j'ai trouvé le moyen le plus simple:
Téléchargez et installez Appium à partir du Site Web Appium
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é.
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.
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.