Отримати назву пакета І загальну назву програм через ADB


15

Я шукаю можливість отримати як імена пакетів, так і загальні назви програм, встановлених на пристрої Android через ADB - або принаймні для отримання загального імені, якщо ім'я пакета відомо. Швидкий пошук на нашому веб-сайті викликав два пов’язані питання, але вони не вирішують мою проблему:

Я шукаю спосіб отримати інформацію безпосередньо з пристрою, якщо це можливо - не "будь-яким" способом (включаючи "веб-пошуки" або "через додаток"), як це стосується цих двох питань.

Я знаю, що для отримання детальної інформації про пакет доступно кілька інструментів:

  • adb dumpsys package: Хоча в цьому списку перелічено всі пакунки з купою деталей, "загальна назва" не відображається
  • adb shell pm list: дає лише назви пакету
  • aaptзмогли б отримати загальне ім'я, але потрібно спочатку витягнути .apkфайл з пристрою, що не дуже зручно (і очевидно, буде досить повільно, коли встановлено багато та / або великих додатків)

Я щось пропустив? Я знаю, що інформація повинна бути на пристрої (як інакше вона могла б показувати назви додатків у графічному інтерфейсі? Сумніваюсь, Android розбирає .apkфайл щоразу, коли GUI потребує "загального імені"). То чи є спосіб отримати це, безпосередньо використовуючи 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
— користувач3344236

1
@ user3344236 Я знаю про таку можливість; але не завжди є можливість встановити щось на відповідний пристрій, особливо не на самокомпільований двійковий код (я інколи отримую передані пристрої, які не вкорінюються, і мають дотримуватися "криміналістичних умов" - тобто "робити не змінюйте пристрій, просто досліджуйте його ").
— Іззі

Отже, друга ідея полягає в тому, щоб написати собі інструмент, який працює через adb shell ... без використання модифікованого adbd на пристрої і не натискаючи туди деякі файли. Я думаю, що вам знадобиться певний час, щоб досягти цього (якщо коли-небудь вам це вдасться): D
— user3344236

@ user3344236 занадто хвилююче, тим більше, що я не розробник Android. Зараз я використовую "веб-рішення" (подібне до "пошуку Google Play"), оскільки тут, здається, не існує нативного рішення (поки що?).
— Іззі

Привіт Іззі! Враховуючи коментарі (вище), чи означає це, що вам потрібно рішення, враховуючи не вкорінений пристрій?
— Firelord

Відповіді:


8

Це не остаточна відповідь, оскільки не є загальною (працює лише на деяких пристроях) - але це принаймні початок:

Як ми з'ясували , принаймні ROM на основі 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\"

(Не добре, якщо назва програми містить одинарні цитати, але це може вважатися косметикою - або ви розумієте, як покращити частину седу, щоб вирішити це).


1: цього ми не знайшли у дисках, що ми перевірили, у складі Kitkat і вище, тому це можуть бути лише ПЗУ на основі CM


3
Примітка для читачів: Для використання цього aaptдвійкового файла не потрібно мати укорінений пристрій . Ви можете дуже добре завантажити та перейменувати бінарне aaptв ПК, встановити сумісний з Linux виконаний дозвіл на бінарний файл і надіслати його /data/local/tmp, а потім використати абсолютний шлях /data/local/tmp/aaptдля використання бінарного файлу в цих командах.
— Firelord

Тож для назви пакету (перша частина оригінального запитання) ви б зробилиaapt d badging <path to apk> | grep 'package: name' | awk '{print $2}'
— gmoz22

8

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

У мене не було aapt binary в / 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! Перевірте це, як тільки дозволить час (зараз я трохи поспішаю). Запропонований на даний момент, можливо, прийнятий після перевірки :)
— Izzy

PS: Моя сторінка завантаження також посилається на вказане вами джерело - лише "на один рівень вгору", тому люди можуть вибирати між складаннями ARM та x86.
— Іззі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.