ランタイムパミッションの互換性(1)

A+ a-

Android OS 6.0(Marshmallow)でランタイムパーミッションが導入されましたが、Android OS 6.0端末を持っているのは、ほんの一握りのユーザです。現状ではAndroid6.0以下も考慮しつつアプリケーションを作成していく必要があります。
ランタイムパーミッションの互換性及び注意事項について、以下の二点に関して記載していきたいと思います。

  • 互換モードの動作
  • サポートライブラリ―

互換モードとは


互換モードとは、Android6.0以上の端末で、インストールタイムパーミッションモデルで実行しているアプリケーションが、端末の設定画面から、特定のパーミッションをはく奪された時の事を言います。(わかりにくい)

※「互換モード」という用語は、わかりにくくあまり良くない気もしますが、Developer Previewの説明でそのような記載がGoogleにあり、また良い言葉が見つからないので、互換モードという言葉を以後使いたいと思います。

まず、TargetSdkVersionと実行環境とインストールタイムパーミッションモデルとランタイムパーミッションモデルについておさらいをしたいと思います。



パミッションモデル

Android6.0(API Level23)で、ランタイムパーミッションモデルという新しいパーミッションモデルが導入されました。ランタイムパーミッションモデルは、実行時にパーミッションの許可を与えるモデルです。一方インストールタイムパーミッションモデルは、従来のパーミッションモデルであり、アプリケーションインストール時にパーミッションを与えるモデルです。ランタイムパーミッションモデルが出現したために、従来のパーミッションモデルを示す言葉が新たに作られました。

targetSdkVersionと実行環境

 アプリケーションは、ManifestファイルにtargetSdkVersionを指定する事で、ランタイムパーミッションに対応しているアプリかを示します。23以上に設定した場合は、ランタイムパーミッションに対応している事を表します。(23はAPI Level23を表しAndroid 6.0という事を表現します)

targetSdkVersion=23に指定したアプリは、AndroidOS6.0未満の実機でも動作します。この時インストールタイムパーミッションで動作します。このように、同じアプリでもインストールタイムパーミッションモデルで動作したり、ランタイムパーミッションモデルで動作します。
以下にそれぞれのパターンについて記載します。

実行環境targetSdkVersion 23以上targetSdkVersion 23未満
Android OS 6未満Installtime modelInstalltime model
Android OS 6以上Runtime modelInstalltime model
互換モードが存在する
表1:実行環境とtargertSdkVersion

  • ランタイムパーミッションに対応しているアプリをAndroid 6.0以上の端末にインストールした時は、ランタイムパーミッションモデルで動作します。(表1:左下)
  • ランタイムパーミッションに対応したアプリを作成したとしても、Android OS 6.0未満の端末ではOSが新しいパーミッションモデルに対応していないため従来のインストールタイムパーミッションモデルで動作します。(表1:左上)
  • ランタイムパーミッションに対応していないアプリをAndroid OS 6.0未満の端末にインストールした場合。これはAndroid6.0がリリースされる前の状態と同じですから、インストールタイムパーミッションモデルで動作します。(表1:右上)
  • ランタイムパーミッションに対応してないアプリを、Android6.0以上の端末にインストールした場合は、インストールタイムモデルで動作します。これは過去にリリースされたアプリを、Nexus5Xで動かした時に該当します(表1:左下)

パミッションのはく奪

互換モードの時、インストールタイムモデルですので、アプリをインストールした状態で全てのパーミッションを取得しています。しかしながらAndroid6.0以上の端末ですので、設定メニューからアプリが取得しているパーミッションをはく奪する事が可能です。

「設定」→「アプリ」→「アプリ情報」→「許可」


(※ targetSdkVersionが23未満の時は権限はく奪時に上記一番右のメッセージが表示されます)

この時アプリケーションは、パーミッションを持っていないのにも関わらず、パーミッションが必要なリソースにアクセスします。パーミッションが必要なリソースにパーミッションを持っていない状態でアクセスした場合通常は、SecurityExceptionが返りますが、互換モードの時のみSecurityExceptionは発生せず、電話帳なら0件のデータを返すなどダミーの動作をします。必ずハングアップをするという事はありませんが、今まで想定しなかった値が返ってくる事がありますので別の理由でハングアップするかもしれません。

さて、この互換モードですが、Google Developerサイトでは、ダミーの値を返したりすると記載あるだけで、具体的にどのような値が返るかの記載がありません。
アプリを作る側としては、それでは非常につらいですので、それぞれのパーミッションに対して、互換モードでどのような動作をするのか調査を行いました。

その結果に関しては、各パーミッション単位の結果になり長くなりますので、後日展開したいと思います。また、サポートライブラリの注意事項についても展開していきたいと思います。

最後に

実際もっと色々書きたかったのですが、「互換モード」の言葉の説明をしないと、次にいけない気がしたので、互換モードの事を書いたら、結構な量になってしまいました。
今回は、とくにオチはありません。すんません


がく

がく

アンドロイドアプリの脆弱性検査ツールのRiskFinder株式会社 代表取締役 スマフォのセキュリティ色々やってます。

リスクファインダーはAndroidアプリのセキュリティホールを見つけます!

Androidスマートフォンが急速に普及するとともにアプリの脆弱性報告も急増しています。
リスクファインダーは、Androidアプリの脆弱性診断WEBサービスです。
500項目以上のチェックでアプリの脆弱性や問題を検出し、セキュアなアプリ開発をサポートします。

  • ブラウザでファイルをアップロードするだけ
  • アプリの脆弱性を指摘するだけでなく対処方法も提示
  • 頻繁にバージョンアップするAndroidの最新情報に素早く対応

リスクファインダーの詳細はこちら