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


200

Мені потрібно отримати назву пакета Android APK. Я спробував розпакувати APK і прочитати вміст AndroidManifest.xml, але, схоже, це не текстовий файл.

Як я можу отримати назву пакета APK?

Відповіді:


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

1
Чи є можливість зателефонувати це з коду Android? Я хочу мати змогу запустити пакет програм, які я завантажую через свій додаток.
— Matt Wear

7
appt дамп значки <шлях-то-apk> | grep package: \ name
— herbertD

2
@Campiador ви можете просто набрати, поки не |натисніть трубу , натисніть клавішу Enter, а потім просто шукайте вихідний потрібний параметр. Пам’ятайте лише, що aaptвам слід на шляху
— Патрік

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

15
aaptкоманда знаходиться під Android\SDK\build-tools\version. командою на Windows може бути 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 відповіді ... але пов'язана з Windows.

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! Набагато простіше, ніж інші методи, дякую!
— sarink

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

Ніколи не поєднуйте греп і sed з awk. Використання awk досить.
— Бруно Броноський

8

Програмна відповідь

Якщо вам потрібно це зробити програмно, це трохи більше, ніж просто отримання відповіді в ваш мозок. У мене є сценарій, за допомогою якого я підписую всі наші програми, але кожен використовує інший ключ. Ось два способи отримати лише ім'я пакета як вихід, щоб ви могли помістити його в змінну або зробити з нею все необхідне.

Приклад виводу: 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}'

Слабкою стороною цього методу є те, що він покладається на aapt для виведення package=тільки в Android Manifest:розділі виводу. Ми не беремо на себе зобов’язань розробників підтримувати цей формат.

Рішення 3

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

Це був би найкращий метод, але AndroidManifest.xml - це двійковий файл, і всі відповіді ТА, які я бачу для перетворення його в текст, не працюють. (Використання apktool dзамість простого unzipпередбачається зробити це для вас, але це не так.) Будь ласка, коментуйте, якщо у вас є рішення цієї проблеми


1
Дякуємо, що надали більше інформації для розуміння, а не просто надання одного командного рядка для копіювання.
— Алі Зейналі

4

Простим рішенням буде Open 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
— Бруно Bronosky



1

Я думаю, що найкращий і найпростіший спосіб вилучити лише ім'я пакета в Linux - це

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

Пояснення:

  1. AAPT витягує інформацію APK
  2. Зніміть "пакет", щоб зберегти лише рядок про інформацію про пакет
  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

Якщо у вас немає встановленого пакета SDK для Android, як, наприклад, у деяких тестових сценаріях, ви можете отримати ім'я пакета за допомогою наступного методу 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. 'рядки' і 'разархівувати' є стандартними для більшості 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 uninstall `./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 "tokens = 2 delims = '" %% s IN (temp.txt) extracts the package name and assigns toВстановіть змінну pkgName = %% s pkgName`
  • Нарешті %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...з меню "Створення" в Android Studio, воно відобразить назву пакета вгорі нового вікна.


-1

aapt list -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.