5 votes

Comment puis-je trouver les applications/packages qui font référence à une permission donnée en utilisant la ligne de commande ?

Avec une certaine permission tld.developer.app.permission.PERMISSION comment puis-je utiliser le shell adb/Root pour trouver tous les paquets installés qui définissent/dépendent de lui ?

Les autorisations sont définies dans les fichiers manifestes et il est possible de transférer chaque apk à partir de /data/app , /system/app , /system/priv-app etc., déballer et vérifier, mais y a-t-il un meilleur moyen ?

5voto

Firelord Points 23064

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

0 votes

J'ai eu une erreur en exécutant votre script, ai-je manqué quelque chose ? adb shell sh /sdcard/perm_script.sh PERMISSION /sdcard/perm_script.sh[6] : syntax error : '{' unmatched or directly running on the Android 8 Script output Finished executing script file exit value:1 stdout : null stderr : /sdcard/perm_script.sh[6] : erreur de syntaxe : '{' sans correspondance

0 votes

@Gidabytes Je viens de tester mon script sous Android 8.1 (dans le OnePlus 6), et il fonctionne. Vous pourriez faire quelque chose de mal en copiant le contenu du script, je suppose. Vous pouvez poser une question distincte pour cela, et référencer ma réponse, si nécessaire.

3voto

VasyaNovikov Points 121

Cela a fonctionné pour moi (Android 8) :

cmd appops query-op RUN_IN_BACKGROUND allow | sort

Il indique les paquets qui ont RUN_IN_BACKGROUND mode activé.

1 votes

Il s'agit d'une bonne solution, facile à utiliser, mais qui présente aussi quelques inconvénients. Tout d'abord, elle ne permet d'interroger que les permissions dangereuses, car appops ne fonctionne que pour cela, donc autorisations normales ne peut pas être interrogé avec cela. Deuxièmement, il faut plusieurs exécutions pour déterminer quelles applications ont une permission autorisée, par défaut, refusée ou ignorée.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X