高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

Androidのコマンドとか権限とかの話

最近会社の業務効率化ツールなどを書いてることが多い。対象にはAndroidの自動処理も入っており、家ではそうそう関わらないフレームワーク周りの機能について調べることもしばしば。

ということで前振り長くなりました。Androidのコマンド周りとか権限の仕組みについて簡単に調べたのでメモ。

権限の仕組み

AndroidManifest.xmlのuses-permissionタグに宣言して使う権限ですが、この権限は基本的に以下の四種類のprotection-levelに分かれています。

normal バイブレーションの制御、ネットワーク状態の表示など、ユーザーデメリットとなる可能性の少ない権限。アプリケーションインストール時に表示はされるが「その他の権限」にまとめられており最初は隠れている
dangerous インターネット接続や電話の発信など、ユーザーにデメリットとなりうる権限。アプリケーションインストール時に使用する権限の一覧として表示される
signature キーボードの遠隔操作など一般開放されては脆弱性になりうる権限。APIを使用するアプリと現在フォアグラウンドなアプリが同一の署名(作者)である場合のみ使用可能(と思っていたのですが、一般的にはプリインアプリのみ使用可能という扱いだそうで。詳細はよく分かりません*1)。アプリケーションインストール時には表示されない
signatureOrSystem アプリケーションの(ユーザー確認を伴わない)インストールなどの強力な権限。プリインストール(/system/app配下にインストールされている)アプリと同一の署名(つまりgoogleかOHA標準アプリ、キャリアや端末ベンダーのみ)でしか使用できない。

au one Marketなど、キャリアのマーケットアプリでのみ「提供元不明のアプリ」にチェックをいれなくてもアプリケーションインストールが可能だったりするのは、アプリケーションのインストール(android.permission.INSTALL_PACKAGES)がsignatureOrSystemレベルの権限であるせい。

権限を行使できない権限を付与したアプリは使用できないわけではないが、もし権限の行使に失敗しても、権限記載などなかったかのように失敗するのでぱっと見わかりづらい*2ので、その辺は注意するしかない。
なお、権限はそれぞれAndroidManifest.xmlのpermissionタグで宣言する(権限の表示名もそこで決定する)。システム標準と思われるすべての権限は、システムコアのパッケージがpermission宣言している。

コマンドについて

以前にも触れたキーボードのボタン押下をエミュレートできる強力なコマンド、input。これは、一般のアプリケーションから呼び出しを行った場合、そのアプリケーションの権限の元で動くことになっているらしい。
そのため、他のアプリケーションがフォアグラウンド状態であるときにinputコマンドを入力しても、キーイベントなどを挿入するandroid,permission.INJECT_EVENTS権限がないと怒られてしまう*3
他に権限が影響する系統のコマンドは見つけられていないものの、基本的にはこのようになっている様子。inputコマンドを見つけたときは「こんなコマンド放置しておいて大丈夫なのか?」と思いましたがコレで解決です(ただし、adbからはコマンドが実行できるので、USBケーブルを繋いだ or rootかつワイヤレスadbが有効な状態で端末を放置しておくのはかなり危険であると)。


Androidもこうやって調べてみるとなかなか奥が深いフレームワークを積んでいるようです。仕事でやっているとはいえ、これはとても勉強になる。このへんの知識を趣味の開発に活かせられるのかなあ。

*1:コンソールエミュレータアプリなどからは一部これに該当すると思われる操作もできるため

*2:たとえばsignature権限のINJECT_EVENTSを他者のアプリがフォアグラウンドの時に行使しようとした場合、AndroidManifest.xmlに権限記載をしてもしなくても同一の例外が返る。権限指定のスペルミスと区別が付かなくて困りました…

*3:ただ、signature権限であるため、コマンド実行を指示したアプリケーションとそのときにフォアグラウンドなアプリケーションが同一である場合はコマンドの実行が行える(例. 端末エミュレータからinputコマンドを実行した場合は、成功する