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).