Я ищу возможность получить как имена пакетов, так и общие имена приложений, установленных на устройстве Android через ADB, или, по крайней мере, получить общее имя, если имя пакета известно. Быстрый поиск на нашем сайте вызвал два связанных вопроса, но они не решают мою проблему:
Я ищу способ получить информацию непосредственно с устройства, если это возможно, а не «любым» способом (включая «поиск в Интернете» или «через приложение»), как это есть в этих двух вопросах.
Я знаю, что есть несколько инструментов для получения сведений о пакете:
adb dumpsys package
: хотя в этом списке перечислены все пакеты с кучей деталей, «общее имя» не отображается.adb shell pm list
: дает только имена пакетовaapt
сможет получить общее имя, но потребует сначала извлечь .apk
файл с устройства, что не очень удобно (и, очевидно, будет довольно медленным с большим количеством установленных и/или больших приложений)Я что-то пропустил? Я знаю, что информация должна быть на устройстве (как еще она может отображать имена приложений в графическом интерфейсе? Я сомневаюсь, что Android анализирует .apk
файл каждый раз, когда графическому интерфейсу требуется «общее имя»). Так есть ли способ получить его, используя ADB напрямую?
Предыстория (если кому-то интересно): я хочу иметь возможность быстро получить список пользовательских приложений с любого из моих устройств, не прибегая к акробатике. Список имен их пакетов я могу получить с помощью adb shell pm list -3
, но, поскольку это только имена пакетов, распознавание приложений — дело догадок. Таким образом, если бы была какая-то команда ADB для получения общего имени для заданного имени пакета, я мог бы просто использовать цикл, например for pkg in $(adb shell pm list -3); do echo "- $(adb <whatever_the_command_is> $pkg) ($pkg)"; done
— и получить список всех установленных пользовательских приложений в «удобочитаемом формате» вместе с именами их пакетов.
Сценарии использования:
Вот мое решение для телефона без рута, который нуждался в некоторых небольших изменениях, которые я запускал на 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'
Это не окончательный ответ, так как он не является универсальным (работает только на некоторых устройствах), но, по крайней мере, это начало:
Как мы выяснили , по крайней мере ПЗУ на базе CM с Kitkat (Android 4.4) и выше поставляются с aapt
бинарным файлом, доступным в /system/bin
1 . Если в вашем ПЗУ его нет, и установка бинарного файла на устройство возможна, вы можете найти его здесь .
Используя 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}'
арес777
Иззи
арес777
Иззи
Повелитель огня
Иззи
Повелитель огня
<APP_NAME> and <PKG_NAME>
из баз данных (localappstate.db
) внутри него. Ты пробовал это? Я не проверял, распространяется ли резервное копирование ADB на Play Store или нет.Иззи
adb install
т. д.), которых не знает плеймаркет? И, во-вторых, если предположить, что устройство не имеет root-прав: будет ли эта база данных каким-то образом доступна через ADB? «Из баз данных внутри него» наверняка означает где-то ниже/data/data
, что не является «открыто доступным» без root. Необходимо проверить, будет ли эта база данных доступна из резервной копии ADB, что по-прежнему потребует наличия SSL-библиотек для ее расшифровки.Повелитель огня
<APP_NAME> and <PKG_NAME>
все системные + пользовательские приложения. Говоря о Play Store, его база данных также покрыта резервной копией ADB, но она будет предоставляться<APP_NAME>
только для тех приложений, которые установлены с помощью Play Store. Остальные перечислены<PKG_NAMES>
только. // Думаю, это может помочь.Иззи
Иззи
aapt
, он включен в ПЗУ Android начиная с версии 4.4 (Kitkat), см. этот ответ . Может ли кто-нибудь подтвердить это для стоковых ПЗУ?