Obtenir le nom du package ET le nom commun des applications via ADB

15

Je cherche une possibilité de récupérer les deux , les noms de package et les noms communs des applications installées sur un appareil Android via ADB - ou au moins de récupérer le nom commun si le nom du package est connu. Une recherche rapide sur notre site a soulevé deux questions connexes, mais elles ne résolvent pas mon problème:

Je cherche un moyen de récupérer les informations directement à partir de l'appareil, si possible - pas "de toute façon" (y compris les "recherches sur le Web" ou "via une application") comme ces deux questions l'ont.

Je sais qu'il existe plusieurs outils disponibles pour obtenir les détails du package:

  • adb dumpsys package: Bien que cela répertorie tous les packages avec un tas de détails, le "nom commun" n'est pas affiché
  • adb shell pm list: donne uniquement les noms des packages
  • aaptserait en mesure d'obtenir le nom commun, mais nécessiterait d'abord d'extraire le .apkfichier de l'appareil, ce qui n'est pas vraiment pratique (et sera évidemment assez lent avec de nombreuses et / ou grandes applications installées)

Ai-je oublié quelque chose? Je sais que les informations doivent être sur l'appareil (comment pourrait-il autrement afficher les noms des applications dans l'interface graphique? Je doute qu'Android analyse le .apkfichier chaque fois que l'interface graphique a besoin du "nom commun"). Alors, y a-t-il un moyen de s'en emparer en utilisant directement ADB?


TL; DR

Contexte (si quelqu'un est curieux): Je veux pouvoir obtenir rapidement une liste d'applications utilisateur à partir de n'importe lequel de mes appareils, sans avoir à revenir à l'acrobatie. Une liste de leurs noms de packages que je peux récupérer en utilisant adb shell pm list -3, mais comme ce ne sont que des noms de packages, la reconnaissance des applications est une supposition. Donc, s'il y avait une commande ADB pour récupérer le nom commun d'un nom de package donné, je pourrais simplement utiliser une boucle comme for pkg in $(adb shell pm list -3); do echo "- $(adb <whatever_the_command_is> $pkg) ($pkg)"; done- et obtenir une liste de toutes les applications utilisateur installées dans un "format lisible par l'homme" avec leurs noms de package.

Cas d'utilisation:

  • Voir quelles applications "superflous" sont installées (que je pourrais supprimer)
  • Croiser les listes de contrôle de plusieurs appareils
  • Documentation ;)
  • et probablement plus (mais les 3 ci-dessus sont ce dont j'ai besoin)
Izzy
la source
Juste une idée (je pense que vous avez déjà essayé?). Pourquoi ne compilez-vous simplement pas aapt pour Android et exécutez-vous plutôt à partir du shell? : D
user3344236
1
@ user3344236 Je suis conscient de cette possibilité; mais ce n'est pas toujours une option pour installer quelque chose sur le périphérique en question, en particulier pas un binaire auto-compilé (je reçois parfois des périphériques remis qui ne sont pas enracinés, et je dois garder des "conditions de type criminalistique" - c'est-à-dire "faire pas modifier l'appareil, il suffit de l'explorer ").
Izzy
La deuxième idée est donc de vous écrire un outil qui s'exécute via le shell adb ... sans utiliser adbd modifié sur l'appareil et sans y pousser certains fichiers. Je pense que cela vous prendra un certain temps pour accomplir cela (si jamais vous réussissez): D
user3344236
@ user3344236 trop inquiétant, d'autant plus que je ne suis pas un développeur Android. J'utilise actuellement une "solution basée sur le Web" (similaire à la "recherche Google Play"), car il ne semble pas y avoir de solution native ici (pour l'instant?).
Izzy
Salut Izzy! Compte tenu des commentaires (ci-dessus), cela signifie-t-il que vous avez besoin d'une solution en tenant compte d'un appareil non rooté?
Firelord

Réponses:

8

Ce n'est pas une réponse finale, car ce n'est pas générique (ne fonctionne que sur certains appareils) - mais c'est au moins un début:

Comme nous l'avons compris , au moins les ROM basées sur CM avec Kitkat (Android 4.4) et au-dessus sont livrées avec le aaptbinaire disponible en /system/bin1 . Si votre ROM ne l'a pas et que l'installation du binaire sur l'appareil est une option, vous pouvez le trouver ici .

L'utilisation aapt, la récupération du nom de l'application est possible avec

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

La sortie sera quelque chose comme label='Funny App', que vous pourrez ensuite facilement analyser pour le nom de l'application, par exemple

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

(pas bon si le nom de l'application contient des guillemets simples, mais cela peut compter comme des cosmétiques - ou vous savez comment améliorer la partie sed pour y faire face).


1: nous n'avons pas trouvé cela dans les ROMs Kitkat et ci-dessus que nous avons vérifiées, il peut donc s'agir uniquement de ROM basées sur CM

Izzy
la source
3
Note aux lecteurs: Vous n'avez pas besoin d'avoir un périphérique enraciné pour utiliser ce aaptbinaire. Vous pouvez très bien télécharger et renommer le binaire aapten PC, définir l'autorisation exécutable compatible Linux sur le binaire et le pousser /data/local/tmp, puis utiliser le chemin absolu /data/local/tmp/aaptpour utiliser le binaire dans ces commandes.
Firelord
Donc, pour le nom du paquet (première partie de la question d'origine), vous feriezaapt d badging <path to apk> | grep 'package: name' | awk '{print $2}'
gmoz22
8

Voici ma solution pour un téléphone non rooté qui nécessitait quelques légères modifications par rapport à ce que j'ai exécuté sur un Moto G 2e génération exécutant Android 5.0.2.

Je n'avais pas de binaire aapt dans / system / bin, j'ai donc d'abord essayé de télécharger à partir de: https://android.izzysoft.de/downloads

mais quand j'ai essayé de l'exécuter, j'ai eu une erreur disant:

erreur: seuls les exécutables indépendants de la position (PIE) sont pris en charge.

Alors j'ai cherché une version PIE et j'ai trouvé: https://github.com/Calsign/APDE/blob/master/APDE/src/main/assets/aapt-binaries/aapt-arm-pie

et cela a fonctionné en copiant le binaire dans / data / local / tmp:

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

Donc alors:

adb shell pm list packages -3 -f

obtient la liste des applications tierces (les applications que vous avez installées, pas les applications système), puis vous pouvez utiliser le package à partir de la commande ci-dessus dans aapt pour obtenir des informations sur le package - exemple:

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

Voici donc un script (pour un client Linux) pour obtenir juste le nom "commun" pour les applications tierces: ``

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

Si vous voulez également le package et la version, changez la dernière mais dernière ligne de:

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

à:

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

Exemple de sortie:

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
la source
Merci beaucoup et deux fois, Mike: une fois pour le script shell, et deuxièmement pour le pointeur vers la variante ARM de aapt! Va vérifier cela dès que le temps le permet (je suis un peu pressé actuellement). Voté pour l'instant, peut-être accepté après avoir vérifié :)
Izzy
PS: Ma page de téléchargement est désormais liée à la source que vous avez spécifiée - juste "un niveau plus haut", afin que les gens puissent choisir entre les versions ARM et x86.
Izzy