Tweet Yahoo!ブックマークに登録 しよう!
  1. 1.開発環境の構築
  2. 2.HelloWorld
  3. 3.Androidアプリの特徴
  4. 4.アクセス許可
  5. 5.インターフェイス

4_Android のアクセス許可システム

 もし、全ての「アプリケーション」が、無制限プラットフォーム内部のリソースハードウエア機器 アクセス出来るとしたら、このシステムは 外部からの攻撃 にさらされる事になる。
 従って、多くのプラットフォームは「サードパーティー・アプリケーション」の「
設置」と「実行」を許容しながらも、保安上 の安全な構造を保つ為に、アプリケーションを「サンド・ボックス」化する場合が多い。これは以前にも学んだが、例えば「アプリケーション」が「Data」を読み書き出来る場所をアプリケーションの「フォーム・ディレクトリ」に限定し、それ以外のディレクトリリソースハードウエア機器への アクセス遮断 し、 外部からの攻撃から守る安全な構造をいう。
 Androidは、このような「サンド・ボックス」構造を採用している。しかし反面、「アプリ」間で「Data」・「コンポーネント」などの「共有」を必要とする高級アプリ開発の「足かせのような構造」とも言える。

 しかしAndroidでは「サンド・ボックス」構造を保ちながらも、「コンポーネント」や「ハードウエア・モジュール」「Data」などを共有する特別な方法を提供している。それが「アクセス許可」システムだ。これはリソース」を提供する側で宣言した「アクセス許可を、「リソース」を利用する側で「取得」し、それによって「リソース」の利用が可能になる! というシステムだ。
 なおAndroidの「アクセス許可システム」は種類からなっているが、ここではアクセス許可の追加方法各種アクセス許可の「特徴について簡単に述べる。

A_「アクセス許可」をマニフェスト・ファイルへ「追加」(uses-permission パーミッションを使用する)

 「アクセス許可」の追加「黙示的インテント」で「電話機能」をテストする(Link)、で学んだ。それを要約するとAndroidで既に定義されている「電話機能」へのアクセス許可」の「名前」を、アプリ側の「マニフェスト・ファイル」に追加し、アプリ上から「電話機能」を使えるようにした、という事だ。
 下画像「マニフェスト・ファイル」を開いて見ると、赤線部分の " android.permission.CALL_PHONE "が「アクセス許可の名前」だ。
 「編集機」を使わず直接記述してもいい。もし直接記述する場合、<uses-permission    />エレメント
位置は、<application     />エレメントではなく、<manifest    />エレメントの下位エレメント にしなければならない。

 上記のように「マニフェスト・ファイル」に「アクセス許可」を「追加」すれば、「アプリ」が端末にインストールされた時、インストーラは「証明書」に「署名」した「権限」をチェックし「アクセス許可」を付与するかどうかを決定し、場合によっては
ユーザーに対して「アクセス許可」を付与するかどうかを「要求」できる。何れにせよ、「アクセス許可」が付与されれば、その「アプリ」を使って「電話」をかける事が出来る。
 <uses-permission    />エレメントuses-permission は、パーミッションを使用すると宣言している。デフォルトでは「アプリケーション」は端末の保護されたAPIやリソースにアクセスできないが、このパーミッション宣言により、アクセス制限のある APIリソースに対してアクセスできるように処理できる。

permission_01.png

 

 Android側で定義された「アクセス許可の名前」には「CALL_HONE」(電話機能)以外にも、下画像のように多数の機能が予め準備されている。
 開発者はセキュアな「サンド・ボックス」構造の環境の中で、様々なAndroidが提供する「機能」への「アクセス許可の名前
」を用いて、より「有益なアプリ」開発に挑む事ができる。

permission_02.png

 

悪意のあるアプリケーションの特徴
 
有益なAndroid
アプリ開発の手段である この「アクセス許可」システム、このシステム(機能)を悪用するアプリが増えている。
 悪意のあるアプリケーションの特徴は「アクセス許可」の追加が非常に多い事だ。
 ユーザーは「無料」で「便利なアプリ」だからと言ってこの「アクセス許可」を無視し、無防備にアプリを利用する事の危険性を認識し始めた。ユーザーも自然に知恵深くなっていく。「アプリ」のインストール後、その「アプリ」の「アクセス許可」の状態について常に「チェック」するユーザーは賢い。
 「アクセス許可」をチェックするには!下画像の順序で「アプリケーション情報」の「許可」をみればいい
 下画像は「JetBoy」アプリの例だが「アクセス許可」は「ストレージ」と「電話・通話」の2点のみだ。
 それに対し右側は「APIdemo 」アプリの「アクセス許可」は多数だ。「個人情報」まで「アクセス許可」が与えられている。これは「デモ」用のアプリなので当然多くの機能への「アクセス」を「
許可」している。このように目的に適った「アクセス許可」なら別に問題はない。
 だが「通常のアプリ」でアクセス許可が必要以上に多い場合は要注意!悪意のあるアプリ」である可能性を考えよう。
 

permission_03.png

 最近、Android用マルウェア、日本語アプリにも混入 という記事を見つけた。知恵深いユーザーはこれを参考にしているに違いない。
 そして、 アプリの持つパーミッション(権限)を確認 できる便利なアプリが無料で公開されている。アプリ開発者もたいしたもんだ。7roidからもお勧めするアプリだ!

B_アクセス許可を定義(宣言)する(permission パーミッションを追加する)

 上記「アクセス許可の追加」は、Android 既存の「アクセス許可の名前」を、アプリケーション側で利用する場合だった。今度はそれとは反対に、自作「アプリの「コンポーネント」や「ライブラリー」に対して「アクセス許可定義(宣言)」する場合だ。自作「アプリ」に「アクセス許可定義(宣言)することにより、他「アプリ」から自作「アプリ」の「コンポーネント」や「ライブラリー」への「アクセス」が可能となる。
 
 「アクセス許可定義(宣言)」するには、マニフェスト・ファイル」に<permission   />エレメントを追加し、そこにいろいろな属性を加える事によって可能となる。具体的には「マニフェスト・ファイル」に直接記述してもいいが、下画像の「permission」を選択し ~ に「Browse」→「入力」する方法が効率的だと思う。ただ当然の事だが、「アプリケーション」が完成していないと、下図の ~ の選択対象が「Browse」できない、と言う当たり前のことを知ることも大切だ。

permission_04.png

  ~ を入力する順序は下図の通り。Nameを適当に選択してみた。
permission_05.png
実践の時は適当にではなく、 ~ 何を選択あるいは記述するのかを明確に知った上で選ぶ事だ。という事でその内容を下に示した。

Name「アクセス許可」を区別する為の「文字列」の値=「アクセス許可の名前」。例:" com.me.app.myapp.permission.DEADLY_ACTIVITY " : もし「アプリ B」から、「アプリ A」の数種類ある「アクティビティ」の1つである、「deadlyActivity」アクティビティにターゲットを絞ってアクセスしたい場合、ここで設定した「アクセス許可の名前」" com.me.app.myapp.permission.DEADLY_ACTIVITY "を、「アプリ B」の「マニフェスト・ファイル」に追加する。
Label「アクセス許可」に対しての簡略説明を明示。例1:" @string/permlab_deadlyActivity  " 例2:" lavel 属性の簡略説明です。 " 
Icon「アプリ」のアイコン:「Browse」で " icon " を選択。@drawable/icon と入力される。 
PermissionGroup:これはオプションで、「アクセス許可」が属するグループを表示する。例:" android.permission-group.COST_MONEY " ここに何も明示しなければ「アプリケーション情報」の「許可」の部分には "「アクセス許可」は「基本値」に属している " などの表示になり、例:" ・・・COST_MONEY " を明記する事により、「基本値」の表示 "「アクセス許可」は「基本値」に属している " から、  " 料金の発生するサービス(電話番号発信) "  という表示に変わる。
 このような「アクセス許可」の グループの目録はAndroid開発者サイトの Manifest.permission_group1  にて参照できる。 
Discription「アクセス許可」に対する詳細説明を明示。例:" @string/permdesc_deadlyActivity " ここにはのように直接文字列を記述できず、その表示したい説明文(②の簡略文でなく詳細な説明)を「strings.xml」ファイルに文字列として登録した後、文字列ID=" @string/permdesc_deadlyActivity " を通して間接的に表示する。
ProtectionLevel :ここは「アクセス許可」の危険度を表示する属性値。例1:" normal " 例2:" dangerous " 合計4つの属性値があり、各属性値に対する説明を下図に示す。

 

属性値

コード上の定数値

説明

normal

0

セキュリティ上危険度が低い「アクセス許可」である場合の値。
この値を選んだ場合、アプリのインストール時、ユーザーに同意を求めずに「アプリ」の設置が可能。

dangerous

1

セキュリティ上危険度が高い「アクセス許可」である場合の値。
この値を選んだ場合は、ある「機能」への「アクセス許可」の同意をユーザーから受けてのみ、アプリのインストールは進行する。

signature

2

この値を選択すれば、「アクセス許可」を宣言したパッケージを作る時に使用した「パッケージ(「certificate」で署名)」に対してのみ、この「アクセス許可」を追加して利用できる。
 即ち、「アクセス許可」を宣言したパッケージをつくった開発者がつくった、又別のパッケージに対してのアクセスが可能になるし、
又、開発者の同チームが「certificate」で共有してつくったパッケージならアクセスが可能。

signatureOrSystem

3

この「アクセス許可」は、上記属性「signature」のように、同じ「certificate」で署名された「アプリケーション」が「パッケージ」や「プラットフォーム」に含まれる時、その「アプリケーション」に「アクセス」し使用できる。
 例えば、Androidの「基本Eメールアプリケーション」の「メール情報」にアクセスする時に、この「アクセス許可」が必要になるが、この場合「サードパーティー・アプリケーション」では使用できない「アクセス許可」である。内部アプリケーション即ち、プラットフォームに含まれてそこから実行される「アプリケーション」にだけ許可される。

C_Manifastから使用できるアクセス許可の種類

 Androidの「サービス」と「内部アプリケーション」で基本的に宣言された「パーミッション」=「アクセス許可の名前」を、確認する方法は以下の3つがある。
正式な方法ではないが、特定のAPIを呼び出した時「アクセス許可」を追加しなかった事により発生した「エラー・メッセージから知ることが出来る。
正式な方法は、該当する「コンポーネント」「サービス」「装置」に対する「ドキュメント:文章」に「どのパーミッションを追加すべきか」整理されている場合が多いので、そこで指定された「パーミッション」を「AndroidManifest.xml」ファイルに、その通りに追加し利用すればいい。
他の方法としては、これは前述したが「Eclipse」を使用して「AndroidManifest.xml」ファイルの「permission」タブで下画像のように「ドロップ・ダウン」リストから選択する方法(下画像)と、

permission_02.png


 もう1つは、「Application」タブを使う方法がある(下2つ目の画像)。これらは「アクセス許可の名前=permission名」を正確に覚えていない場合便利だ。

permission_07.png



端末の「android.permission.xxx = アクセス許可の名前」を見る
 実際、端末にはどのくらいの「permission.xxx = アクセス許可の名前」が登録されているか、端末の分身「エミュレータ」に登録されているので、それを見てみよう。 
先ず「エミュレータ」を立ち上げる。
次に(cmd)コンソールを開き、下画像青色部分「 adb shell pm list permission 」を入力しエンター。
結果、「All Permissions : 」が表示され、その下に「permission=アクセス許可の名前」がズラリと羅列される。
permission_08.png

うまく表示されない場合は、pathを通すなどの前提条件を充たしていないと思う。その辺の基礎的内容(adb利用の為の条件など)は 以前 に学んだので復習してほしい。 以前 をリンクして apkファイルのファイル構成を見る(Android環境「Linuxコマンド」)の部分を参照。

 以上どのような方法にせよ、「アクセス許可の名前」の参照ができれば、目的の機能への「アクセス許可」に必要な「名前」を簡単に「選択」でき、その「機能」を利用できる。
 しかし、自作の開発アプリの「アクティビティ」に定義した「アクセス許可の名前」は、SDKには含まれない。なので、上記の方法では参照できないので混同しないように!