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