2010年5月24日月曜日

Android Android 2.2 外部メディア (SDcard) へのインストール指定

Android - Froyo - App installation on external storage media

Android 2.2 (Froyo) から、アプリケーションはどこにインストールされるかを指定することができるようになりました。
つまり、マーケットからインストールするときに、内部メモリではなく SDcard のような外部メディアにインストールさせることが可能になりました。
*あくまでのアプリ側が自分がどこにインストールされるかを指定できるということです。ユーザーが指定できるわけではありません。

元記事はこちら↓ (誤訳の責任はとりません)
http://developer.android.com/intl/ja/sdk/android-2.2.html#api

具体的には、AndroidManifest.xml の
< manifest > タグに

 android:installLocation

を設定します。
設定できる値は

 ・"internalOnly"
 ・"preferExternal"
 ・"auto"

の3つです。
こんな感じ


<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="preferExternal"
... />


by App Install Location

インストール時にシステムは "android:installLocation" の値を参照して、(可能な場合は)適切な位置にインストールします。
もし、アプリケーションが外部メディアにインストールするように要求している場合、システムはアプリケーションを外部メディアのプライベートな暗号化パーティションにインストールします。
一度アプリケーションが外部にインストールされると、ユーザーはそのアプリケーションの保存場所を内部メモリに移動させることが可能になります(ユーザー設定のアプリケーションの管理で行う)。

デフォルトでは、明示的に外部メディアへのインストールを要求する場合以外は、システムはすべてのアプリケーションをデバイスの内部メモリにインストールします。
これは、システムは常に内部メモリに従来のアプリケーションをインストールすることを意味します。なぜなら、従来のアプリケーションには "android:installLocation" 属性へのアクセスがないからです。
しかし、もし必要ならば、古いバーションのプラットフォームでは内部メモリにインストールし、Android 2.2 とそれ以降のプラットフォームでは外部メディアにインストールするように、従来のアプリケーションを設定し、コンパイルすることは可能です。

デバイスの外部メディアにインストールを要求することは、すべてのアプリケーションにとって適していないことに注意してください。特に、外部メディアは取り外しが可能で、アンマウント/再マウントによってユーザ経験やシステム設定を混乱させる可能性があります。

適切なインストール場所についての詳しい情報は
 App Install Location
を参照してください。
どんなアプリケーションが外部メディアへのインストールに適しているかの議論が含まれています。






App Install Location

元記事はこちら↓ (誤訳の責任はとりません)
http://developer.android.com/intl/ja/guide/appendix/install-location.html

*上記とかぶっている部分は除いてあります。

"android:installLocation" 属性が宣言されていない場合は、アプリケーションは内部ストレージにだけインストールされます(外部ストレージに移動はできません)。

アプリケーションを外部ストレージにインストールする場合は、"android:installLocation" に "preferExternal" もしくは "auto" を指定します。

"preferExternal" を宣言した場合、アプリケーションは外部ストレージへのインストールを要求しますが、システムはそのアプリケーションが外部ストレージにインストールされるかどうかは保証しません。
例えば、外部ストレージが満杯の場合、システムは内部ストレージにインストールします。ユーザーはアプリケーションの場所を(内部と外部ストレージの間を)移動することができます。

"auto" を宣言した場合、アプリケーションが外部ストレージにインストールされる可能性を示しますが、インストール場所の優先順位は持っていない。システムがいくつかのファクターをもとにどこにインストールするかを決定します。この場合もユーザーはアプリケーションの場所を移動することができます。

外部ストレージにアプリケーションがインストールされた場合

 ・外部ストレージがデバイスにマウントされている限り、
  アプリケーションのパフォーマンスには影響しない

 ・.apk ファイルが外部ストレージに保存されていても、
  プライベートユーザーデータ、データベース、
  最適化された .dex ファイル、引用されるネイティブコードは
  全て内部デバイスメモリに保存される

 ・アプリケーションが保存される一意のコンテナは、
  ランダムに生成されたキーで暗号化されており、
  アプリケーションをインストールしたオリジナルのデバイスだけが
  複合化できる。つまり、SD card へのアプリケーションの
  インストールは単一のデバイスに対してのみ働く

 ・ユーザーはシステム設定で、アプリケーションの保存先を
  内部ストレージに移動できる

*警告:PCとファイルを共有するためにUSBマスストレージを有効にした場合や、SD card をアンマウントした場合、外部ストレージで走っているすべてのアプリケーションはただちに kill されます




Backward Compatibility

外部ストレージへのインストールを許可し、API Level 8 よりも下のバージョンとの互換性を残す方法

 1 android:installLocation 属性を含み、"auto" もしくは
  "preferExternal" を宣言する

 2 android:minSdkVersion 属性を残し("8" より小さいなにか)、
  アプリケーションのコードがそのレベルと互換性のあるAPIだけ
  使っていることを確かめる

 3. アプリケーションをコンパイルするときにビルドターゲットを
  API Level 8 にする。これは、Level 8 よりも古い Android
  ライブラリが android:installLocation を理解できないため、
  前のバージョンではコンパイルできない。

この方法でコンパイルしたアプリケーションは、API Level が 8 よりも小さいプラットフォームでは "android:installLocation" 属性は無視されて内部ストレージにインストールされ、8 より大きいプラットフォームでは外部ストレージにインストールされる。

*注意: minSdkVersion が "8" より小さい場合、後方互換性を保つため、API Level 8 で紹介されたAPI は使ってはいけない




Applications That Should NOT Install on External Storage

外部ストレージがアンマウントされた場合、外部ストレージで走っているアプリケーションは kill される。よって、次のような特徴をもつアプリケーションは外部ストレージに保存すべきではない。

・Services
  ただし、ACTION_EXTERNAL_APPLICATIONS_AVAILABLE
  broadcast Intent をトリガーとして登録し、再スタートできる

・Alarm Services
  Service と同じ方法で再マウント時に再登録できる

・Input Method Engines
  アンマウントされた場合、IME はデフォルトに置き換えられる。
  再マウント時にユーザーが再設定する必要がある

・Live Wallpapers
  アンマウントされた場合、Live Wallpaper はデフォルトに
  置き換えられる。再マウント時にユーザーが再度選択する必要がある

・Live Folders
  アンマウントされた場合、ホームスクリーンから Live Folder
  は削除される。再マウント時にユーザーが再度ホームスクリーンに
  追加する必要がある

・App Widgets
  アンマウントされた場合、ホームスクリーンから App Widget は
  削除される。再マウント時にユーザーがホームアプリケーションを
  システムリセットするまで(通常はリブートするまで)、
  ユーザーは App Widget を選択できない

・Account Managers
  AccountManager によって作成されたアカウントは外部ストレージが
  再マウントされるまで見えなくなる

・Sync Adapters
  AbstractThreadedSyncAdapter とその全同期機能は外部ストレージが
  再マウントされるまで働かなくなる

・Device Administrators
  DeviceAdminReceiver とその全ての管理能力は無効になり、
  デバイスの機能に対して予測不可能な結果を持つ可能性があり、
  外部ストレージが再マウントされた後も続く可能性がある


デフォルトでは内部メモリインストールされるため、特にすることはないが、外部ストレージに保存すべきでないことを明示する場合は "android:installLocation" に "internalOnly" を宣言してください。




Applications That Should Install on External Storage

簡単にいえば、上記であげた特徴を持たないアプリケーションは外部ストレージに保存しても安全である。サイズの大きいゲームなどは、外部ストレージに保存すべきアプリケーションのタイプの1つである。なぜなら、ゲームは典型的にアクティブではない場合に追加のサービスを提供しないため。
外部ストレージにアクセスできなくなり、ゲームのプロセスは kill された後、ストレージが再び使用可能になった場合目に見える効果はなく、ユーザーはゲームを再起動する必要があります。(通常の Activity lifecycle で適切にゲームが保存されていると仮定)

もし、アプリケーションが APK ファイルとして数メガバイトを要求する場合、ユーザーが内部ストレージのスペースを確保するために、アプリケーションが外部ストレージに保存できるようにするかどうか慎重に検討する必要がある。

0 件のコメント:

コメントを投稿