Dado que no se menciona ninguna versión de Android en la pregunta, propongo una respuesta basada en la línea de comandos pertinente a la versión 4.2.1 de Android y superior. Esto idealmente es una solución independiente del sistema operativo, el sistema operativo en el PC, es decir.
Dependencias
-
Requiere adb para que se configure en el PC.
-
Requiere busybox binario. Si el dispositivo está rooteado, instale Busybox aplicación. 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ás ejecutando una ROM de CM o sus derivados, entonces ignora 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 .
Para los usuarios de Android 5.x, pide ayuda a Google.
Aquí está mi pequeño script que hace la magia:
#!/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 not set
\[\[ -x /data/local/tmp/busybox \]\] && busybox=/data/local/tmp/busybox || { \[\[ -x /system/xbin/busybox \]\] && busybox=/system/xbin/busybox || { printf "busybox binary not found or executable permission not set. Exiting\\n" && 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 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 || { printf "aapt binary not found or executable permission not set. Exiting\\n" && exit; }; }; }
# 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
# For each package name in the output we just saved, get the app's label using $path and $label, print a line and then finally list the permissions granted to the app
while read line; do
path=$(pm path $line | $busybox sed 's/^package://g');
label=$($aapt d badging $path | $busybox grep 'application: label=' | $busybox cut -d "'" -f2);
$busybox printf "Permissions for app $label having package name $line\\n";
dumpsys package $line | $busybox sed -e '1,/grantedPermissions:/d' -e '/^\\s\*$/,$d' | $busybox sort;
$busybox printf "\\n";
done < /sdcard/packages.txt
Salida de demostración:
Permissions for app DisableService having package name cn.wq.disableservice
android.permission.READ\_EXTERNAL\_STORAGE
android.permission.WRITE\_EXTERNAL\_STORAGE
Permissions for app Indecent Xposure having package name co.vanir.indecentxposure
android.permission.RECEIVE\_BOOT\_COMPLETED
Permissions for app Tags having package name com.android.apps.tag
android.permission.CALL\_PHONE
android.permission.NFC
android.permission.READ\_CONTACTS
android.permission.WAKE\_LOCK
android.permission.WRITE\_SECURE\_SETTINGS
...
...
Permissions for app Themes Provider having package name org.cyanogenmod.themes.provider
android.permission.ACCESS\_NOTIFICATIONS
android.permission.ACCESS\_THEME\_MANAGER
android.permission.INTERNET
android.permission.READ\_THEMES
android.permission.WRITE\_SECURE\_SETTINGS
android.permission.WRITE\_SETTINGS
android.permission.WRITE\_THEMES
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 > OUTPUT_FILE # OUTPUT_FILE is the path where you want to save the final output
Cuanto mayor sea el número de aplicaciones instaladas en el sistema, mayor será el tiempo de ejecución del comando. En mi dispositivo, tardó unos tres minutos.
Relacionado: ¿Existe una forma nativa de encontrar todas las aplicaciones instaladas que tienen acceso a una función del teléfono?