Native層からSurfaceを扱うコードを書いたのだけど、ACCESS_SURFACE_FLINGERの権限が無いと警告が出てAPIが動いてくれない。
Androidはセキュリティ確保のためにシステムリソースへのアクセスに制限がかかっていて、特にACCESS_SURFACE_FLINGERの場合は署名付きアプリにしないといけないようだ。
で、署名付きアプリの作り方はググるといろいろ出てくるのだけど、正直なところ実際の開発中はいちいちこの手順を踏んでると面倒なことこの上ない。
...ということで、システム側のセキュリティレベルを下げて署名無しアプリ(デバッグ用署名)でも動作するように設定してみる。
frameworks/base/core/res/AndroidManifest.xmlにパーミッションごとのセキュリティレベルが書かれている。
ACCESS_SURFACE_FLINGERの場合は、
<!-- Allows an application to use SurfaceFlinger's low level features --> <permission android:name="android.permission.ACCESS_SURFACE_FLINGER" android:label="@string/permlab_accessSurfaceFlinger" android:description="@string/permdesc_accessSurfaceFlinger" android:protectionLevel="signature" />
とprotectionLevelが"signature"となっていて、署名が必要な事を示している。
これを、"normal"に変更すると署名が無くても、アプリ側のAndroidManifest.xmlにACCESS_SURFACE_FLINGERのパーミションを付けておくことで関連するAPIが動くようになる。(もしかすると、ソースツリー全体のmakeが必要かも)
パーミッションレベルは、リファレンスの<permission> | Android Developersを見てみると、
- normal
- dangerous
- signature
- signatureOrSystem
の4つがあるようだ。詳しい解説まで読んでないけど、dangerousってなんだろうな。
とりあえず開発中はこの設定で進めておいて、リリース用テスト環境などで別途セキュリティ面のテストするほうが開発効率は良さそうな気がする。
(参考)Accounted error when display video frame with surfaceflinger - android-framework | Google グループ
コメント