Мне нужно получить название пакета Android APK. Я попытался разархивировать APK и прочитать содержимое AndroidManifest.xml
, но мне кажется, что это не текстовый файл.
Как я могу извлечь имя пакета APK?
Мне нужно получить название пакета Android APK. Я попытался разархивировать APK и прочитать содержимое AndroidManifest.xml
, но мне кажется, что это не текстовый файл.
Как я могу извлечь имя пакета APK?
Вы можете установить apk на свой телефон, затем
подключиться с помощью adb, вы можете запустить оболочку adb и выполнить pm list packages -f, который показывает имя пакета для каждого установленного apk.
Это взято из Найдите имя пакета для приложений Android, чтобы использовать намерение для запуска приложения Market из Интернета
su
.
- person palswim; 08.08.2013
pm list packages -f | grep term-to-search-for
- person Patrick Favre; 08.04.2015
На основе ответа @hackbod ... но связано с окнами.
Команда aapt
расположена на Android\SDK\build-tools\version
. Если вам нужна дополнительная информация о appt command
(Android Asset Packaging Tool), прочтите https://stackoverflow.com/a/28234956/812915
Подкоманда dump
команды aapt
используется для отображения значений отдельных элементов или частей пакета:
aapt dump badging <path-to-apk>
Если вы хотите видеть только строку с информацией package: name
, используйте findstr
aapt dump badging <path-to-apk> | findstr -n "package: name" | findstr "1:"
Надеюсь, это поможет другим пользователям Windows!
Если вы смотрите в Google Play и хотите узнать название его пакета, вы можете посмотреть URL-адрес или адресную строку. Вы получите название пакета. Здесь 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
Если вам нужно сделать это программно, это немного сложнее, чем просто получить ответ в ваш мозг. У меня есть сценарий, который я использую для подписи всех наших приложений, но в каждом из них используется свой ключ. Вот два способа получить только имя пакета в качестве вывода, чтобы вы могли поместить его в переменную или делать с ним все, что вам нужно.
Пример вывода: com.example.appname
(и ничего больше)
aapt
- Android Asset Packaging Tool, часть загрузки инструментов 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=
и распечатайте только второе «поле» в строке:
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
должно сделать это за вас, но это не так.) Прокомментируйте, если у вас есть решение этой проблемы
Простым решением будет Open Android Studio -> Build -> Analyze Apk ... просмотрите и выберите 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 показывает ошибку: Невозможно открыть «packagename»: нет такого файла или каталога. Вот почему я выбрал более новые версии 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.
Если вы просто хотите узнать имя пакета, запустите adb logcat, запустите нужное действие, вы получите подсказку по имени пакета.
Другое решение - использовать список aapt и использовать sed для его анализа:
aapt list -a $PATH_TO_YOUR_APK | sed -n "/^Package Group[^s]/s/.*name=//p"
A:package="com.example.appname"
в разделе Android Manifest:
, если вы делаете aapt list -a
- person Bruno Bronosky; 26.05.2015
Я думаю, что лучший и самый простой способ извлечь только имя пакета в Linux - это
aapt dump badging <APK_path> | grep package | sed -r "s/package: name='([a-z0-9.]*)'.*/\1/"
Объяснение:
package: name='([a-z0-9.]*)'.*
и заменив его первой (и единственной) совпадающей группой.Есть очень простой способ, если у вас уже есть APK-файл на вашем смартфоне. Просто используйте одно из этих приложений:
приложения для просмотра имен пакетов
Очень простой способ - использовать apkanalyzer.
apkanalyzer manifest application-id "${_path_to_apk}"
Вы можете использовать Analyze APK...
из меню «Сборка» в Android Studio, имя пакета будет отображаться в верхней части нового окна.
Чтобы использовать это в пакетном сценарии, удобно, чтобы сценарий возвращал только имя пакета (например, для удаления приложения, когда у вас есть APK).
Вот сценарий, который я использую:
# 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 удалить `./getPackageName.sh file.apk`
Вы можете извлечь AndroidManifest.xml из APK, удалить все байты NULL, пропустить все, пока не будет строка «manifest», а затем вы увидите байт длины, за которым следует имя пакета (и то, что идет после него). Для выполнения сложной задачи я использую отличный GEMA tool, поэтому команда выглядит так:
7z e -so MyApp.apk AndroidManifest.xml | gema '\x00=' | gema -match 'manifest<U1><U>=@substring{0;@char-int{$1};$2}'
Конечно, вы можете использовать любой другой инструмент для фильтрации.
Вы можете получить имя пакета программно:
packageManager.getPackageArchiveInfo(apkFilePath, 0)?.packageName
вы можете установить Package_Name_Viewer.apk на свой эмулятор, и затем вы увидите имя пакета для всех установленных приложений на вашем эмуляторе.
Я также пробовал декомпиляцию, она работает, но недавно я нашел самый простой способ:
Загрузите и установите Appium с веб-сайта Appium
Откройте настройки Appium-> Android, выберите целевой файл 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
извлекает имя пакета и некоторые другие детали, такие как версия 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 на мобильный телефон и должны знать название пакета).
На Mac:
Способ 1:
zgong$ /Users/zgong/Library/Android/sdk/build-tools/29.0.3/aapt dump badging ~/Downloads/NonSIMCC-151-app-release-signed.apk
package: name='com.A.B' versionCode='2020111801' versionName='1.0.40' compileSdkVersion='29' compileSdkVersionCodename='10'
sdkVersion:'24'
targetSdkVersion:'29'
......
Способ 2:
/Users/zgong/Library/Android/sdk/build-tools/29.0.3/aapt2 dump packagename ~/Downloads/NonSIMCC-151-app-release-signed.apk
com.A.B
|
, нажимать ввод, а затем просто искать в выводе нужный параметр. Просто помните, что aapt
должен быть на вашем пути
- person avalancha; 14.11.2014
aapt
находится под Android\SDK\build-tools\version
. в Windows команда может быть aapt dump badging <path-to-apk> | findstr -i "package: name"
или aapt dump badging <path-to-apk>
- person equiman; 19.05.2016
apkanalyzer manifest application-id <APKFILE>
, чтобы распечатать имя пакета apk.
- person Febin; 01.11.2018
aapt
в macOS, находящейся в ~/Library/Android/sdk/build-tools/{version}
- person HendraWD; 17.01.2021