ADB aracılığıyla paket adı ve uygulamaların ortak adını alma


15

Ben almak için bir olasılık arıyorum hem paket isimleri ve ADB yoluyla bir Android cihazında yüklü uygulamaların ortak adları - paket adı biliniyorsa ya da en azından ortak adı almak için. Sitemizdeki hızlı bir arama iki ilgili soru getirdi, ancak sorunumu çözmedi:

Mümkünse bilgileri doğrudan cihazdan almanın bir yolunu arıyorum - bu iki sorunun sahip olduğu gibi "herhangi bir" şekilde ("web aramaları" veya "bir uygulama aracılığıyla" dahil) değil.

Paket ayrıntılarını elde etmek için birden fazla araç olduğunu biliyorum:

  • adb dumpsys package: Bu, bir grup ayrıntı içeren tüm paketleri listelerken, "ortak ad" gösterilmez
  • adb shell pm list: sadece paket adlarını verir
  • aaptortak adı elde edebilecek, ancak önce .apkdosyayı cihazdan çekmeyi gerektirecek , bu gerçekten uygun değil (ve yüklü birçok ve / veya büyük uygulama ile oldukça yavaş olacak)

Bir şey mi kaçırdım? Bilgilerin cihazda olması gerektiğini biliyorum (başka nasıl GUI uygulama adlarını gösterebilir? .apkGUI "ortak ad" her ihtiyaç olduğunda Android dosyayı ayrıştırır şüpheli ). Peki ADB'yi doğrudan kullanmanın bir yolu var mı?


TL; DR

Arka plan (eğer biri merak ediyorsa): Akrobasiye dönmek zorunda kalmadan herhangi bir cihazımdan hızlı bir şekilde kullanıcı uygulamaları listesi elde etmek istiyorum. Kullanarak alabileceğim paket adlarının bir listesi adb shell pm list -3, ancak bunlar yalnızca paket adları olduğundan, uygulamaları tanımak bir tahmin çalışmasıdır. Bu nedenle, belirli bir paket adı için ortak adı almak için bazı ADB komutları varsa, basitçe bir döngü kullanabilirim for pkg in $(adb shell pm list -3); do echo "- $(adb <whatever_the_command_is> $pkg) ($pkg)"; doneve paket adlarıyla birlikte "insan tarafından okunabilir biçimde" tüm yüklü kullanıcı uygulamalarının bir listesini alabilirim.

Kullanım kılıfı:

  • Hangi "gereksiz" uygulamaların yüklü olduğunu görün (kaldırabileceğim)
  • Birden fazla cihazdan çapraz kontrol listeleri
  • Belgeler;)
  • ve muhtemelen daha fazla (ama yukarıdaki 3 bunun için ihtiyacım olan şey)

Sadece bir ideea (sanırım zaten denedin mi?). Neden sadece android için aapt derlemiyor ve bunun yerine kabuktan kaçıyorsunuz? : D
user3344236

1
@ user3344236 Bu olasılığın farkındayım; ancak söz konusu cihaza bir şey yüklemek her zaman bir seçenek değildir, özellikle de kendi kendine derlenmiş bir ikili dosya değildir (bazen köklü olmayan ve "adli tıp benzeri koşulları" saklamak zorunda kalan cihazları alırım - yani " cihazı değiştirmeyin, sadece keşfedin ").
Izzy

Yani ikinci fikir, kendinize adb kabuğu aracılığıyla çalışan bir araç yazmaktır ... cihazda değiştirilmiş adbd kullanmadan ve orada bazı dosyalar itmeden. Sanırım bunu başarmak biraz zaman alacak (eğer başarılı olursanız): D
user3344236

@ user3344236 çok endişe verici, özellikle de bir Android geliştiricisi olmadığım için. Şu anda (henüz?) Yerel bir çözüm olmadığı için "web tabanlı bir çözüm" kullanıyorum ("Google Play aramasına benzer").
Izzy

Merhaba Izzy! Yorumlar (yukarıda) dikkate alındığında, köklü olmayan bir cihazı göz önünde bulundurarak bir çözüme ihtiyacınız olduğu anlamına mı geliyor?
Firelord

Yanıtlar:


8

Bu son bir cevap değildir, çünkü genel değildir (sadece bazı cihazlarda çalışır) - ancak en azından bir başlangıç:

Olarak biz çözdüm KitKat'ta (Android 4.4) ve yukarıdaki gemi ile az CM tabanlı ROM de birlikte, aaptmevcut ikili /system/bin1 . ROM'unuz buna sahip değilse ve ikili dosyayı cihaza yüklemek bir seçenektir, burada bulabilirsiniz .

Kullanarak aapt, uygulama adını almak mümkündür

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

Çıktı label='Funny App', uygulama adı için kolayca ayrıştırabileceğiniz, ör.

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

(uygulama adı tek tırnak işareti içeriyorsa iyi değildir, ancak bu kozmetik olarak sayılabilir - veya bununla başa çıkmak için sed parçasını nasıl geliştireceğinizi anlarsınız).


1: bunu kontrol ettiğimiz Kitkat ve üzeri stok ROM'larında bulamadık, bu yüzden sadece CM tabanlı ROM'lar olabilir


3
Okuyucular için not: Bu aaptikiliyi kullanmak için köklü bir cihaza sahip olmanız gerekmez . aaptPC'de ikili dosyayı çok iyi indirebilir ve yeniden adlandırabilir, ikili bilgisayarda Linux uyumlu yürütülebilir izin ayarlayabilir ve itebilirsiniz /data/local/tmp, ardından /data/local/tmp/aaptbu komutlarda ikili dosyayı kullanmak için mutlak yolu kullanabilirsiniz.
Firelord

Yani paketin adı (orijinal sorunun ilk kısmı), yapardınızaapt d badging <path to apk> | grep 'package: name' | awk '{print $2}'
gmoz22

8

İşte android 5.0.2 çalıştıran bir Moto G 2nd gen üzerinde çalıştırdığım yukarıdan bazı küçük değişiklikler gerektiren köklü olmayan bir telefon için benim çözüm.

/ System / bin içinde aapt ikili dosyam yoktu, bu yüzden önce indirmeyi denedim: https://android.izzysoft.de/downloads

ama çalıştırmayı denediğimde bir hata mesajı aldım:

hata: yalnızca konumdan bağımsız yürütülebilir dosyalar (PIE) desteklenir.

Sonra bir PIE sürümü aradım ve buldum: https://github.com/Calsign/APDE/blob/master/APDE/src/main/assets/aapt-binaries/aapt-arm-pie

ve bu, ikili dosyayı / data / local / tmp dosyasına kopyalayarak işe yaradı:

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

E sonra:

adb shell pm list packages -3 -f

3. taraf uygulamaların listesini (yüklediğiniz uygulamalar, sistem uygulamaları değil) alır ve ardından paket hakkında bilgi almak için aapt'ta yukarıdaki komuttan paketi kullanabilirsiniz - örnek:

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

Bu nedenle, 3. taraf uygulamalar için sadece "ortak" bir ad almak için komut dosyası (bir Linux istemcisi için): ``

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

Paket ve sürüm de istiyorsanız, son ancak bir satır değiştirin:

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

için:

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

Örnek çıktı:

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'

mikrofon


Çok ve iki kez teşekkürler, Mike: kabuk betiği için bir kez ve ARM değişkenine işaretçi için ikinci aapt! Zaman izin verir vermez kontrol edecektir (şu anda biraz acelem var). Şimdiye kadar seçildi, onaylandıktan sonra belki kabul edilebilir :)
Izzy

Not: İndirme sayfam şimdi belirttiğiniz kaynağa da bağlanıyor - yalnızca "bir seviye yukarı", böylece ARM ve x86 sürümleri arasında seçim yapabilirsiniz.
Izzy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.