AndroidManifest.xmlでの"<permission>"と"android:permission"属性の使用例+メモ。
Activityは表示されたか否か、BroadcastReceiver/ServiceはLogを出力するようにしてそれで判定する。PermissionTest2,3でもstartActivity()/sendBroadcast()/startService()それぞれtry-catchで囲み、ThrowableをLogに出力するようにしている。
予想としては、外部非公開は全て呼べない、それ以外はPermissionTest3だけ、"signature"レベルのpermissionが署名違いで呼べない結果になると思われる。
bitbucketにてMercurialで公開:
予想通り
という結果になった。
ただしReceiverについてはIntentFilter有りのexported無しが非公開扱いになっており、これだけ予想と異なっていた。
Activity:
PermissionTest2 | PermissionTest3 | |
android:exported=false | SecurityException: Permission Denial | 同左 |
android:exported=true | o | o |
IntentFilter有り + exported無し | o | o |
IntentFilter有り + exported=false | SecurityException: Permission Denial | 同左 |
IntentFilter有り + exported=true | o | o |
"normal" level + exported無し | SecurityException: Permission Denial | 同左 |
"normal" level + exported無し + IntentFilter | o | o |
"normal" level + exported=true | o | o |
"normal" level + exported=true + IntentFilter | o | o |
"normal" level + exported=false | SecurityException: Permission Denial | 同左 |
"normal" level + exported=false + IntentFilter | SecurityException: Permission Denial | 同左 |
"dangerous" level + exported無し | SecurityException: Permission Denial | 同左 |
"dangerous" level + exported=true | o | o |
"dangerous" level + exported=false | SecurityException: Permission Denial | 同左 |
"signature" level + exported無し | SecurityException: Permission Denial | 同左 |
"signature" level + exported=true | o | SecurityException: Permission Denial |
"signature" level + exported=false | SecurityException: Permission Denial | 同左 |
BroadcastReceiver:
PermissionTest2 | PermissionTest3 | |
android:exported=false | (Log-WARN): Permission Denial | 同左 |
android:exported=true | o | o |
IntentFilter有り + exported無し | (Log-WARN): Permission Denial | 同左 |
IntentFilter有り + exported=false | (Log-WARN): Permission Denial | 同左 |
IntentFilter有り + exported=true | o | o |
"normal" level | o | o |
"dangerous" level | o | o |
"signature" level | o | (Log-WARN): Permission Denial |
"normal" level + exported無し | SecurityException: Permission Denial | 同左 |
"normal" level + exported無し + IntentFilter | o | o |
"normal" level + exported=true | o | o |
"normal" level + exported=true + IntentFilter | o | o |
"normal" level + exported=false | SecurityException: Permission Denial | 同左 |
"normal" level + exported=false + IntentFilter | SecurityException: Permission Denial | 同左 |
"dangerous" level + exported無し | SecurityException: Permission Denial | 同左 |
"dangerous" level + exported=true | o | o |
"dangerous" level + exported=false | SecurityException: Permission Denial | 同左 |
"signature" level + exported無し | SecurityException: Permission Denial | 同左 |
"signature" level + exported=true | o | SecurityException: Permission Denial |
"signature" level + exported=false | SecurityException: Permission Denial | 同左 |
Service:
PermissionTest2 | PermissionTest3 | |
android:exported=false | SecurityException: Not allowed to start service Intent | 同左 |
android:exported=true | o | o |
IntentFilter有り + exported無し | o | o |
IntentFilter有り + exported=false | SecurityException: Not allowed to start service Intent | 同左 |
IntentFilter有り + exported=true | o | o |
"normal" level + exported無し | SecurityException: Permission Denial | 同左 |
"normal" level + exported無し + IntentFilter | o | o |
"normal" level + exported=true | o | o |
"normal" level + exported=true + IntentFilter | o | o |
"normal" level + exported=false | SecurityException: Permission Denial | 同左 |
"normal" level + exported=false + IntentFilter | SecurityException: Permission Denial | 同左 |
"dangerous" level + exported無し | SecurityException: Permission Denial | 同左 |
"dangerous" level + exported=true | o | o |
"dangerous" level + exported=false | SecurityException: Permission Denial | 同左 |
"signature" level + exported無し | SecurityException: Permission Denial | 同左 |
"signature" level + exported=true | o | SecurityException: Permission Denial |
"signature" level + exported=false | SecurityException: Permission Denial | 同左 |