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