La première section est idéalement censée être indépendante du système d'exploitation (sur PC). La solution dépend fortement de la sortie de paquet service. Il a été testé avec succès sur Android 4.2.1, 5.0.2 et 5.1.1 - toutes ces versions ne sont pas fortement modifiées par rapport à l'Android standard.
Dépendances
-
Nécessite adb à configurer dans le PC.
-
Nécessite busybox binaire. Si l'appareil est enraciné, installez Busybox app. Sinon, téléchargez le binaire busybox à partir de source officielle et renomme le binaire en busybox compatible avec Linux autorisation d'exécution sur ce binaire pour tout le monde et le déplacer dans le dispositif en utilisant
adb push LOCAL_FILE /data/local/tmp/ # LOCAL_FILE is the file path where busybox binary is located in PC
-
Nécessite aapt binaire. Si vous utilisez une ROM CM ou une ROM dérivée, ignorez cette exigence. Sinon, pour Android 4.x, vous pouvez envisager de télécharger le binaire à partir de ici et renomme le binaire en aapt compatible avec Linux autorisation d'exécution sur ce binaire pour tout le monde et le déplacer dans le dispositif en utilisant
adb push LOCAL_FILE /data/local/tmp/ # LOCAL_FILE is the file path where busybox binary is located in PC .
Utilisateurs d'Android 5.x : demandez de l'aide à Google.
Voici mon petit 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
Enregistrez le script en PC dans un fichier nommé perm_script.sh
et le déplacer dans /sdcard en utilisant
adb push LOCAL_FILE /sdcard/ # LOCAL_FILE is the path where you saved that file into PC
Exécutez ce fichier
adb shell sh /sdcard/perm_script.sh PERMISSION # replace PERMISSION with the android permission for which apps are to be shown
Sortie démo :
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
Notez que toutes ces applications et leurs permissions, entre autres, se trouvent également dans le fichier /data/system/packages.xml
.
(Pour obtenir le label de l'application en utilisant son nom de paquetage, utilisez la fonction <a href="https://android.stackexchange.com/a/19866/96277">réponse </a>- fonctionne si seule l'application est disponible dans le Play Store ; utilisez la méthode d'Izzy <a href="https://android.stackexchange.com/a/115664/96277">réponse </a>- fonctionne pour toute application installée).