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

15

Estoy buscando la 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 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 forma de recuperar la información directamente desde el dispositivo, si es posible, no "de ninguna manera" (incluidas las "búsquedas web" o "a través de una aplicación"), ya que esas dos preguntas lo tienen.

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

  • adb dumpsys package: Si bien esto enumera todos los paquetes con muchos detalles, no se muestra el "nombre común"
  • adb shell pm list: solo da los nombres de los paquetes
  • aapt sería capaz de obtener el nombre común, pero requeriría primero extraer el .apk archivo del dispositivo, lo que 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 manera 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 obtenerlo, usando ADB directamente?


TL; DR

Antecedentes (si alguien tiene curiosidad): Quiero poder obtener rápidamente una lista de aplicaciones de usuario de cualquiera de mis dispositivos, sin tener que volver a las acrobacias. Una lista de los nombres de sus paquetes que puedo recuperar usando adb shell pm list -3, pero como esos son solo nombres de paquetes, reconocer las aplicaciones es una conjetura. Entonces, si hubiera algún comando ADB para recuperar el nombre común de 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)"; done- y 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:

  • Vea qué aplicaciones "superflous" están instaladas (que podría eliminar)
  • Verificación cruzada de listas de múltiples dispositivos
  • Documentación;)
  • y probablemente más (pero los 3 anteriores son para lo que lo necesito)
Izzy
fuente
Solo una idea (creo que ya lo intentaste). ¿Por qué simplemente no compilas aapt para Android y lo ejecutas desde shell? : D
user3344236
1
@ 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 enraizados, y tengo que mantener "condiciones forenses", es decir, "hacer no altere el dispositivo, solo expórtelo ").
Izzy
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 insertar algunos archivos allí. Creo que le llevará un tiempo lograr esto (si alguna vez tiene éxito): D
user3344236
@ 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?).
Izzy
Hola izzy Teniendo en cuenta los comentarios (arriba), ¿significa que necesita una solución teniendo en cuenta un dispositivo no rooteado?
Señor del fuego

Respuestas:

8

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 superiores se envían con el aaptbinario disponible en /system/bin1 . Si su ROM no lo tiene, e instalar el binario en el dispositivo es una opción, puede encontrarlo aquí. .

Usar 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 así 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 si se imagina 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

Izzy
fuente
3
Nota para los lectores: No necesita tener un dispositivo rooteado para usar ese aaptbinario. Puede muy bien descargar y cambiar el nombre del binario aapten la PC, configurar el permiso ejecutable compatible con Linux en el binario y presionarlo /data/local/tmp, luego usar la ruta absoluta /data/local/tmp/aaptpara usar el binario en esos comandos.
Señor del fuego
Entonces, para el nombre del paquete (primera parte de la pregunta original), lo haríaaapt d badging <path to apk> | grep 'package: name' | awk '{print $2}'
gmoz22
8

Aquí está mi solución para un teléfono no rooteado que necesitaba algunos ligeros cambios desde arriba que ejecuté en un Moto G 2nd gen con Android 5.0.2.

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

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

error: solo 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 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 en aapt para obtener información sobre el paquete, por ejemplo:

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

A continuación, se muestra un script (para un cliente Linux) para obtener 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 última pero una 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'

Miguel

Mike Bounds
fuente
Muchas gracias y dos veces, Mike: una vez por el script de shell y la segunda por el puntero a la variante ARM de aapt! Lo comprobaré tan pronto como el tiempo lo permita (actualmente estoy un poco apurado). Votado por ahora, tal vez aceptado después de haber verificado :)
Izzy
PD: Mi página de descarga ahora también enlaza con la fuente que ha especificado, solo "un nivel más arriba", para que la gente pueda elegir entre las versiones ARM y x86.
Izzy