Android package name как получить

Получение списка приложений в Android

Android SDK предоставляет много средств для работы с системой. В том числе он позволяет получать список приложений, которые установлены на устройстве. Это может быть полезно, когда нужно получить сведения о сторонних приложениях (размер APK, путь до приложения, имя пакета и т.д.). Например, в наших приложениях получение списка, содержащего сторонние приложения, играет большую роль: в GreenBro с помощью этого списка выводятся сведения о приложениях, а также выполняются различные действия.

В Менеджере системных приложений и APK Extractor же список приложений необходим, чтобы удалять приложения и извлекать APK из приложений соответственно.

В этой статье мы рассмотрим, как можно получать список приложений, установленных на устройстве, а также как происходит установка приложений на устройство.

Класс PackageManager

PackageManager предоставляет API, который фактически управляет установкой, удалением и обновлением приложений. Когда мы устанавливаем файл APK, PackageManager анализирует этот APK и выводит результат.

Получить экземпляр класса PackageManager можно с помощью метода getPackageManager(). PackageManager предоставляет методы для запросов к установленным пакетам и соответствующим разрешениям.

Где хранятся файлы APK на Android?

В зависимости от типа данных, на Androiid файлы могут храниться в следующих местах:

  • Предустановленные и системные приложения (Камера, Браузер и т.д.) хранятся в /system/app/
  • Установленные пользователем приложения хранятся в /data/app/
  • PackageManager создаёт каталог /data/data/ / для хранения базы данных, файлов с предпочтениями, нативных библиотек и кеша.

Как PackageManager хранит информацию о приложении?

Менеджер пакетов хранит информацию о приложении в трёх файлах, расположенных в /data/system.

packages.xml

Этот XML-файл содержит список разрешений и пакеты\приложения. Он хранит две вещи: разрешения и пакет. Например:

Разрешения хранятся в теге

. Каждое разрешение имеет три атрибута: name, package и protection. Атрибут name это имя разрешения, которое мы используем в AndroidManifest.xml. Атрибут package указывает на пакет, которому принадлежит разрешение, в большинстве случаев это «android». Атрибут protection указывает на уровень безопасности.

содержит 10 атрибутов и несколько подтегов.

Атрибут Описание
name Имя пакета
codePath Путь установки APK
nativeLibraryPath Нативная библиотека, расположенная по умолчанию в /data/data/ /lib
flag Хранит флаги ApplicationInfo
ft Время в шестнадцатtричном формате
lt Время установки в шестнадцатеричном формате
ut Время последнего обновления в шестнадцатеричном формате
version Код версии из AndroidManifest.xml
sharedUserId Идентификатор пользователя Linux, который будет использоваться совместно с другими приложениями.
userId Идентификатор пользователя Linux

Подтеги же здесь следующие:

  • представляет собой информацию о сигнатуре, атрибут count — количество тегов .
  • это ключ сертификата, атрибут index представляет собой глобальный индекс сертификата.

содержат разрешения, которые разработчик установил в AndroidManifest.xml

packages.list

Это простой текстовый файл, содержащий имя пакета, идентификатор пользователя, флаги и каталог data.

package-stopped.xml

Этот файл содержит список пакетов, которые были остановлены. Остановленные приложения не могут принимать широковещательные сообщения.

Получаем список приложений

Рассмотрим получение списка установленных приложений на примере GreenBro.

При запуске приложения запускается AsyncTask, внутри которого получаем экземпляр PackageManager и затем копируем в список List все данные об установленных приложениях.

Метод getInstalledApplications() принимает в качестве параметра флаг GET_META_DATA, который определяет, что нам нужные метаданные каждого пакета.

Результатом является список объектов ApplicationInfo для каждого установленного приложения. Класс ApplicationInfo предоставляет подробную информацию о пакете, собранную из тега в AndroidManifest.xml, нам оттуда нужны лишь самые важные данные.

Поэтому в цикле проверяем каждый объект из полученного списка и записывать данные в собственный класс AppInfo, чтобы затем использовать в основном потоке.

Здесь с помощью метода getPackageInfo() класса PackageManager мы получаем общую информацию о приложении по заданному имени пакета. После эта информация объединяется с информацией, полученной от getInstalledApplications() и сохраняется в объекте AppInfo со следующими полями:

  • title — название приложения
  • packageName — имя пакета
  • sourceDir — полный путь до APK приложения
  • publicSourceDir — путь до общедоступных частей sourceDir
  • versionName — имя версии
  • isSystem — определяет, является ли приложение системным
  • size — размер приложения (в удобной форме)
  • longSize — размер приложения в long
  • dataDir — полный путь к каталогу data
  • nativeLibraryDir — путь до нативных библиотек
  • modified — дата последнего изменения
  • firstInstallTime — дата установки
  • lastUpdateTime — дата последнего обновления
  • enabled — определяет, включено ли приложение

Чтобы узнать название приложения, можно также воспользоваться PackageManager, как показано ниже.

Проверка же на то, является ли приложение системным, тоже достаточно проста и показана ниже.

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

Получение списка приложений в Android : 4 комментария

Подскажите пожалуйста, в конструкции:
final PackageManager pm = context.getPackageManager();
List apps = new ArrayList();
List packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
Чем является «context»?

Это локальная переменная, Вы можете передавать контекст из активити или фрагмента

» List packages = pm.getInstalledApplications( »

а есть ли функция наподобие getRunnedApplications(), которая выдает список запущенных последних приложений?

как отличить приложение от сервиса? Проверка на системное приложение не помогает

Источник

Прочитайте имя пакета Android APK

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

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

19 ответов

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

connect используя adb, вы можете запустить adb shell и выполнить PM list packages-f, который показывает имя пакета для каждого установленного apk.

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

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

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

Если вы смотрите на google play и хотите узнать его имя пакета, вы можете посмотреть url или адресную строку. Вы получите имя пакета. Вот!—1—> — имя пакета

следующий скрипт bash отобразит имя пакета и основное имя действия:

apk_package.sh

запустите его так:

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

если вы хотите увидеть только строку с package: name информация, использовать findstr

aapt dump badging

| findstr -n «package: name» | findstr «1:»

надеюсь, что это поможет другому пользователю windows!

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

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

пример: com.example.appname (и ничего еще)

требования

aapt — Android инструмент упаковки активов, часть SDK Tools загрузить

Решение 1

используя awk указать ‘ в качестве разделителя полей найдите строку с package: name= , и напечатать только 2-е «поле» в строку:

недостатком этого метода является то, что он полагается на aapt для вывода информационных полей пакета в том же порядок:

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

решение 2

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

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

решение 3

разверните файл apk с помощью apktool d и прочитайте AndroidManifest.XML.

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

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

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

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

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

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

вы можете извлечь AndroidManifest.xml из APK, удалите все нулевые байты, пропустите все до тех пор, пока после строки «манифест», а затем вы находитесь в байте длины, за которым следует имя пакета (и что происходит после него). Для трудной задачи я использую великое гема tool, поэтому команда выглядит так:

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

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

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

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

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

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

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

чтобы использовать это в пакетных сценариях, удобно, чтобы скрипт возвращал только имя пакета (например, для удаления приложения, когда у вас есть APK).

вот скрипт, который я использую:

чтобы вы могли написать:

ADB uninstall`. /getPackageName.sh файл.apk’

для Windows следующее работало для меня:

Примечание

пожалуйста, отредактируйте пути АБР, aapt, APKPath по пути АБР, aapt, и место АПК в вашей системе.

работает:

  • здесь я добавил 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) установите pkgName=%%s extracts the package name and assigns to переменная pkgName
  • наконец-то %adb% shell monkey -p %pkgName% -c android.intent.category.LAUNCHER 1 запускает приложение.

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

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

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

список aapt — «path_to_apk» > файл.txt

Источник

Как получить имя пакета из любого места?

Мне известно о доступности Context.getApplicationContext () и View.getContext () , через которые я могу фактически вызвать Context.getPackageName (), чтобы получить имя пакета приложения.

Они работают, если я вызываю метод, к которому доступен объект View или Activity , но если я хочу найти имя пакета из полностью независимого класса без View или Activity , есть ли способ сделать это (прямо или косвенно )?

Идея состоит в том, чтобы иметь статическую переменную в вашем основном действии, созданную как имя пакета. Тогда просто укажите эту переменную.

Вам нужно будет инициализировать его в onCreate() основной деятельности:

Затем вы можете получить доступ к нему через Main.PACKAGE_NAME .

Если вы используете плагин gradle-android-plugin для создания своего приложения, вы можете использовать

Для получения имени пакета из любой области, в том числе. Статический.

Если со словом «где угодно» вы имеете в виду без явного Context (например, из фонового потока), вы должны определить класс в своем проекте, например:

Затем в manifest вам нужно добавить этот класс в поле « Name на вкладке « Application ». Или отредактируйте xml и поставьте

А затем из любого места, где вы можете позвонить

Если вы используете сборку градиентов, используйте это: BuildConfig.APPLICATION_ID чтобы получить имя пакета приложения.

Создайте Java-модуль, который будет первоначально запускаться при запуске вашего приложения. Этот модуль будет расширять класс приложения Android и будет инициализировать любые глобальные переменные приложения, а также содержать общедоступные подпрограммы приложения –

Конечно, это может включать логику для получения имени пакета из системы Android; Однако вышеизложенное является меньшим, быстрым и чистым кодом, чем получение его от android.

Обязательно поместите запись в свой файл AndroidManifest.xml, чтобы сообщить Android для запуска вашего прикладного модуля, прежде чем запускать какие-либо действия –

Затем, чтобы получить имя пакета из любого другого модуля, введите

Использование модуля приложения также дает вам контекст для модулей, которые нуждаются, но не имеют контекста.

Источник

Читайте также:  Rocket league mod android
Оцените статью