Is there anyway to list all the applications installed on your phone and the permissions they require all on one page, or export the list so it can easily be audited?
5 Answers
Use market applications like Permission Watchdog or Permissions. Also, there are several others.
-
Unfortunately, Market application has a bug (or intended feature?) when not all permissions are listed when installing the application. This may a compatibility issue with software designed for older android releases... code.google.com/p/android/issues/detail?id=9365 Dec 2, 2010 at 13:49
-
2
-
@Nikolaenko, apparently it is on purpose and changed now: android.stackexchange.com/questions/605/… Dec 24, 2010 at 14:30
-
@BlackShift, what do you mean by "changed now"? Changed by Android dev. team? Dec 27, 2010 at 13:26
-
@Nikolaenko, I think I was unclear because it is unclear to me. I'm running cyanogenmod 6, android 2.2, and almost all apps ask for the permissions that your link claims are implicitely granted. So I don't know who changed this (cyanogen or android team). Dec 27, 2010 at 14:45
Another app that I ended up using instead of Permissions is RL Permissions. I prefer the interface. As far as which one works better, I don't know.
Permission Friendly Apps will list installed apps by their order of most demanding to least demanding permissions requirements. (It doesn't actually track or audit or adjust their behavior, though.)
Since no Android version is mentioned in the question, I'm proposing a command-line based answer relevant to Android version 4.2.1 and above. This ideally is an OS-independent solution, OS on PC, that is.
Dependencies
- Requires adb to be setup in PC.
Requires busybox binary. If the device is rooted, install Busybox app. Else, download busybox binary from official source, rename the binary to busybox, set Linux compatible executable permission on that binary for everyone and move it into device using
adb push LOCAL_FILE /data/local/tmp/ # LOCAL_FILE is the file path where busybox binary is located in PC
Requires aapt binary. If you're running a CM or its derivative ROM then ignore this requirement. Otherwise, for Android 4.x, you can consider downloading the binary from here, rename the binary to aapt, set Linux compatible executable permission on that binary for everyone and move it into device using
adb push LOCAL_FILE /data/local/tmp/ # LOCAL_FILE is the file path where busybox binary is located in PC .
For Android 5.x users, ask Google for assistance.
Here's my little script that does the magic:
#!/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
Demo output:
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
Save the script in PC into a file named perm_script.sh
and move it into /sdcard using
adb push LOCAL_FILE /sdcard/ # LOCAL_FILE is the path where you saved that file into PC
Run that file
adb shell sh /sdcard/perm_script.sh > OUTPUT_FILE # OUTPUT_FILE is the path where you want to save the final output
The greater the apps installed in the system, the greater the time will be for the command to complete execution. In my device, it took around three minutes.
Related: Is there a native way to find all the installed apps that have access to a phone feature?