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 muestraadb shell pm list
: solo da los nombres de los paquetesaapt
podría obtener el nombre común, pero primero sería necesario extraer el .apk
archivo 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 .apk
archivo cada vez que la GUI necesita el "nombre común"). Entonces, ¿hay alguna manera de conseguirlo usando ADB directamente?
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)"; 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:
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 aapt
binario /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 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
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'
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 aapt
binario disponible en /system/bin
1 . 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
aapt
binario. Puede muy bien descargar y renombrar el binario aapt
en 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/aapt
para usar el binario en esos comandos.aapt d badging <path to apk> | grep 'package: name' | awk '{print $2}'
ares777
izzy
ares777
izzy
Señor del Fuego
izzy
Señor del Fuego
<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.izzy
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/data
de , 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.Señor del Fuego
<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.izzy
izzy
aapt
que 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?