I'm sick of Android's permissions system. As you can't reject individual permissions it suffers from permission creep. In their first versions, applications tended to request only permissions they really need. Then every update they request more and more, usually wildly different from the purpose of the application.
For example, Google Maps requires "Allows the application to call phone numbers without your intervention" since last update. I don't want to grant that (it just needs to show a map ffs), but must, or stay behind.
What would great is to be able to selectively grant permissions to applications. I've read that cyanogenmod can do that, but have been careful with reflashing my phone. Maybe I'll give that a try now...
If anyone's interested, on CyanogenMod 7.2 the relevant setting's in Settings -> CyanogenMod settings -> Application -> Permission management. After that, you can turn permissions on and off from the app manager. (As far as I can tell, this hasn't been implemented in any of the CM9 nightlies.)
The problem with this approach is that the app expects the permission and will most likely crash if rejected. One alternative which works better is the LBE Privacy Guard app, what it does is, instead of denying the app to read the contacts list for example, it simply gives it an empty one.
That's probably so you can call phone numbers for businesses from inside Google Maps, without having to ask for permission at that point each time. I doubt it means it can call on its own.
But even so, I agree that the permission system is so generic and creepy, and sometimes you freak out when you see some (probably harmless) permissions, because you don't really know what to expect, and you don't know what kind of power Google has given to developers through these permissions.
Though others claim that for calling it launches the phone app, and doesn't call out itself...
Anyway -- it is just a pretty harmless example. Some games are much worse. I don't have time to research or decompile all interesting apps to see what they are doing with a certain permission.
I never call from my map, so don't want to grant it. It may also use the permission for calling premium/foreign numbers behind my back and cramming my cellphone bill. I don't like the "Accept it all or leave" approach.
Afaik, the way permissions work on Android is that each application is its own user, and each permission is a group. If you have a rooted device, you can simply log in and remove the user from the group to un-grant that permission.
I doubt it will help you though, because it will most likely cause some function somewhere to throw an exception which will in turn cause the app to crash.
I doubt it will help you though, because it will most likely cause some function somewhere to throw an exception which will in turn cause the app to crash.
That's why I blame the Android platform and not just the apps. If Android made it clear from the start that permissions are optional, and that requests for them can be rejected, applications would be written to cope with that. It would also force developers to explain why they need a certain permission.
You're absolutely right. Not having a distinction between required permissions (e.g. a music player is pretty useless without the permission to read the SD card) and optional ones (e.g. a Twitter app can attach your location to your tweets if you want it to, but it doesn't have to) is the biggest problem with Android's permissions system.
Ironically, it is more of a social problem than a technical one. If people were expected to gracefully handle the exceptions thrown when permissions are denied, we'd be 80% of the way there, I think.
I think a lot of app crashes are due to the fact that app developers simply don't know what to expect. This is a direct result of shoddy documentation.
For example, the Android API has a tendency to return null from functions even when the documentation doesn't say it will (i.e. WifiManager.getScanResults and friends), or simply doesn't document return values at all (i.e. ConnectionManager.getActiveNetworkInfo). The Google guys aren't real stars when it comes to documenting what exceptions may be thrown either.
You can't blame app developers for not gracefully handling exceptions and return values that are not documented.
Apparently I was only partly right. Each app is its own user, and certain permissions such as sockets and files are enforced using groups.
However, when the functionality that is being protected is implemented in a system service (which runs in a different process), it's the responsibility of the callee to check the permissions of the caller using Android's own 'permissions validation mechanism'.
For example, Google Maps requires "Allows the application to call phone numbers without your intervention" since last update. I don't want to grant that (it just needs to show a map ffs), but must, or stay behind.
What would great is to be able to selectively grant permissions to applications. I've read that cyanogenmod can do that, but have been careful with reflashing my phone. Maybe I'll give that a try now...