Мне нужно получить имя пакета Android APK. Я попытался разархивировать APK и прочитать содержимое AndroidManifest.xml
, но кажется, что это не текстовый файл.
Как я могу извлечь имя пакета APK?
Мне нужно получить имя пакета Android APK. Я попытался разархивировать APK и прочитать содержимое AndroidManifest.xml
, но кажется, что это не текстовый файл.
Как я могу извлечь имя пакета APK?
aapt dump badging <path-to-apk> | grep package:\ name
Вы можете установить apk на свой телефон, затем
подключиться с помощью adb, вы можете запустить оболочку adb и выполнить пакеты списка pm -f, в котором указано имя пакета для каждого установленного apk.
Это взято из Найти имя пакета для приложений Android, чтобы использовать Intent для запуска приложения Market из Интернета
Если вы смотрите на игру Google и хотите узнать ее имя пакета, вы можете посмотреть адресную строку или адресную строку. Вы получите имя пакета. Здесь com.landshark.yaum
- это имя пакета
https://play.google.com/store/apps/details?id=com.landshark.yaum&feature=search_result#?t=W251bGwsMSwyLDEsImNvbS5sYW5kc2hhcmsueWF1bSJd
Если вы открываете AndroidManifest.xml с помощью MS Notepad, ищите фразу package
, и вы найдете следующее:
package manifest $xxx.xxxxxxx.xxxxxxx |
где xxx.xxxxxxx.xxxxxxx - это ваше имя пакета, просто написанное пробелом после каждого символа.
Это полезно, когда у вас нет определенных установленных инструментов.
Следующий скрипт bash отобразит имя пакета и имя основного действия:
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"
запустите это так:
apk_package.sh /path/to/my.apk
На основании ответа @hackbod... но связанного с окнами.
Команда aapt
находится на Android\SDK\build-tools\version
.
Если вам нужна дополнительная информация о том, что такое appt command
(Android Asset Packaging Tool), прочитайте это fooobar.com/questions/44058/...
Подкоманда dump
aapt
используется для отображения значений отдельных элементов или частей пакета:
aapt dump badging <path-to-apk>
Если вы хотите видеть только строку с информацией package: name
, используйте findstr
aapt dump badging <path-to-apk> | findstr -n "package: name" | findstr "1:"
Надеемся, что это поможет другим пользователям Windows!
Если вам нужно сделать это программно, это немного больше, чем просто получить ответ в ваш мозг. У меня есть script, который я использую для подписания всех наших приложений, но каждый использует другой ключ. Вот два способа получить только имя пакета как вывод, чтобы вы могли поместить его в переменную или сделать все, что вам нужно.
Пример вывода: com.example.appname
(и ничего более)
aapt
- Инструмент упаковки приложений для Android, часть Загрузка SDK файлов
Используя awk
укажите '
в качестве разделителя полей, найдите строку с package: name=
и напечатайте только 2-е поле в строке:
aapt dump badging /path/to/file.apk | awk -v FS="'" '/package: name=/{print $2}'
Слабостью этого метода является то, что он полагается на aapt для вывода полей информации пакета в том же порядке:
package: name='com.example.appname' versionCode='3461' versionName='2.2.4' platformBuildVersionName='4.2.2-1425461'
У нас нет обязательств от разработчиков поддерживать этот формат.
Используя awk
укажите "
в качестве разделителя полей, найдите строку с package=
и напечатайте только 2-е "поле" в строке:
aapt list -a /path/to/file.apk | awk -v FS='"' '/package=/{print $2}'
Слабостью этого метода является то, что он полагается на aapt для вывода package=
только в разделе Android Manifest:
вывода. У нас нет обязательств от разработчиков поддерживать этот формат.
Разверните файл apk с помощью apktool d
и прочитайте файл AndroidManifest.xml.
Это был бы лучший способ, но AndroidManifest.xml - это двоичный файл, и все ответы SO, которые я вижу для преобразования его в текст, не работают. (Использование apktool d
вместо простого unzip
должно сделать это для вас, но это не так.) Прокомментируйте, если у вас есть решение этой проблемы
Если вы просто хотите узнать имя пакета, запустите adb logcat, запустите нужную операцию, вы получите подсказку о названии пакета.
Другим решением является использование списка aapt и использование sed для его анализа:
aapt list -a $PATH_TO_YOUR_APK | sed -n "/^Package Group[^s]/s/.*name=//p"
Там очень простой способ, если вы получили свой APK allready на своем смартфоне. Просто используйте один из этих APP:
Простым решением было бы открыть Android Studio → Build → Analyze Apk..., просмотреть и выбрать APK, теперь вы можете найти имя пакета и почти все, что можете прочитать.
Я думаю, что лучший и самый простой способ извлечь только имя пакета в Linux -
aapt dump badging <APK_path> | grep package | sed -r "s/package: name='([a-z0-9.]*)'.*/\1/"
Пояснение:
package: name='([a-z0-9.]*)'.*
и заменить на первую (и только) соответствующую группу.Вы можете извлечь AndroidManifest.xml из APK, удалить все NULL байты, пропустить все до тех пор, пока не появится строка "манифест", а затем вы находитесь в байте длины, за которым следует имя пакета (и что происходит после него). Для трудной задачи я использую большой GEMA, поэтому команда выглядит следующим образом:
7z e -so MyApp.apk AndroidManifest.xml | gema '\x00=' | gema -match 'manifest<U1><U>[email protected]{0;@char-int{$1};$2}'
Конечно, вы можете использовать любой другой инструмент для фильтрации.
вы можете установить Package_Name_Viewer.apk на свой эмулятор, а затем вы можете увидеть имя пакета для всех установленных приложений на вашем эмуляторе.
Я также попробовал декомпилировать, он работает, но в последнее время я нашел самый простой способ:
Загрузите и установите Appium из веб-сайт Appium
Откройте приложение Appium- > Android, выберите целевой файл apk. И затем вы получите все, что хотите, информацию о пакете, информацию о деятельности.
Чтобы использовать это при пакетном сценарии, удобно, чтобы script возвращал только имя пакета (например, для удаления приложения, когда у вас есть APK).
Здесь script я использую:
# 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
Итак, вы можете написать:
adb uninstall `./getPackageName.sh file.apk`
Для Windows у меня работает следующее:
:: // 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
Заметка
Отредактируйте пути adb, aapt, APKPath в соответствии с путями adb, aapt и местоположением apk в вашей системе.
За работой:
%adb% install %apk%
устанавливает приложение, если устройство подключено.%aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txt
%aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txt
извлекает имя пакета и некоторые другие детали, такие как версия и т.д. Apk, и сохраняет их в файле temp.txt в том же месте, что и apk.extracts the package name and assigns to
переменной pkgName'%adb% shell monkey -p %pkgName% -c android.intent.category.LAUNCHER 1
запускает приложение.По сути, вышеприведенный код устанавливает apk из указанного местоположения на рабочем столе "Desktop\APK\Instant_Instal \" на устройство и запускает приложение.
Так как мне не удалось найти имя пакета в файле .apk с редактором (как предложено выше), я проверил функции в приложении "ES Datei Explorer"/"ES File Explorer" (бесплатная версия), которые я уже установлен. В этом инструменте имя пакета отображается правильно.
Так как я думаю, что хороший телефонный проводник не должен отсутствовать на телефоне, я предлагаю использовать этот инструмент (если вы уже установили apk на мобильный и должны знать имя пакета).
Поскольку в документации Android указано, что AAPT устарел, получение имени пакета с помощью команды AAPT2 в Linux выглядит следующим образом:
./aapt2 dump packagename <path_to_apk>
Поскольку я использую более старую версию сборки Gradle, мне пришлось загрузить более новую версию AAPT2, как указано здесь:
Загрузите AAPT2 из Google Maven
При использовании инструментов сборки в моем SDK - 25.0.3, 26.0.1 и 27.0.3 при выполнении команды aapt2 выдается ошибка: Невозможно открыть "имя_пакета": такого файла или каталога нет. Вот почему я пошел на более новые версии AAPT2.
Я использовал 3.3.0-5013011 для Linux.
Если у вас не установлен Android SDK, как в некоторых тестовых сценариях, вы можете получить имя пакета, используя следующий метод 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"
}
Проверено на Mac. 'strings' и 'unzip' являются стандартными в большинстве Linux, поэтому должны работать и в Linux.
aapt list -a "path_to_apk"
Я рекомендую вам сохранить его в .txt, потому что он может быть очень длинным. Итак:
aapt list -a "path_to_apk" > file.txt
Затем посмотрите файл file.txt в вашем текущем каталоге.