This is true, but it's also true that it's very common to see reviews where users complain about excessive, unnecessary permissions. It's also very common to see developers explain in app descriptions why they're requesting certain permissions (often times the answer is that the system bundles certain functionality under a permission the user wouldn't expect).
It's not perfect by any means, but the system does seem to be working reasonably well for what it is. It's certainly a step up from, say, desktop Windows' UAC implementation.
EDIT:
Come to think of it, the problem with UAC is more or less the opposite of your complaint about Android's permission system -- apps don't ask for permission unless they need them with UAC, but UAC doesn't do a very good job of communicating what the app needs permission to do.
but it's also true that it's very common to see reviews where users complain about excessive, unnecessary permissions
That may be true, but it's not showing a big effect. Pick two apps randomly from the store and you'll probably be asked to grant all sorts of unrelated permissions both times...
developers explain in app descriptions why they're requesting certain permissions
Yes, that's another aspect worth fixing. The developer should be able to annotate each critical call with an explanation. Although I like the idea in the sibling comment even better; just raise a popup when the permission is actually used (for the first time). There will be some corner-cases but in 9/10 cases that should make it pretty obvious for the user.
It's not perfect by any means, but the system does seem to be working reasonably well for what it is. It's certainly a step up from, say, desktop Windows' UAC implementation.
EDIT:
Come to think of it, the problem with UAC is more or less the opposite of your complaint about Android's permission system -- apps don't ask for permission unless they need them with UAC, but UAC doesn't do a very good job of communicating what the app needs permission to do.