Dapatkan nama paket DAN nama umum aplikasi melalui ADB

14

Saya mencari kemungkinan untuk mengambil keduanya , nama - nama paket dan nama umum aplikasi yang diinstal pada perangkat Android melalui ADB - atau setidaknya untuk mengambil nama umum jika nama paket diketahui. Pencarian cepat di situs kami memunculkan dua pertanyaan terkait, tetapi mereka tidak menyelesaikan masalah saya:

Saya mencari cara untuk mengambil informasi langsung dari perangkat, jika mungkin - bukan cara "apa pun" (termasuk "pencarian web" atau "melalui aplikasi") karena kedua pertanyaan itu memilikinya.

Saya tahu ada beberapa alat yang tersedia untuk memperoleh detail paket:

  • adb dumpsys package: Meskipun ini mencantumkan semua paket dengan banyak detail, "nama umum" tidak ditampilkan
  • adb shell pm list: hanya memberikan nama paket
  • aaptakan dapat memperoleh nama umum, tetapi harus terlebih dahulu menarik .apkfile dari perangkat, yang tidak terlalu nyaman (dan jelas akan sangat lambat dengan banyak dan / atau aplikasi besar diinstal)

Apakah saya melewatkan sesuatu? Saya tahu informasi itu harus ada di perangkat (bagaimana lagi itu bisa menunjukkan nama aplikasi di GUI? Saya ragu Android mem-parsing .apkfile setiap kali GUI membutuhkan "nama umum"). Jadi apakah ada cara untuk mendapatkannya, menggunakan ADB secara langsung?


TL; DR

Latar belakang (jika ada yang ingin tahu): Saya ingin dapat dengan cepat mendapatkan daftar aplikasi pengguna dari salah satu perangkat saya, tanpa harus kembali ke akrobat. Daftar nama paket mereka yang bisa saya ambil menggunakan adb shell pm list -3, tetapi karena itu hanya nama paket, mengenali aplikasi adalah pekerjaan menebak. Jadi, jika ada beberapa perintah ADB untuk mengambil nama umum untuk nama paket yang diberikan, saya bisa menggunakan loop seperti for pkg in $(adb shell pm list -3); do echo "- $(adb <whatever_the_command_is> $pkg) ($pkg)"; done- dan mendapatkan daftar semua aplikasi pengguna yang terinstal dalam "format yang dapat dibaca manusia" bersama dengan nama paket mereka.

Kasus penggunaan:

  • Lihat aplikasi "superflous" apa yang diinstal (yang bisa saya hapus)
  • Periksa silang daftar dari beberapa perangkat
  • Dokumentasi;)
  • dan mungkin lebih (tetapi 3 di atas adalah apa yang saya butuhkan)
Izzy
sumber
Hanya ideea (saya pikir Anda sudah mencobanya?). Mengapa Anda tidak mengkompilasi aapt untuk android dan menjalankannya dari shell? : D
user3344236
1
@ user3344236 Saya mengetahui kemungkinan itu; tetapi itu tidak selalu merupakan pilihan untuk menginstal sesuatu ke perangkat yang dimaksud, terutama bukan biner yang dikompilasi sendiri (saya terkadang mendapatkan perangkat yang tidak di-rooting, dan harus menjaga "kondisi mirip-forensik" - yaitu "lakukan tidak mengubah perangkat, cukup jelajahi ").
Izzy
Jadi ide kedua adalah menulis sendiri alat yang berjalan melalui adb shell ... tanpa menggunakan adbd yang dimodifikasi pada perangkat dan tanpa mendorong beberapa file di sana. Saya pikir ini akan membawa Anda beberapa waktu untuk mencapai ini (jika pernah Anda berhasil): D
user3344236
@ user3344236 terlalu mengkhawatirkan, terutama karena saya bukan pengembang Android. Saat ini saya menggunakan "solusi berbasis web" (mirip dengan "pencarian Google Play"), karena sepertinya tidak ada solusi asli di sini (belum?).
Izzy
Hai Izzy! Mempertimbangkan komentar (di atas), apakah ini berarti Anda memerlukan solusi mengingat perangkat yang tidak di-rooting?
Firelord

Jawaban:

8

Ini bukan jawaban akhir, karena ini bukan generik (hanya berfungsi pada beberapa perangkat) - tetapi ini setidaknya merupakan permulaan:

Seperti yang telah kita ketahui , setidaknya ROM berbasis CM dengan Kitkat (Android 4.4) dan yang lebih tinggi dengan aaptbiner tersedia dalam /system/bin1 . Jika ROM Anda tidak memilikinya, dan menginstal biner pada perangkat adalah sebuah pilihan, Anda dapat menemukannya di sini .

Menggunakan aapt, mengambil nama aplikasi dimungkinkan dengan

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

Outputnya akan seperti label='Funny App', yang kemudian dengan mudah Anda dapat menguraikan nama aplikasi, misalnya

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

(tidak baik jika nama aplikasi berisi tanda kutip tunggal, tetapi itu mungkin dianggap sebagai kosmetik - atau Anda mencari cara untuk meningkatkan bagian sed untuk mengatasinya).


1: kami tidak menemukan ini di ROM stok Kitkat-dan-di atas yang telah kami periksa, jadi itu mungkin hanya ROM berbasis CM

Izzy
sumber
3
Catatan untuk pembaca: Anda tidak perlu memiliki perangkat yang di-rooting untuk menggunakan aaptbiner itu. Anda dapat mengunduh dan mengubah nama biner menjadi aaptPC, mengatur izin yang dapat dieksekusi yang kompatibel dengan Linux pada biner dan mendorongnya /data/local/tmp, kemudian menggunakan jalur absolut /data/local/tmp/aaptuntuk menggunakan biner dalam perintah-perintah itu.
Firelord
Jadi untuk nama paket (bagian pertama dari pertanyaan awal), Anda akan melakukannyaaapt d badging <path to apk> | grep 'package: name' | awk '{print $2}'
gmoz22
7

Inilah solusi saya untuk ponsel yang tidak di-root yang memerlukan sedikit perubahan dari atas yang saya gunakan pada Moto G 2nd gen yang menjalankan Android 5.0.2.

Saya tidak memiliki aapt binary di / system / bin, jadi saya pertama kali mencoba mengunduh dari: https://android.izzysoft.de/downloads

tetapi ketika saya mencoba menjalankannya saya mendapat pesan kesalahan:

kesalahan: hanya posisi executable independen (PIE) yang didukung.

Jadi saya mencari versi PIE dan menemukan: https://github.com/Calsign/APDE/blob/master/APDE/src/main/assets/aapt-binaries/aapt-arm-pie

dan ini bekerja dengan menyalin biner ke / data / local / tmp:

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

Sehingga kemudian:

adb shell pm list packages -3 -f

mendapatkan daftar aplikasi pihak ke-3 (aplikasi yang telah Anda instal, bukan aplikasi sistem) dan kemudian Anda dapat menggunakan paket dari perintah di atas dalam aapt untuk mendapatkan informasi tentang paket - contoh:

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

Jadi di bawah ini adalah skrip (untuk klien Linux) untuk mendapatkan nama "umum" untuk aplikasi pihak ketiga: ``

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

Jika Anda ingin paket dan versi juga, maka ubah yang terakhir tetapi satu baris dari:

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

untuk:

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

Contoh output:

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'

Mike

Mike Bounds
sumber
Terima kasih banyak dan dua kali, Mike: sekali untuk skrip shell, dan kedua untuk pointer ke varian ARM aapt! Akan memeriksanya segera setelah waktu mengizinkan (saya agak terburu-buru saat ini). Terpilih untuk saat ini, mungkin diterima setelah memverifikasi :)
Izzy
PS: Halaman unduhan saya sekarang juga menautkan ke sumber yang telah Anda tentukan - hanya "satu tingkat atas", sehingga orang dapat memilih antara ARM dan x86 build.
Izzy