#navi_header|技術| AndroidManifest.xmlでの""と"android:permission"属性の使用例+メモ。 #more|| #outline|| ---- * 実験 - "PermissionTest1" : Activity, BroadcastReceiver, Serviceを用意しているアプリ。Permission, "android:exported", IntentFilterの組み合わせについては後述の表。 - "PermissionTest2" : PermissionTest1の各コンポーネントを呼び出すアプリ。AndroidManifest.xmlで必要な""を定義済み。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で公開: - https://bitbucket.org/msakamoto_sf/androidpermissionsamples ** 結果 予想通り + android:exported="false"の非公開は呼べない。 + android:exported省略時は、IntentFilterが無ければ非公開、IntenFilterが有れば公開扱い。 ++ ReceiverについてはIntentFilter有りのexported無しが非公開扱いになっており、これだけ予想と異なっていた。 + Permissionがある場合は、上記の判断 AND Permissionのレベルに応じた判定となる。 ++ 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 | 同左 | ** 参考資料 - Security and Permissions | Android Developers -- http://developer.android.com/guide/topics/security/security.html - コンテントプロバイダを公開しない方法 - haruserのめもちょ -- http://d.hatena.ne.jp/haruser/20090823/1251042430 - ContentProvider で特定のアプリにのみ利用を許可する - おともだち革命 -- http://d.hatena.ne.jp/s5r/20110225/1298613278 #navi_footer|技術|