[Android] Android2.2から、SDカード上にアプリケーションをインストールする機能が入りました。

Android 2.2 supports application installation on external storage devices like the SD card. This should give users room for many more apps, and will also benefit certain categories, like games, that need huge assets.

上記のブログの内容を理解するために、自分なりにまとめてみました。

メリット

ゲームなどの大きなデータを使用するアプリをSDカードにインストールできる

デメリット

インストールしたSDカードを抜くと、アプリが起動できない

注意点

  • アプリの開発者がどちらにインストールできるかを指定するのであって、ユーザーが選択できるわけではない
  • 実行ファイルなどは内部ストレージにコピーされるため、単純にSDカードだけを使用するわけではない
  • SDカード上のデータは、改変を防ぐために、端末ごとの固有のキーで暗号化され、通常のファイル形式ではないファイルシステムで書き込まれる。
  • ピープロテクションの機能はないため、コピープロテクションを指定したアプリは、SDカードへインストールできない

開発時の指定

マニフェストファイルに以下の値を指定する

  • internalOnly (内部ストレージのみ)
  • preferExternal (外部ストレージ優先)
  • auto (内部ストレージ優先)

デバッグ用にadbで指定することも可能

  • adb shell setInstallLocation 0[auto] | 1[internalOnly] | 2[external]

メモ

Android 2.1以前のAndroidでは、端末にインストールされるアプリケーションは、すべて端末内のストレージエリアに格納されて実行されていました。外付けのSDカードの領域は、アプリケーションが明示的にデータを置く為にだけ使用されていました。この為、SDカードなどで、端末の記憶領域を増やしても、インストール可能なアプリケーションの数は増やすことができないという制約があったのです。
この制約は、画像データーや音楽データなどの大きなデータを使用するゲームのようなアプリケーションでは、大きなデメリットでした。
Android 2.2からは、この制約を緩和するために、SDカード上にアプリケーションを置くことができるようになりました。しかし、フレームワークの構造やセキュリティ上の問題から、単純にアプリケーションのパッケージファイル(apkファイル)をSDカード上に配置するわけではありません。
SDカード上にアプリケーションを配置するには、ネットワークなどからダウンロードしたファイルをインストーラや開発用のadbツールを使用して、システムにインストールする必要があります。インストール時には、apkファイル内の実行ファイル(dexファイルやネイティブライブラリ)や、アプリケーションが使用するプライベートなデータディレクトリなどは、今までと同様に、内部ストレージに展開されます。SDカード上には、端末ごとに固有のキーで暗号化されたapkファイルがコピーされます(/mnt/asecディレクトリが使用されているようです)。
このような仕組みになっている理由は、取り外したSDカードを操作することで、外部からアプリケーションのデータを改変されることを防ぐためです。
ただし、この仕組みでは、アプリケーションのコピーを防止することはできません。このため、Android Market上でコピープロテクションを指定したアプリケーションは、SDカード上に配置することはできません。
SDカードへのインストールが可能なアプリケーションをインストールすると、設定画面のアプリケーションの情報の表示内に、[move to SDCard]と[move to Phone]というボタンが表示されるようになります。ユーザーは、このボタンを使用して、アプリケーションのインストール先を変更するこが可能です。
SDカードの取り外しなどのタイミングは、ブロードキャストのインテントで拾うことができます(が、そのアプリケーション自身では、当然、単純には処理できないですね...)。