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


200

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

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

Ответы:


320
aapt dump badging <path-to-apk> | grep package:\ name

1
Есть ли способ вызвать это из кода Android? Я хочу иметь возможность запустить пакет apk, который я загружаю через мое приложение.
— Мэтт Уир

7
значок дампа appt <path-to-apk> | пакет grep: \ name
— herbertD

2
@Campiador вы можете просто набрать до трубы |, нажмите Enter, а затем просто искать выход для нужного параметра. Просто помните, что aaptдолжно быть на вашем пути
— Патрик

Смотрите мой ответ ниже, если вам нужно получить это программно (для сценария).
— Бруно Броноски

15
aaptКоманда находится под Android\SDK\build-tools\version. на окнах команда может быть aapt dump badging <path-to-apk> | findstr -i "package: name"илиaapt dump badging <path-to-apk>
— Эквиман

75

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

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

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


1
Кроме того, вам необходимо убедиться, что вы работаете с повышенными привилегиями. В основном, в терминале suсначала используйте команду.
— Palswim

4
искать конкретное имя пакетаpm list packages -f | grep term-to-search-for
— Патрик Фавр

14

Основано на ответе @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!


13

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

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

12

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

package manifest $xxx.xxxxxxx.xxxxxxx |

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

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


Это особенно полезно, если код приложения находится на github! Гораздо проще, чем другие методы, спасибо!
— Саринк

1
Я распаковал APK, но AndroidManifest.xml был двоичным файлом. Странно, но это правда.
— phatmann

12

Следующий скрипт 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

Никогда не комбинируйте grep и sed с awk. Использование awk достаточно.
— Бруно Броноски

8

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

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

Пример вывода: 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=и выведите только 2-е «поле» в строке:

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

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

Решение 3

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

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


1
Спасибо за предоставление дополнительной информации для понимания, а не просто за одну строку команды для копирования.
— Али Зейнали

4

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


2

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


2

Другое решение состоит в том, чтобы использовать список 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
— Бруно Броноски



1

Я думаю, что лучший и самый простой способ извлечь только имя пакета в Linux

aapt dump badging <APK_path> | grep package | sed -r "s/package: name='([a-z0-9.]*)'.*/\1/"

Объяснение:

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

1

Вы можете извлечь AndroidManifest.xml из APK, удалить все NULL-байты, пропустить все до тех пор, пока после строки 'manifest' не будет получен длинный байт, за которым следует имя пакета (и то, что следует за ним). Для сложной задачи я использую отличный инструмент GEMA , поэтому команда выглядит так:

7z e -so MyApp.apk AndroidManifest.xml | gema '\x00=' | gema -match 'manifest<U1><U>=@substring{0;@char-int{$1};$2}'

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


1

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


0

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


0

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

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

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


0

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


0

Для 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 "токены = 2 delims = '" %% s IN (temp.txt) DO SET pkgName = %% s extracts the package name and assigns topkgName` переменная
  • Наконец %adb% shell monkey -p %pkgName% -c android.intent.category.LAUNCHER 1запускает приложение.

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


0

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


0

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


0

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


-1

список приложений -a "path_to_apk"

Я рекомендую вам сохранить его в формате .txt, потому что он может быть очень длинным. Так:

aapt list -a "path_to_apk"> file.txt

Затем посмотрите файл file.txt в вашем текущем каталоге.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.