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

15

Я ищу возможность получить как имена пакетов, так и общие имена приложений, установленных на устройстве 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
1
@ user3344236 Я знаю об этой возможности; но это не всегда возможность установить что-либо на соответствующее устройство, особенно не скомпилированный двоичный файл (иногда я получаю переданные устройства, которые не имеют root-прав и должны сохранять «условия, подобные судебным исследованиям» - то есть «делать»). не переделывать устройство, просто изучить его ").
Иззи
Итак, вторая идея - написать инструмент, который запускается через оболочку adb ... без использования модифицированного adbd на устройстве и без добавления туда некоторых файлов. Я думаю, что это займет у вас некоторое время, чтобы выполнить это (если вы когда-нибудь преуспеете): D
user3344236
@ user3344236 слишком хлопотно, тем более что я не Android-разработчик. В настоящее время я использую «веб-решение» (похожее на «поиск в Google Play»), так как здесь пока нет нативного решения (пока?).
Иззи
Привет Иззи! Учитывая комментарии (выше), означает ли это, что вам нужно решение, учитывающее некорневое устройство?
Повелитель огня

Ответы:

8

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

Как мы выяснили , по крайней мере, ПЗУ на базе 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

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

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

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

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

ошибка: поддерживаются только независимые от позиции исполняемые файлы (PIE).

Тогда я искал версию PIE и нашел: https://github.com/Calsign/APDE/blob/master/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'

Майк

Майк Баундс
источник
Большое и двойное спасибо, Майк: один раз за скрипт оболочки, а второй за указатель на вариант ARM aapt! Проверьте это, как только позволит время (сейчас я немного спешу). На данный момент проголосовал, может быть принят после проверки :)
Иззи
PS: Моя страница загрузки теперь также ссылается на указанный вами источник - просто «на один уровень выше», так что люди могут выбирать между сборками ARM и x86.
Иззи