2011年9月19日月曜日

外部メディア (SDカード) へのインストール不可にする


Android 2.2.x (Froyo) から、アプリケーションは内蔵ストレージ(携帯端末)だけでなく、外部メディア(SDカード) にインストールさせることが可能になってます。

端末によっては、内蔵ストレージは、通常数百MBとサイズが小さく、プリインストールのアプリケーションなどで、ユーザが使用できるサイズ100MB以下の場合があります。
その場合、ゲームなどサイズの大きいアプリケーションは、2GB-32GBとサイズの大きい外部メディアにインストールさせることで、内蔵ストレージの消費を抑えることができます。

しかし、常に常駐するタイプのものや、ホームに配置するウィジェットの場合、外部メディアにインストールされてしまうと問題が発生します。

外部メディアは、端末から取り外したり、USBでパソコンと接続した場合にアンマウントされてしまいます。アンマウントされてしまうと、端末から外部メディアが認識できなくなり、その上で動作していたアプリケーションも停止することなります。

この問題を防ぐために、アプリケーションの開発時に外部メディアに移動できないように設定することが可能です。


AndroidManifest.xmlの<manifest>タグに、android:installLocation属性を定義します。
"internalOnly"と定義することで、外部メディアへの移動が出来なくなります。

android:installLocation属性の詳細はDev Guideを参照してください。
<manifest> | Android Developers

android:installLocation属性には、他に"auto"と"preferExternal"が設定することが可能です。
auto - アプリケーションは、外部ストレージにインストールすることができますが、システムはデフォルトで内部ストレージにアプリケーションをインストールします。内部ストレージがいっぱいになっている場合、システムは外部ストレージにインストールします。
preferExternal - アプリケーションは、外部ストレージ(SDカード)にインストールされることを優先します。


Android 2.1.x (Eclar) までは、外部メディアへのインストールができないため、android:installLocation属性はありませんので、通常のインストール先は内蔵ストレージとなります。
Android 2.2.x (Froyo)でも、android:installLocation属性を設定していない場合、通常のインストール先は内蔵ストレージとなります。

通常の端末の状態では、問題はありませんが、アプリケーションの通常のインストール先を内蔵ストレージから外部ストレージに変更することが出来てしまいます。

USB接続して、次のコマンドを実行します。

adb shell pm setInstallLocation 2
コマンドを実行することで、アプリケーションの通常のインストール先を外部メディアに変更します。

このような場合、android:installLocation属性に"internalOnly"を指定してない場合、外部メディアにインストールされてしまうことになります。
ウィジェットの場合、外部メディアにインストールされると、ホーム画面でウィジェットの一覧に表示されなくなります。


なので、
ウィジェットや常駐アプリは android:installLocation属性に "internalOnly" を指定しましょう!!

Android 2.1 以下を対象とするアプリケーションの場合、プロジェクトのビルドターゲットにAndroid 2.2 以上を指定して、AndroidManifest.xmlにuses-sdkタグでターゲットバージョンを指定します。

0 件のコメント:

コメントを投稿