Прочитайте название пакета 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.