23 votos

Obtener el nombre del paquete Y el nombre común de las aplicaciones a través de ADB

Estoy buscando una posibilidad de recuperar ambos los nombres de los paquetes y los nombres comunes de las aplicaciones instaladas en un dispositivo Android a través de ADB - o al menos para recuperar el nombre común si se conoce el nombre del paquete. Una búsqueda rápida en nuestro sitio trajo dos preguntas relacionadas, pero no resuelven mi problema:

Estoy buscando una manera de recuperar la información directamente del dispositivo, si es posible - no de "cualquier" manera (incluyendo "búsquedas en la web" o "a través de una aplicación") como esas dos preguntas lo tienen.

Sé que hay múltiples herramientas disponibles para obtener los detalles del paquete:

  • adb dumpsys package : Mientras que esto lista todos los paquetes con un montón de detalles, el "nombre común" no se muestra
  • adb shell pm list sólo da los nombres de los paquetes
  • aapt sería capaz de obtener el nombre común, pero requeriría tirar primero de la .apk del dispositivo, lo cual no es realmente conveniente (y obviamente será bastante lento con muchas y/o grandes aplicaciones instaladas)

¿Me he perdido algo? Sé que la información debe estar en el dispositivo (¿de qué otra forma podría mostrar los nombres de las aplicaciones en la interfaz gráfica de usuario? Dudo que Android analice el .apk cada vez que la GUI necesite el "nombre común"). Entonces, ¿hay alguna forma de conseguirlo, usando ADB directamente?


TL;DR

Antecedentes (si alguien tiene curiosidad): Quiero ser capaz de obtener rápidamente una lista de aplicaciones de usuario de cualquiera de mis dispositivos, sin tener que volver a la acrobacia. Una lista de sus nombres de paquetes que puedo recuperar usando adb shell pm list -3 pero como esos son sólo nombres de paquetes, reconocer las aplicaciones es un trabajo de adivinanzas. Así que si hubiera algún comando ADB para recuperar el nombre común de un determinado nombre de paquete, podría simplemente usar un bucle como for pkg in $(adb shell pm list -3); do echo "- $(adb <whatever_the_command_is> $pkg) ($pkg)"; done - y obtener una lista de todas las aplicaciones de usuario instaladas en un "formato legible para los humanos" junto con los nombres de sus paquetes.

Casos de uso:

  • Ver qué aplicaciones "superflojas" están instaladas (que podría eliminar)
  • Listas de verificación cruzadas de múltiples dispositivos
  • Documentación ;)
  • y probablemente más (pero los tres anteriores son para lo que lo necesito)

0 votos

Sólo una idea (creo que ya lo has intentado). ¿Por qué no compilas aapt para Android y lo ejecutas desde el shell?

1 votos

@user3344236 Soy consciente de esa posibilidad; pero no siempre es una opción instalar algo al dispositivo en cuestión, especialmente no un binario autocompilado (a veces me entregan dispositivos que no están rooteados, y tengo que mantener "condiciones similares a las de los forenses", es decir, "no alterar el dispositivo, sólo explorarlo").

0 votos

Así que la segunda idea es escribir una herramienta que se ejecuta a través de adb shell ... sin utilizar adbd modificado en el dispositivo y sin empujar algunos archivos allí. Creo que le tomará algún tiempo para lograr esto (si alguna vez usted tiene éxito) :D

12voto

Mike Bounds Puntos 61

Aquí está mi solución para un teléfono no rooteado que necesitaba algunos cambios ligeros de arriba que corrió en un Moto G 2 ª generación con Android 5.0.2.

No tenía el binario de aapt en /system/bin, así que primero intenté descargarlo desde https://Android.izzysoft.de/downloads

pero cuando intenté ejecutarlo me dio un error que decía:

error: sólo se admiten ejecutables independientes de la posición (PIE).

Entonces busqué una versión PIE y encontré: https://github.com/Calsign/APDE/blob/master/APDE/src/main/assets/aapt-binaries/aapt-arm-pie

y esto funcionó copiando el binario a /data/local/tmp:

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

Entonces:

adb shell pm list packages -3 -f

obtiene la lista de aplicaciones de terceros (aplicaciones que ha instalado, no aplicaciones del sistema) y luego puede utilizar el paquete del comando anterior en aapt para obtener información sobre el paquete - ejemplo:

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

Así que a continuación es script (para un cliente Linux) para obtener sólo el nombre "común" para las aplicaciones de terceros:``

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 también quiere el paquete y la versión, entonces cambie la penúltima línea de:

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

a:

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

Ejemplo de salida:

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

0 votos

Muchas gracias y por partida doble, Mike: una por el shell script, y otra por el puntero a la variante ARM de aapt ¡! Lo comprobaré en cuanto tenga tiempo (tengo un poco de prisa). Upvoted por ahora, tal vez aceptado después de haber verificado :)

0 votos

P.D.: Mi página de descargas ahora también enlaza con el código fuente que has especificado, sólo que "un nivel más arriba", para que la gente pueda elegir entre las versiones ARM y x86.

7voto

Izzy Puntos 45544

Esta no es una respuesta definitiva, ya que no es genérica (sólo funciona en algunos dispositivos), pero al menos es un comienzo:

Como hemos descubierto al menos ROMs basadas en CM con Kitkat (Android 4.4) y por encima de la nave con el aapt binario disponible en /system/bin 1 . Si tu ROM no lo tiene, e instalar el binario en el dispositivo es una opción, puedes lo encontrarás aquí .

Usando aapt recuperar el nombre de la aplicación es posible con

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

La salida será algo como label='Funny App' que luego puedes analizar fácilmente para el nombre de la aplicación, por ejemplo.

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

(no es bueno si el nombre de la aplicación contiene citas sencillas, pero eso podría contar como cosméticos - o te imaginas cómo mejorar la parte de la sed para lidiar con eso).


1: No encontramos esto en las ROMs de Kitkat y sus alrededores que hemos revisado, así que puede ser que sólo sean ROMs basadas en CM.

5 votos

Nota para los lectores: No es necesario tener un dispositivo rooteado para utilizarlo aapt binario. Puedes muy bien descargar y renombrar el binario a aapt en el PC, establecer el permiso de ejecución compatible con Linux en el binario y empujarlo a /data/local/tmp y luego utilizar la ruta absoluta /data/local/tmp/aapt para utilizar el binario en esos comandos.

0 votos

Así que para el nombre del paquete (primera parte de la pregunta original), se haría aapt d badging <path to apk> | grep 'package: name' | awk '{print $2}'

4voto

Jack Wade Puntos 231

Empuja el script dado al dispositivo Android y ejecútalo:

adb push list_app_labels.sh /data/local/tmp/ && adb shell sh /data/local/tmp/list_app_labels.sh

Debería imprimir el UID, el nombre del paquete y la etiqueta de aplicación de las aplicaciones instaladas de esta manera:

10099 com.android.packageinstaller Package installer
1002 com.android.bluetooth Bluetooth
1073 com.android.networkstack.permissionconfig com.android.server.NetworkPermissionConfig
10230 com.topjohnwu.magisk Magisk
10087 com.android.providers.blockednumber Blocked Numbers Storage
10176 com.termux.widget Termux:Widget
...

Probado en Android 7-13.

list_app_labels.sh :

#!/system/bin/sh

export CLASSPATH=/data/local/tmp/list_app_labels
trap 'rm $CLASSPATH' EXIT
tail -n +10 "$0" | base64 -d >$CLASSPATH

app_process / Main
exit

ZGV4CjAzNwAEZ8DOwPQFGurk/iOA5Ry9+z0tMCP1fzNMCAAAcAAAAHhWNBIAAAAAAAAAAKwHAAAx
AAAAcAAAABQAAAA0AQAADwAAAIQBAAADAAAAOAIAABMAAABQAgAAAgAAAOgCAAAkBQAAKAMAAFoE
AABdBAAAZQQAAGgEAABrBAAAbwQAAHMEAAB7BAAAmQQAALQEAADPBAAA9QQAABoFAAAvBQAAQQUA
AFgFAAByBQAAhgUAAJoFAAC1BQAAyQUAAN8FAADxBQAA/AUAAP8FAAADBgAABgYAABsGAAAfBgAA
JwYAAC0GAAAyBgAARwYAAGEGAAB0BgAAhgYAAI8GAACZBgAAnwYAAKUGAACqBgAAtwYAALsGAADO
BgAA1wYAAOMGAADtBgAA8gYAAFkHAAACAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0A
AAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFQAAABcAAAAZAAAAGgAAAAMAAAACAAAAAAAA
AAMAAAADAAAAAAAAAAMAAAAGAAAAAAAAAAUAAAAKAAAANAQAAAMAAAALAAAAAAAAAAMAAAAMAAAA
AAAAAAQAAAANAAAAPAQAAAUAAAANAAAARAQAAAUAAAANAAAATAQAAAMAAAAPAAAAAAAAAAQAAAAQ
AAAAPAQAABcAAAARAAAAAAAAABgAAAARAAAATAQAABgAAAARAAAAVAQAABkAAAASAAAAAAAAAAUA
DAAoAAAABQAAAC4AAAAOAAkAJwAAAAEACwABAAAAAQANACUAAAACAAEAIgAAAAIAAAAsAAAABAAC
ACEAAAAGAAMAHwAAAAYACgAgAAAABwALACoAAAAIAAsAAQAAAAkADAArAAAACwALAAEAAAANAAsA
AQAAAA0ABgAcAAAADQAHABwAAAANAAgAHAAAAA0ABQAtAAAADwAOACMAAAAPAAQAJgAAABAACQAk
AAAAAQAAAAEAAAALAAAAAAAAABYAAAAAAAAAkQcAAAAAAAAIAAAAEQAAAAsAAAAAAAAA/////wAA
AACfBwAAAAAAAAEAAQABAAAAEAQAAAQAAABwEAoAAAAOAAkAAQACAAAAFAQAAFMAAABxAAcAAABx
AAMAAAAMAG4QAgAAAAwAbhAEAAAADAETAgAgbiAGACEADAJyEBIAAgAMAnIQEAACAAoDOAM1AHIQ
EQACAAwDHwMFAGIEAgAiBQ0AcBALAAUAUjYBAG4gDABlAAwFGgYAAG4gDgBlAAwFVDcAAG4gDgB1
AAwFbiAOAGUADAVuIAUAMQAMBm4gDQBlAAwFbhAPAAUADAVuIAkAVAAoyA4AAAABAAEAAQAAAAAA
AAAEAAAAcBAKAAAADgAHAA4ACgEeDjyIAwAfBUwDASoHARYPAwMcBgEsDwUDHgAAAAABAAAABQAA
AAEAAAAAAAAAAQAAAAsAAAABAAAADAAAAAEAAAATAAEgAAY8aW5pdD4AAUkAAUwAAkxJAAJMTAAG
TE1haW47ABxMYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQ7ABlMYW5kcm9pZC9hcHAvQ29udGV4
dEltcGw7ABlMYW5kcm9pZC9jb250ZW50L0NvbnRleHQ7ACRMYW5kcm9pZC9jb250ZW50L3BtL0Fw
cGxpY2F0aW9uSW5mbzsAI0xhbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXI7ABNMYW5k
cm9pZC9vcy9Mb29wZXI7ABBMY29tL21pcmZhdGlmL1I7ABVMamF2YS9pby9QcmludFN0cmVhbTsA
GExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOwASTGphdmEvbGFuZy9PYmplY3Q7ABJMamF2YS9sYW5n
L1N0cmluZzsAGUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsAEkxqYXZhL2xhbmcvU3lzdGVtOwAU
TGphdmEvdXRpbC9JdGVyYXRvcjsAEExqYXZhL3V0aWwvTGlzdDsACU1haW4uamF2YQABVgACVkwA
AVoAE1tMamF2YS9sYW5nL1N0cmluZzsAAmFpAAZhcHBlbmQABGFyZ3MAA2N4dAATZ2V0QXBwbGlj
YXRpb25MYWJlbAAYZ2V0SW5zdGFsbGVkQXBwbGljYXRpb25zABFnZXRQYWNrYWdlTWFuYWdlcgAQ
Z2V0U3lzdGVtQ29udGV4dAAHaGFzTmV4dAAIaXRlcmF0b3IABG1haW4ABG5leHQAA291dAALcGFj
a2FnZU5hbWUAAnBtABFwcmVwYXJlTWFpbkxvb3BlcgAHcHJpbnRsbgAKc3lzdGVtTWFpbgAIdG9T
dHJpbmcAA3VpZABlfn5EOHsiYmFja2VuZCI6ImRleCIsImNvbXBpbGF0aW9uLW1vZGUiOiJkZWJ1
ZyIsImhhcy1jaGVja3N1bXMiOnRydWUsIm1pbi1hcGkiOjI0LCJ2ZXJzaW9uIjoiMy4zLjgzIn0A
Nn5+fnsiTE1haW47IjoiNzg1NDY5ZTYiLCJMY29tL21pcmZhdGlmL1I7IjoiNjExMjVkMjEifQAA
AAIAAIGABKgGAQnABgAAAQAIgoAE+AcAAAANAAAAAAAAAAEAAAAAAAAAAQAAADEAAABwAAAAAgAA
ABQAAAA0AQAAAwAAAA8AAACEAQAABAAAAAMAAAA4AgAABQAAABMAAABQAgAABgAAAAIAAADoAgAA
ASAAAAMAAAAoAwAAAyAAAAIAAAAQBAAAARAAAAUAAAA0BAAAAiAAADEAAABaBAAAACAAAAIAAACR
BwAAABAAAAEAAACsBwAA

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X