5 votos

¿Cómo puedo encontrar qué aplicaciones/paquetes hacen referencia a un determinado permiso utilizando la línea de comandos?

Con un poco de permiso tld.developer.app.permission.PERMISSION ¿cómo puedo usar adb/Root shell para encontrar todos los paquetes instalados que definen/dependen de él?

Los permisos se definen en los archivos de manifiesto y es posible transferir cada apk desde /data/app , /system/app , /system/priv-app etc., desempaquetar y comprobar, pero ¿hay alguna forma mejor?

5voto

Firelord Puntos 161

Lo ideal es que la primera sección sea independiente del sistema operativo (en el PC). La solución depende en gran medida de la salida de paquete servicio. Se ha probado con éxito en Android 4.2.1, 5.0.2 y 5.1.1 - todas estas versiones no están muy modificadas respecto a Android de serie.

Dependencias

  • Requiere adb para que se configure en el PC.

  • Requiere busybox binario. Si el dispositivo está rooteado, instale Busybox app. Si no, descargue el binario de busybox desde fuente oficial , cambie el nombre del binario a busybox , establecer la compatibilidad con Linux permiso de ejecución en ese binario para todos y moverlo al dispositivo usando

    adb push LOCAL_FILE /data/local/tmp/   # LOCAL_FILE is the file path where busybox binary is located in PC
  • Requiere aapt binario. Si está ejecutando un CM o su ROM derivada, entonces ignore este requisito. De lo contrario, para Android 4.x, puedes considerar la descarga del binario desde aquí , cambie el nombre del binario a aapt , establecer la compatibilidad con Linux permiso de ejecución en ese binario para todos y moverlo al dispositivo usando

    adb push LOCAL_FILE /data/local/tmp/   # LOCAL_FILE is the file path where busybox binary is located in PC . 

    Usuarios de Android 5.x: pedir ayuda a Google.

Aquí está mi pequeño script:

#!/system/bin/sh
# Check if the busybox binary exists under /data/local/tmp/ or /system/xbin. Set the detected binary's path into the variable busybox or exit if file doesn't exist or executable permission is not set
\[\[ -x /data/local/tmp/busybox \]\] && busybox=/data/local/tmp/busybox || { \[\[ -x /system/xbin/busybox \]\] && busybox=/system/xbin/busybox || { date +'busybox binary not found or executable permission is not set. Exiting' && exit; }; }

# Check if the aapt binary exists under /data/local/tmp or /system/bin or /system/xbin. Set the detected binary's path into the variable aapt or exit if file doesn't exist or executable permission is not set
\[\[ -x /data/local/tmp/aapt \]\] && aapt=/data/local/tmp/aapt || { \[\[ -x /system/bin/aapt \]\] && aapt=/system/bin/aapt || { \[\[ -x /system/xbin/aapt \]\] && aapt=/system/xbin/aapt || { date +'aapt binary not found or executable permission is not set. Exiting' && exit; }; }; }

# Validate input
! \[\[ "$1" == +(\[0-9a-zA-Z.\_\]) \]\] && { $busybox printf 'Permission field should not be empty or contain anything beyond these characters: a-zA-Z0-9.\_' && exit; } || perm=$1;

# List package name of all the installed apps and save them in the file packages.txt under /sdcard
pm list packages | $busybox sed 's/^package://g' | $busybox sort -o /sdcard/packages.txt
$busybox printf "List of apps defining and/or depending on the permission $perm:\\n\\n";

# Take each line (a package name) from the file packages.txt. In the output of package service for that package name, see if the permission is granted or defined and set appropriate variable state. For different states, we're either dumping the label of the app using aapt, printing the status of define/granted permissions for package or simply moving on.
while read line; do 
    \[\[ \`dumpsys package $line | grep -Eo "^\[ \]+$perm"\` \]\] && granted=1 || granted=0;
    \[\[ \`dumpsys package $line | grep -Eo "^\[ \]+Permission\[ \]+\\\[$perm\\\]\[ \]+\\(\[a-zA-Z0-9\]+\\):"\` \]\] && defined=1 || defined=0;
    \[\[ $granted == 1 || $defined == 1 \]\] && path=$(pm path $line | $busybox sed 's/^package://g') && label=$($aapt d badging $path 2>&1 | $busybox sed -ne '/application: label=/p' | $busybox cut -d "'" -f2);
    \[\[ $granted == 1 && $defined == 1 \]\] && $busybox printf "$label ($line)\\nDefined: Yes\\nGranted: Yes\\n\\n";
    \[\[ $granted == 1 && $defined != 1 \]\] && $busybox printf "$label ($line)\\nDefined: No\\nGranted: Yes\\n\\n";
    \[\[ $granted != 1 && $defined == 1 \]\] && $busybox printf "$label ($line)\\nDefined: Yes\\nGranted: No\\n\\n";
done < /sdcard/packages.txt 

Guarda el script en PC en un archivo llamado perm_script.sh y moverlo a /sdcard usando

adb push LOCAL_FILE /sdcard/   # LOCAL_FILE is the  path where you saved that file into PC

Ejecutar ese archivo

adb shell sh /sdcard/perm_script.sh PERMISSION   # replace PERMISSION with the android permission for which apps are to be shown

Salida de demostración:

List of apps defining and/or depending on the permission android.permission.FLASHLIGHT:

Android System (android)
Defined: Yes
Granted: No

Automagic Premium (ch.gridvision.ppam.androidautomagic)
Defined: No
Granted: Yes

MacroDroid (com.arlosoft.macrodroid)
Defined: No
Granted: Yes

Google+ (com.google.android.apps.plus)
Defined: No
Granted: Yes
...
Bluetooth (com.mediatek.bluetooth)
Defined: No
Granted: Yes

DS Battery Saver Pro (com.rootuninstaller.batrsaverpro)
Defined: No
Granted: Yes

Webkey (com.webkey)
Defined: No
Granted: Yes

Tenga en cuenta que todas esas aplicaciones y sus permisos, entre otras cosas, también se pueden encontrar en el archivo /data/system/packages.xml .


(Para obtener la etiqueta de la aplicación utilizando su nombre de paquete, utilice la función de GAThrawn <a href="https://android.stackexchange.com/a/19866/96277">responder </a>- funciona si sólo la aplicación está disponible en Play Store; utiliza la aplicación de Izzy <a href="https://android.stackexchange.com/a/115664/96277">responder </a>- funciona para cualquier aplicación instalada).

0 votos

Tengo un error al ejecutar tu script, ¿me he perdido algo? adb shell sh /sdcard/perm_script.sh PERMISO /sdcard/perm_script.sh[6]: error de sintaxis: '{' no coincidente o directamente ejecutado en el Android 8 script salida Terminado de ejecutar script archivo valor de salida:1 stdout: null stderr: /sdcard/perm_script.sh[6]: error de sysntax: '{' unmatched

0 votos

@Gidabytes Acabo de probar mi script en Android 8.1 (en OnePlus 6), y funciona. Puede que estés haciendo algo mal al copiar el contenido de script supongo. Puedes contestar una pregunta aparte para eso, y hacer referencia a mi respuesta, si es necesario.

3voto

Blickquickly Puntos 1

Esto funcionó para mí (Android 8):

cmd appops query-op RUN_IN_BACKGROUND allow | sort

Muestra qué paquetes tienen RUN_IN_BACKGROUND modo activado.

1 votos

Es una solución buena y fácil de usar, pero también tiene algunos defectos. En primer lugar, sólo permite consultar los permisos peligrosos, porque appops sólo funciona para eso, así que permisos normales no puede ser consultado con esto. En segundo lugar, se requieren múltiples ejecuciones para determinar qué aplicaciones tienen un permiso permitido, predeterminado, denegado o ignorado.

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