home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

技術/Android/PermissionExamples (v5)

技術/Android/PermissionExamples (v5)

技術 / Android / PermissionExamples (v5)
id: 997 所有者: msakamoto-sf    作成日: 2011-07-10 18:19:33
カテゴリ: Android 

AndroidManifest.xmlでの"<permission>"と"android:permission"属性の使用例+メモ。


実験

  • "PermissionTest1" : Activity, BroadcastReceiver, Serviceを用意しているアプリ。Permission, "android:exported", IntentFilterの組み合わせについては後述の表。
  • "PermissionTest2" : PermissionTest1の各コンポーネントを呼び出すアプリ。AndroidManifest.xmlで必要な"<uses-permission>"を定義済み。PermissionTest1と同じ証明書で署名する。
  • "PermissionTest3" : PermissionTest2と内容は同じだが、PermissionTest1,2と異なる証明書で署名する。

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で公開:

結果

予想通り

  1. android:exported="false"の非公開は呼べない。
  2. android:exported省略時は、IntentFilterが無ければ非公開、IntenFilterが有れば公開扱い。
    1. ReceiverについてはIntentFilter有りのexported無しが非公開扱いになっており、これだけ予想と異なっていた。
  3. Permissionがある場合は、上記の判断 AND Permissionのレベルに応じた判定となる。
    1. PermissionTest2ではSignatureレベルの公開扱いは呼べる、PermissionTest3ではSignatureレベルは全て呼べない。

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 同左

参考資料



プレーンテキスト形式でダウンロード
表示中のバージョン : 5
現在のバージョン : 6
更新者: msakamoto-sf
更新日: 2011-11-25 19:21:36
md5:9cd02e24257da9d0b2c8a5a700278484
sha1:ebc3808f0c3afebe1473a19c8017821797eb8f50
コメント
コメントを投稿するにはログインして下さい。