Получить имя пакета И общее имя приложений через ADB

Я ищу возможность получить как имена пакетов, так и общие имена приложений, установленных на устройстве Android через ADB, или, по крайней мере, получить общее имя, если имя пакета известно. Быстрый поиск на нашем сайте вызвал два связанных вопроса, но они не решают мою проблему:

Я ищу способ получить информацию непосредственно с устройства, если это возможно, а не «любым» способом (включая «поиск в Интернете» или «через приложение»), как это есть в этих двух вопросах.

Я знаю, что есть несколько инструментов для получения сведений о пакете:

  • adb dumpsys package: хотя в этом списке перечислены все пакеты с кучей деталей, «общее имя» не отображается.
  • adb shell pm list: дает только имена пакетов
  • aaptсможет получить общее имя, но потребует сначала извлечь .apkфайл с устройства, что не очень удобно (и, очевидно, будет довольно медленным с большим количеством установленных и/или больших приложений)

Я что-то пропустил? Я знаю, что информация должна быть на устройстве (как еще она может отображать имена приложений в графическом интерфейсе? Я сомневаюсь, что Android анализирует .apkфайл каждый раз, когда графическому интерфейсу требуется «общее имя»). Так есть ли способ получить его, используя ADB напрямую?


TL;DR

Предыстория (если кому-то интересно): я хочу иметь возможность быстро получить список пользовательских приложений с любого из моих устройств, не прибегая к акробатике. Список имен их пакетов я могу получить с помощью adb shell pm list -3, но, поскольку это только имена пакетов, распознавание приложений — дело догадок. Таким образом, если бы была какая-то команда ADB для получения общего имени для заданного имени пакета, я мог бы просто использовать цикл, например for pkg in $(adb shell pm list -3); do echo "- $(adb <whatever_the_command_is> $pkg) ($pkg)"; done— и получить список всех установленных пользовательских приложений в «удобочитаемом формате» вместе с именами их пакетов.

Сценарии использования:

  • Посмотрите, какие «лишние» приложения установлены (которые я мог бы удалить)
  • Списки перекрестных проверок с нескольких устройств
  • Документация ;)
  • и, возможно, больше (но вышеперечисленные 3 - это то, для чего мне это нужно)
Просто идея (думаю, вы уже пробовали?). Почему вы просто не компилируете aapt для Android и вместо этого запускаете его из оболочки? :D
@user3344236 user3344236 Я знаю о такой возможности; но не всегда есть возможность установить что-то на рассматриваемое устройство, особенно не самокомпилируемый двоичный файл (иногда я получаю сданные устройства, которые не имеют root-прав и должны поддерживать «криминалистические условия», т. е. «делать не изменяйте устройство, просто исследуйте его").
Итак, вторая идея состоит в том, чтобы написать себе инструмент, который запускается через оболочку adb... без использования модифицированного adbd на устройстве и без загрузки туда каких-то файлов. Я думаю, вам понадобится некоторое время, чтобы сделать это (если вы когда-нибудь добьетесь успеха) :D
@user3344236 user3344236 слишком тревожный, тем более что я не Android-разработчик. В настоящее время я использую «сетевое решение» (похожее на «поиск в Google Play»), поскольку здесь, похоже, нет собственного решения (пока?).
Привет Иззи! Учитывая комментарии (выше), означает ли это, что вам нужно решение, учитывающее нерутированное устройство?
@Firelord Предпочтительно да, хотя решения только для root были бы лучше, чем вообще ничего;)
Не то чтобы это было желаемым решением, но можно с уверенностью предположить, что на нерутированном устройстве, вероятно, будет активный магазин Google Play, и если это так, то вы можете получить по крайней мере несколько <APP_NAME> and <PKG_NAME>из баз данных ( localappstate.db) внутри него. Ты пробовал это? Я не проверял, распространяется ли резервное копирование ADB на Play Store или нет.
Хорошая идея, @Firelord — но уверен, что это также применимо к приложениям, установленным другими способами (Aptoide, F-Droid и adb installт. д.), которых не знает плеймаркет? И, во-вторых, если предположить, что устройство не имеет root-прав: будет ли эта база данных каким-то образом доступна через ADB? «Из баз данных внутри него» наверняка означает где-то ниже /data/data, что не является «открыто доступным» без root. Необходимо проверить, будет ли эта база данных доступна из резервной копии ADB, что по-прежнему потребует наличия SSL-библиотек для ее расшифровки.
@Izzy У меня есть три подтверждения: если на устройстве без полномочий root установлен Aptoide или F-Droid, считайте их золотой жилой, поскольку их базы данных покрыты резервной копией ADB, и они индивидуально имеют <APP_NAME> and <PKG_NAME>все системные + пользовательские приложения. Говоря о Play Store, его база данных также покрыта резервной копией ADB, но она будет предоставляться <APP_NAME>только для тех приложений, которые установлены с помощью Play Store. Остальные перечислены <PKG_NAMES>только. // Думаю, это может помочь.
Да, но это означало бы много головоломок, проверяя все виды магазинов приложений, которые, возможно, установлены, пока вы не охватите все приложения. Не совсем осуществимо. Должно быть какое-то «центральное место» для таких вещей, как панель приложений. Тогда это было бы место, где можно было бы найти мои бриллианты :)
Кажется aapt, он включен в ПЗУ Android начиная с версии 4.4 (Kitkat), см. этот ответ . Может ли кто-нибудь подтвердить это для стоковых ПЗУ?

Ответы (2)

Вот мое решение для телефона без рута, который нуждался в некоторых небольших изменениях, которые я запускал на Moto G 2-го поколения под управлением Android 5.0.2.

У меня не было aaptбинарника /system/bin, поэтому я сначала попытался скачать с https://android.izzysoft.de/downloads

но когда я попытался запустить его, я получил сообщение об ошибке:

error: only position independent executables (PIE) are supported.

Итак, я искал версию PIE и нашел: https://github.com/Calsign/APDE/blob/fdc22eb31048862e1484f4b6eca229accda61466/APDE/src/main/assets/aapt-binaries/aapt-arm-pie .

и это сработало, скопировав двоичный файл в /data/local/tmp:

adb push aapt-arm-pie /data/local/tmp
adb shell chmod 0755 /data/local/tmp/aapt-arm-pie

Итак:

adb shell pm list packages -3 -f

получает список сторонних приложений (установленных вами приложений, а не системных приложений), а затем вы можете использовать пакет из приведенной выше команды aaptдля получения информации о пакете — пример:

adb shell /data/local/tmp/aapt-arm-pie d badging /data/app/com.facebook.katana-3/base.apk

Итак, ниже приведен скрипт (для клиента Linux), чтобы получить просто «общее» имя для сторонних приложений:

for pkg in `adb shell pm list packages -3 -f | awk -F= '{sub("package:","");print $1}'`
do
  adb shell /data/local/tmp/aapt-arm-pie d badging $pkg | awk -F: '
      $1 == "application-label" {print $2}'
done

Если вы хотите пакет и версию, измените предпоследнюю строку:

$1 == "application-label" {print $2}'

к:

$1 == "package" { split($2,space," ")
name=space[1];version=space[3]}
$1 == "application-label" {print name, version, $2 }'

Пример вывода:

name='com.ultimarom.launchnavigation' versionName='1.28' 'Navigation'
name='com.enhanced.skineditorstudio' versionName='3.3' 'Custom Skin Creator'
name='com.mojang.minecraftpe' versionName='1.2.6.60' 'Minecraft'
name='org.videolan.vlc' versionName='2.5.13' 'VLC'
name='com.jrustonapps.myauroraforecast' versionName='1.7.2' 'My Aurora Forecast'
name='de.j4velin.wifiAutoOff' versionName='1.7.6' 'WiFi Automatic'
name='com.facebook.katana' versionName='153.0.0.54.88' 'Facebook'
name='com.metago.astro' versionName='6.0.5' 'ASTRO File Manager'
name='za.co.hardrive.smartinfo.parkrun' versionName='2.0.2' 'My 5krun'
name='com.PYOPYO.StarTrackerVR' versionName='1.0.1' 'StarTracker VR'
name='cz.aponia.bor3.offlinemaps' versionName='1.1.19' 'Offline Maps'
name='com.groupon' versionName='16.11.63973' 'Groupon'
name='com.ebay.mobile' versionName='5.16.1.2' 'eBay'
name='com.runtastic.android' versionName='8.1.1' 'Runtastic
name='com.google.android.diskusage' versionName='3.8.3' 'DiskUsage'
PS: Моя страница загрузки теперь также ссылается на указанный вами источник — просто «на один уровень выше», поэтому люди могут выбирать между сборками ARM и x86.

Это не окончательный ответ, так как он не является универсальным (работает только на некоторых устройствах), но, по крайней мере, это начало:

Как мы выяснили , по крайней мере ПЗУ на базе CM с Kitkat (Android 4.4) и выше поставляются с aaptбинарным файлом, доступным в /system/bin1 . Если в вашем ПЗУ его нет, и установка бинарного файла на устройство возможна, вы можете найти его здесь .

Используя aapt, получение имени приложения возможно с помощью

aapt d badging <path to apk> | grep "application: label" |awk '{print $2}'

Вывод будет что-то вроде label='Funny App', который вы затем легко можете проанализировать для имени приложения, например

aapt d badging <path to apk> | grep 'application: label' | sed -n \"s/.*label\='\([^']*\)'.*/\1/p\"

(нехорошо, если имя приложения содержит одинарные кавычки, но это может считаться косметическим — или вы придумаете, как улучшить часть sed, чтобы справиться с этим).


1: мы не нашли этого в стандартных ПЗУ Kitkat и выше, которые мы проверили, поэтому это могут быть только ПЗУ на основе CM.

Примечание для читателей: вам не нужно иметь рутированное устройство, чтобы использовать этот aaptдвоичный файл. Вы можете очень хорошо загрузить и переименовать двоичный файл на aaptПК, установить совместимое с Linux разрешение на выполнение для двоичного файла и нажать его на /data/local/tmp, а затем использовать абсолютный путь /data/local/tmp/aaptдля использования двоичного файла в этих командах.
Итак, для имени пакета (первая часть исходного вопроса) вы должны сделатьaapt d badging <path to apk> | grep 'package: name' | awk '{print $2}'