Отримати назву пакета І загальну назву програм через 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.