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

技術/Android/PermissionExamples (v4)

技術/Android/PermissionExamples (v4)

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

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


実験

  • "PermissionTest1" : Activity, BroadcastReceiver, Serviceを用意しているアプリ。全てのコンポーネントでIntentFilterを設定せず、パッケージ名とクラス名で直接呼び出すものとする。それぞれ次の5パターンを用意。
    • android:exported=false : 外部非公開。IntentFilterが無いので、特に指定しない場合のデフォルト設定。
    • android:exported=true : 外部公開。
    • Intent有り + android:exported 指定なし : IntentFilterが有るため、exported省略時は外部公開。
    • Intent有り + android:exported=false : IntentFilterが有るが、exported=falseなので外部非公開。
    • Intent有り + android:exported=true : IntentFilterが有り、外部公開。
    • android:permission="test.perms1.TESTPERM_NORMAL" : "normal"レベルのpermissionを要求(+外部公開)。
    • android:permission="test.perms1.TESTPERM_DANGEROUS" : "dangerous"レベルのpermissionを要求(+外部公開)。
    • android:permission="test.perms1.TESTPERM_SIGNATURE" : "signature"レベルのpermissionを要求(+外部公開)。
  • "PermissionTest2" : PermissionTest1の各コンポーネントを呼び出すアプリ。AndroidManifest.xmlで必要な"<uses-permission>"を定義済み。PermissionTest1と同じ証明書で署名する。
  • "PermissionTest3" : PermissionTest2と内容は同じだが、PermissionTest1,2と異なる証明書で署名する。

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が有れば公開扱い。
  3. PermissionTest3でのみ、"signature"レベルのpermissionが署名違いで呼べない。

という結果になった。
ただし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 + 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 同左

参考資料



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