Прочтите название пакета Android APK

Мне нужно получить название пакета Android APK. Я попытался разархивировать APK и прочитать содержимое AndroidManifest.xml, но мне кажется, что это не текстовый файл.

Как я могу извлечь имя пакета APK?


person Dagang    schedule 09.06.2011    source источник


Ответы (24)


Вы можете установить apk на свой телефон, затем

подключиться с помощью adb, вы можете запустить оболочку adb и выполнить pm list packages -f, который показывает имя пакета для каждого установленного apk.

Это взято из Найдите имя пакета для приложений Android, чтобы использовать намерение для запуска приложения Market из Интернета

person Danail    schedule 09.06.2011
comment
Кроме того, вам нужно будет убедиться, что вы работаете с повышенными привилегиями. Обычно в терминале сначала используйте команду su. - person palswim; 08.08.2013
comment
для поиска определенного имени пакета 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!

person equiman    schedule 19.05.2016

Если вы смотрите в Google Play и хотите узнать название его пакета, вы можете посмотреть URL-адрес или адресную строку. Вы получите название пакета. Здесь com.landshark.yaum - имя пакета

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

Если вы откроете AndroidManifest.xml с помощью MS Notepad, найдите фразу package, и вы найдете следующее:

package manifest $xxx.xxxxxxx.xxxxxxx |

где xxx.xxxxxxx.xxxxxxx - имя вашего пакета, просто записанное с пробелом после каждого символа.

Это полезно, когда у вас не установлены какие-либо специальные инструменты.

person Wojciech    schedule 27.09.2012
comment
Это особенно полезно, если код приложения находится на github! Намного проще, чем другие методы, спасибо! - person sarink; 03.05.2017
comment
Я распаковал APK, но AndroidManifest.xml был двоичным файлом. Странно, но факт. - person phatmann; 26.01.2020

Следующий сценарий 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
person Brad Parks    schedule 05.07.2013
comment
Никогда не комбинируйте grep и sed с awk. Достаточно использовать awk. - person Bruno Bronosky; 01.09.2015

Программный ответ

Если вам нужно сделать это программно, это немного сложнее, чем просто получить ответ в ваш мозг. У меня есть сценарий, который я использую для подписи всех наших приложений, но в каждом из них используется свой ключ. Вот два способа получить только имя пакета в качестве вывода, чтобы вы могли поместить его в переменную или делать с ним все, что вам нужно.

Пример вывода: com.example.appname (и ничего больше)

Требования

aapt - Android Asset Packaging Tool, часть загрузки инструментов SDK

Решение 1

Используя 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'

У нас нет обязательств со стороны разработчиков поддерживать этот формат.

Решение 2

Используя awk, укажите " в качестве разделителя полей, найдите строку с package= и распечатайте только второе «поле» в строке:

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

Слабым местом этого метода является то, что он полагается на aapt для вывода package= только в разделе Android Manifest: вывода. У нас нет обязательств со стороны разработчиков поддерживать этот формат.

Решение 3

Разверните файл apk apktool d и прочтите AndroidManifest.xml.

Это был бы лучший метод, но AndroidManifest.xml - это двоичный файл, и все ответы SO, которые я вижу для преобразования его в текст, не работают. (Использование apktool d вместо простого unzip должно сделать это за вас, но это не так.) Прокомментируйте, если у вас есть решение этой проблемы

person Bruno Bronosky    schedule 26.05.2015
comment
Спасибо за то, что вы дали больше информации для понимания, а не просто дали одну строку команды для копирования. - person alizeyn; 18.08.2019

Простым решением будет Open Android Studio -> Build -> Analyze Apk ... просмотрите и выберите APK, теперь вы можете найти имя пакета и в значительной степени вы можете прочитать.

person Sai    schedule 28.06.2018

Поскольку в документации 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.

person user198530    schedule 18.01.2019

Если у вас не установлен 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.

person mmccabe    schedule 24.06.2019
comment
Это имя пакета Java класса Mainactivity, хотя оно может не совпадать с именем пакета приложения. - person Mattias Isegran Bergander; 18.12.2020

Если вы просто хотите узнать имя пакета, запустите adb logcat, запустите нужное действие, вы получите подсказку по имени пакета.

person sat    schedule 09.06.2011

Другое решение - использовать список aapt и использовать sed для его анализа:

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

person JohnnyLambada    schedule 11.02.2014
comment
Имя группы пакетов только случайно совпадает с именем пакета в некоторых приложениях. Вам действительно нужно использовать 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/"

Объяснение:

  1. AAPT извлекает информацию APK
  2. Grep "package", чтобы сохранить только строку с информацией о пакете
  3. Сделайте так, чтобы sed заменил всю строку именем пакета только с помощью следующего регулярного выражения: package: name='([a-z0-9.]*)'.* и заменив его первой (и единственной) совпадающей группой.
person m0skit0    schedule 17.07.2015

Есть очень простой способ, если у вас уже есть APK-файл на вашем смартфоне. Просто используйте одно из этих приложений:

приложения для просмотра имен пакетов

person Hexodus    schedule 16.03.2017

Очень простой способ - использовать apkanalyzer.

apkanalyzer manifest application-id "${_path_to_apk}"
person William George    schedule 11.09.2019

Вы можете использовать Analyze APK... из меню «Сборка» в Android Studio, имя пакета будет отображаться в верхней части нового окна.

person Daniel Zolnai    schedule 12.02.2020

Чтобы использовать это в пакетном сценарии, удобно, чтобы сценарий возвращал только имя пакета (например, для удаления приложения, когда у вас есть 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

доступно в gist

Итак, вы могли написать:

adb удалить `./getPackageName.sh file.apk`

person Ben Clayton    schedule 26.11.2015

Вы можете извлечь 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}'

Конечно, вы можете использовать любой другой инструмент для фильтрации.

person Hartmut Schäfer    schedule 22.01.2017

Вы можете получить имя пакета программно:

packageManager.getPackageArchiveInfo(apkFilePath, 0)?.packageName
person Saurabh Padwekar    schedule 16.12.2020

вы можете установить Package_Name_Viewer.apk на свой эмулятор, и затем вы увидите имя пакета для всех установленных приложений на вашем эмуляторе.

person esideli    schedule 27.01.2015

Я также пробовал декомпиляцию, она работает, но недавно я нашел самый простой способ:

  1. Загрузите и установите Appium с веб-сайта Appium

  2. Откройте настройки Appium-> Android, выберите целевой файл apk. И тогда вы получите все, что хотите, информацию о пакете, информацию о деятельности.

person wenwen    schedule 16.07.2015

Для 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 в вашей системе.

Работает:

  • Здесь я добавил apk в папку на рабочем столе "\ Desktop \ APK \ Instant_Instal \".
  • Команда %adb% install %apk% устанавливает приложение, если устройство подключено.
  • Этот %aapt% dump badging %APKFullPath% | FIND "package: name=" > temp.txt извлекает имя пакета и некоторые другие детали, такие как версия apk и т. Д., И сохраняет их в файле temp.txt в том же месте, что и apk.
  • FOR / F "tokens = 2 delims = '" %% s IN (temp.txt) DO SET pkgName = %% sextracts the package name and assigns topkgName` переменная
  • Наконец %adb% shell monkey -p %pkgName% -c android.intent.category.LAUNCHER 1 запускает приложение.

По сути, приведенный выше код устанавливает apk из заданного места на рабочем столе «Desktop \ APK \ Instant_Instal \» на устройство и запускает приложение.

person Kailas    schedule 14.05.2018

Поскольку мне не удалось найти имя пакета в файле .apk с помощью редактора (как предложено выше), я проверил функции в приложении «ES Datei Explorer» / «ES File Explorer» (бесплатная версия), которые я уже установил. В этом инструменте имя пакета отображается правильно.
Поскольку я думаю, что хороший файловый проводник не должен отсутствовать на телефоне, я предлагаю использовать этот инструмент (если вы уже установили apk на мобильный телефон и должны знать название пакета).

person FredyWenger    schedule 08.08.2018

На 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
person Francis Bacon    schedule 18.11.2020

person    schedule
comment
Есть ли способ вызвать это из кода Android? Я хочу иметь возможность запускать пакет apk, который я загружаю через свое приложение. - person Matt Wear; 19.06.2012
comment
значок дампа приложения ‹path-to-apk› | пакет grep: \ имя - person herbertD; 11.03.2013
comment
@Campiador, вы можете просто набирать до трубы |, нажимать ввод, а затем просто искать в выводе нужный параметр. Просто помните, что aapt должен быть на вашем пути - person avalancha; 14.11.2014
comment
См. Мой ответ ниже, если вам нужно получить это программно (для сценария). - person Bruno Bronosky; 27.05.2015
comment
@Campiador: для Windows использует команду findstr вместо grep - person Paul; 10.06.2015
comment
Проголосовали, несмотря на то, что он извлекает всю строку, а не только имя пакета, что, к сожалению, не подходит для моего скрипта. Но это поставило меня на правильный путь. - person m0skit0; 17.07.2015
comment
@hackbod Я разместил вопрос и хотел бы получить комментарий от кого-то из Google. Надеюсь, у вас будет время ответить stackoverflow.com/q / 36614857/1503130 спасибо. - person Prateek; 14.04.2016
comment
Команда 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
comment
apkanalyzer можно найти в папке Android / sdk / tools / bin. Используйте apkanalyzer manifest application-id <APKFILE>, чтобы распечатать имя пакета apk. - person Febin; 01.11.2018
comment
aapt в macOS, находящейся в ~/Library/Android/sdk/build-tools/{version} - person HendraWD; 17.01.2021