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

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

Estoy buscando una forma de recuperar la información directamente desde el dispositivo, si es posible, no "cualquier" forma (incluidas las "búsquedas web" o "a través de una aplicación") como lo tienen esas dos preguntas.

Sé que hay varias herramientas disponibles para obtener detalles del paquete:

  • adb dumpsys package: Si bien esto enumera todos los paquetes con un montón de detalles, el "nombre común" no se muestra
  • adb shell pm list: solo da los nombres de los paquetes
  • aaptpodría obtener el nombre común, pero primero sería necesario extraer el .apkarchivo 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 GUI? Dudo que Android analice el .apkarchivo cada vez que la GUI necesita el "nombre común"). Entonces, ¿hay alguna manera de conseguirlo usando ADB directamente?


TL;DR

Antecedentes (si alguien tiene curiosidad): quiero poder obtener rápidamente una lista de aplicaciones de usuario desde cualquiera de mis dispositivos, sin tener que volver a las acrobacias. Puedo recuperar una lista de los nombres de sus paquetes usando adb shell pm list -3, pero como esos son solo nombres de paquetes, reconocer aplicaciones es una conjetura. Entonces, si hubiera algún comando ADB para recuperar el nombre común para un nombre de paquete dado, simplemente podría usar un bucle como for pkg in $(adb shell pm list -3); do echo "- $(adb <whatever_the_command_is> $pkg) ($pkg)"; doney obtener una lista de todas las aplicaciones de usuario instaladas en un "formato legible por humanos" junto con sus nombres de paquete.

Casos de uso:

  • Ver qué aplicaciones "superfluas" están instaladas (que podría eliminar)
  • Listas de verificación cruzada de múltiples dispositivos
  • Documentación ;)
  • y probablemente más (pero los 3 anteriores son para lo que lo necesito)
Solo una idea (¿creo que ya lo intentaste?). ¿Por qué simplemente no compilas aapt para Android y lo ejecutas desde Shell? :D
@ user3344236 Soy consciente de esa posibilidad; pero no siempre es una opción instalar algo en el dispositivo en cuestión, especialmente no un binario autocompilado (a veces recibo dispositivos entregados que no están rooteados, y tengo que mantener "condiciones de tipo forense", es decir, "hacer no alterar el dispositivo, simplemente explorarlo").
Entonces, la segunda idea es escribir una herramienta que se ejecute a través de adb shell ... sin usar adbd modificado en el dispositivo y sin enviar algunos archivos allí. Creo que te llevará algo de tiempo lograr esto (si es que alguna vez lo logras) :D
@ user3344236 demasiado preocupante, especialmente porque no soy un desarrollador de Android. Actualmente uso una "solución basada en la web" (similar a la "búsqueda de Google Play"), ya que no parece haber una solución nativa aquí (¿todavía?).
¡Hola, Izzy! Teniendo en cuenta los comentarios (arriba), ¿significa que necesita una solución teniendo en cuenta un dispositivo no rooteado?
@Firelord Preferiblemente sí, aunque las soluciones solo para root serían mejores que ninguna;)
No es que sea la solución deseada, pero es seguro asumir que un dispositivo no rooteado probablemente tenga un Google Play Store activo, y si ese es el caso, puede obtener al menos algunas <APP_NAME> and <PKG_NAME>de las bases de datos ( localappstate.db) dentro de él. ¿Lo has probado? No he verificado si la copia de seguridad de ADB cubre Play Store o no.
Buena idea, @Firelord, pero seguro que eso también se aplicaría a las aplicaciones instaladas por otros medios (Aptoide, F-Droid, adb install) que la tienda de juegos no conoce. Y en segundo lugar, suponiendo un dispositivo no rooteado: ¿se podría acceder a esa base de datos a través de ADB de alguna manera? "Desde las bases de datos internas" seguramente significa en algún lugar debajo /data/datade , que no es "abiertamente accesible" sin root. Es necesario verificar si se puede acceder a esa base de datos desde una copia de seguridad de ADB, lo que aún requeriría tener las bibliotecas SSL disponibles para descifrarla.
@Izzy Tengo tres confirmaciones: si el dispositivo no root tiene instalado Aptoide o F-Droid, entonces considérelo como una mina de oro, ya que sus bases de datos están cubiertas por la copia de seguridad de ADB, y tienen individualmente todas<APP_NAME> and <PKG_NAME> las aplicaciones del sistema + usuario. Hablando de Play Store, su base de datos también está cubierta por la copia de seguridad de ADB, pero solo daría <APP_NAME>para aquellas aplicaciones que se instalan usando Play Store. El resto se enumeran por <PKG_NAMES>solo. // Podría ayudar, supongo.
Sí, pero significaría un montón de rompecabezas, buscando todo tipo de tiendas de aplicaciones posiblemente instaladas hasta que tengas todas las aplicaciones cubiertas. No es realmente factible. Debe haber algún "lugar central" que alimente cosas como el cajón de la aplicación. Ese entonces sería el lugar para encontrar mis diamantes :)
Parece aaptque está incluido con las ROM de Android desde 4.4 (Kitkat) en adelante, consulte esta respuesta . ¿Alguien puede confirmar esto para las ROM de stock?

Respuestas (2)

Aquí está mi solución para un teléfono no rooteado que necesitaba algunos cambios leves desde arriba que ejecuté en un Moto G de segunda generación con Android 5.0.2.

No tenía aaptbinario /system/bin, así que primero intenté descargar desde https://android.izzysoft.de/downloads

pero cuando traté de ejecutarlo, recibí un error que decía:

error: only position independent executables (PIE) are supported.

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

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

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

Por lo que entonces:

adb shell pm list packages -3 -f

obtiene una lista de aplicaciones de terceros (aplicaciones que ha instalado, no aplicaciones del sistema) y luego puede usar el paquete del comando anterior aaptpara 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

Entonces, a continuación hay una secuencia de comandos (para un cliente de Linux) para obtener solo un nombre "común" para 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 desea el paquete y la versión, 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 }'

Salida de ejemplo:

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'
PD: Mi página de descarga ahora también se vincula a la fuente que ha especificado, solo "un nivel más arriba", para que la gente pueda elegir entre compilaciones ARM y x86.

Esta no es una respuesta final, ya que no es genérica (solo funciona en algunos dispositivos), pero al menos es un comienzo:

Como hemos descubierto , al menos las ROM basadas en CM con Kitkat (Android 4.4) y superior se envían con el aaptbinario disponible en /system/bin1 . Si tu ROM no lo tiene, y la instalación del binario en el dispositivo es una opción, puedes encontrarlo 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}'

El resultado será algo así como label='Funny App', que luego puede 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 comillas simples, pero eso podría contar como cosméticos, o piensa cómo mejorar la parte sed para lidiar con eso).


1: no encontramos esto en las ROM de stock de Kitkat y superiores que hemos verificado, por lo que podrían ser solo ROM basadas en CM

Nota para los lectores: no es necesario tener un dispositivo rooteado para usar ese aaptbinario. Puede muy bien descargar y renombrar el binario aapten la PC, establecer un permiso ejecutable compatible con Linux en el binario y empujarlo a /data/local/tmp, luego usar la ruta absoluta /data/local/tmp/aaptpara usar el binario en esos comandos.
Entonces, para el nombre del paquete (primera parte de la pregunta original), haríaaapt d badging <path to apk> | grep 'package: name' | awk '{print $2}'