2010年12月13日月曜日

アプリケーションのインストール領域を考える (Dev Guild - App Install Location 和訳)



f:id:bs-android:20101212110400p:image


マーケットの変更により、アプリのサイズが最大50MBまで拡張されることになりました。今後、端末本体にアプリケーションを保存できない状況が考えられるため、端末本体以外の場所にアプリを保存する方法を知っておきましょう。


原文はこちら


要点




  • アプリケーションをデバイスの外部ストレージにインストールすることができます

  • いくつかの種類のアプリケーションは外部ストレージにインストールを許可すべきではありません

  • システムに密接に関わらない大きいアプリケーションは、外部ストレージにインストールすることが理想です(大抵はゲーム)


概要


APIレベル8(Android 2.2)から、アプリケーションを外部ストレージにインストールすることが可能となりました(例えばSDカード)。これは、マニフェストの属性に android:installLocation を定義することで利用可能となるオプションの機能です。もし、この属性を定義していないなら、内部ストレージにのみインストールすることが可能で、外部ストレージへ移すことはできません。


外部ストレージにアプリケーションをインストールすることをシステムに許可するためには、<manifest>要素内の android:installLocation 属性が"preferExternal"か"auto"のいずれかの値を含めるようにマニフェストファイルを修正します。


例:



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





"preferExternal"を定義した場合、外部ストレージにアプリケーションをインストールすることを要求しますが、システムは外部ストレージにアプリケーションをインストールすることを保証しません。もし、外部ストレージが一杯であれば、システムはアプリを内部のストレージにインストールするでしょう。ユーザーはまた、アプリケーションを2つの場所の間で移動することができます。


"auto"を定義した場合、外部ストレージにアプリケーションがインストールされるかもしれないことを示しますが、インストールの場所を選択することはできません。システムはいくつかの要素に基づいて、アプリケーションのインストール場所を決定します。ユーザはまた、2つの場所の間でアプリケーションを移動することができます。


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




  • 外部ストレージがデバイスにマウントされる限り、アプリケーションのパフォーマンスには全く影響がありません。

  • .apkファイルは外部ストレージに保存されますが、全てのプライベートなユーザデータ、データベース、最適化された.dexファイル、展開されたネイティブコードは内部デバイスメモリに保存されます。

  • 格納されたアプリケーションのユニークなコンテナは、オリジナルなデバイスでのみ復号可能なランダムに生成されたキーで暗号化されます。そのため、SDカードにインストールされたアプリケーションは、特定の一つのデバイスでのみ動作します。

  • ユーザーはシステム設定を通して、アプリケーションを内部ストレージに移動させることができます。



警告:ユーザーがコンピュータとファイルを共有するためにUSBマスストレージを有効にした時、あるいは、システム設定でSDカードをアンマウントした時は、外部ストレージはデバイスからアンマウントされ、外部ストレージで実行中のアプリケーションは直ちにkillされます。



下位互換性


外部ストレージにアプリケーションをインストールする機能は、APIレベル8 (Android 2.2) 以上が動作するデバイスでのみ機能します。APIレベル8より前でビルドされた既に存在するアプリケーションは、いつも内部ストレージにインストールされ、外部ストレージに移動することはできません(例えAPIレベル8をサポートするデバイスの上であっても)。しかしながら、8より低いAPIレベルをサポートするようにアプリケーションがデザインされていて、APIレベル8以上のデバイスに対してこの機能をサポートするように選択することは可能で、APIレベルが8未満のデバイスに対しても互換性を維持することができます。


外部ストレージへのインストールを許可し、APIレベル8未満のバージョンとの互換性を維持するために:




  1. "auto" または "preferExternal" を有する android:installLocation 属性を<manifest>要素に含めます。

  2. android:minSdkVersion属性を残したままで(いくつかは "8" より低いでしょう)、アプリケーションのコードがそのレベルと互換性のあるAPIを使用することを確実にして下さい。

  3. アプリケーションをコンパイルするため、ビルドターゲットをAPIレベル8に変更して下さい。これは、古いAndroidライブラリが android:installLocation属性を理解できないためであり、これがあるとコンパイルできないためです。


APIレベル8未満のデバイスにアプリケーションをインストールした時、android:installLocation属性は無視され、アプリケーションは内部ストレージにインストールされます。



警告:古いプラットフォームによってXMLのマークアップが無視されますが、下位互換性を提供する必要が無い場合を除いて、minSdkVersionを8未満にするのであれば、APIレベル8で導入されたAPIを利用しないように気をつけなければなりません。アプリケーションコードの下位互換性のビルドに関する情報は、下位互換性の記事を参照して下さい。






外部ストレージにインストールすべきでないアプリケーション


ユーザーがコンピュータとファイルを共有するためにUSBマスストレージを有効にした時(または、外部ストレージをアンマウントか除去した場合)、外部ストレージにインストールされて動作しているアプリケーションはkillされます。システムはマスストレージが無効化しデバイスに再マウントされるまで、事実上アプリケーションを認識しなくなります。アプリケーションをkillしユーザーが使用出来なくなること以外に、より深刻な方法でいくつかの種類のアプリケーションを壊す事があります。


アプリケーションに予想可能な一貫した振る舞いをさせるため、下記に示す機能を利用している場合は、外部ストレージにアプリケーションをインストールさせるべきではありません。


外部ストレージをアンマウントした時、当たり前に起こりうること:


サービス(Services)

実行中のサービスはkillされ、外部ストレージが再マウントされてもリスタートされません。しかしながら、アプリケーションが外部ストレージにインストールされ、システムが再度利用可能となったアプリケーションが通知する ACTION_EXTERNAL_APPLICATIONS_AVAILABLE ブロードキャストインテントを登録すれば使用可能です。この時、サービスを再起動することができます。


アラームサービス(Alarm Services)

AlarmManagerによって登録されていたアラームはキャンセルされます。外部ストレージが再マウントされた時に手動でアラームを再登録しなければなりません。


入力メソッドエンジン(Input Method Engines)

IMEはデフォルトのIMEに置き換えられます。外部ストレージが再マウントされた時、ユーザーはシステム設定からIMEを再び有効にすることができます。


ライブウォールペーパー(Live Wallpapers)

動作中のLive WallpaperはデフォルトのLive Wallpaperに置き換えられます。外部ストレージが再マウントされた時、ユーザーはLive Wallpaperを再度選択することができます。


ライブフォルダ(Live Folders)

ホーム画面からライブフォルダが削除されます。外部ストレージが再マウントされた時、ユーザーは再びホーム画面にライブフォルダを追加することができます。


ウィジェット(App Widgets)

ホーム画面からウィジェットが削除されます。外部ストレージが再マウントされても、システムがホームアプリをリセットするまで、ユーザーはウィジェットを選択して使用することができません(一般的に、システムが再起動されるまで使用できません)。


アカウントマネージャ(Account Managers)

外部ストレージが再マウントされるまで、AccountManagerによって生成されたアカウントは非表示になります。


同期アダプタ(Sync Adapters)

外部ストレージが再マウントされるまで、AbstractThreadedSyncAdapterと全ての同期機能は利用できません。


デバイス管理(Device Administrators)

DeviceAdminReceiverと管理者機能は無効化されます。外部ストレージが再マウントされた後でも存続するという、デバイス機能について予期できない結果となるでしょう。


"起動完了"を待つブロードキャストレシーバ(Broadcast Receivers listening for "boot completed")

外部ストレージがデバイスにマウントされる前に、システムは ACTION_BOOT_COMPLETED ブロードキャストを配信します。外部ストレージにアプリケーションがインストールされている場合は、このブロードキャストを受信することができません。


アプリケーションが上記リストの機能を利用する場合、外部ストレージにアプリケーションをインストールすべきではありません。デフォルトでは、システムは外部のストレージにアプリケーションをインストールすることを許可しませんので、既に存在するアプリケーションについて心配する必要はありません。しかし、外部ストレージにアプリケーションを決してインストールさせないようにするためには、android:installLocationの値を"internalOnly"として明確に定義する必要があるでしょう。デフォルトの振る舞いに変更はありませんが、これは「内部ストレージにのみインストールさせるべきであり、あえてそのようにしている決定をした」と自身や他の開発者に対して明確に述べることになるでしょう。





外部ストレージにインストールすべきアプリケーション


簡単に言えば、前節の上記リストの機能を利用していなければ外部ストレージにインストールしても安全です。ゲームは非アクティブになった際に特に追加のサービスを提供しないため、大きなゲームは外部ストレージにインストールを許可すべき典型的なアプリケーションです。外部ストレージが使用不可となりゲームプロセスがkillされた時、ストレージが再び利用可能となってユーザーがゲームをリスタートした時に、目に見える効果があるべきではありません(ゲームプロパティが通常のアクティビティのライフサイクル中に状態を保存していると仮定しています)。


アプリケーションがAPKファイルに数メガバイトを要求する場合、ユーザーが内部ストレージのスペースを確保するために、外部ストレージにインストールすることを有効にするかどうか、注意深く検討すべきでしょう。



文責:技術部 瀬戸 直喜(前・日本Androidの会四国支部長/情報セキュリティスペシャリスト)





140 180 Android , 翻訳

記載されている会社名、および商品名等は、各社の商標または登録商標です。

0 コメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...