Lionaroid

Lionasの技術ブログ

AndroidでSDにアプリを移動した際に本体側の必要領域がゼロにならない理由

Android 2.2からアプリケーションを「携帯端末」から「SDカード」に移せるようになりました。これは携帯端末(本体)側のアプリの保存領域が限られているためで、インストールしたアプリをSDカードに移すことによって、本体側の空き容量を確保することができるようになるからです。

単純に考えると、アプリ移動後は本体側のアプリ保存領域はゼロになっても良いようにも思えますが、実際はゼロにはなりません。SDカード側に本来のアプリサイズの領域が必要な上に、本体側にも数百Kバイト〜数Mバイトの領域が必要になります。

この本体側の領域(正確には/data/以下)には「dalvik-cache」と呼ばれる、起動・実行・シャットダウンなどアプリの動作に必要なキャッシュファイルが保存されています。
dalvik-cacheは、端末の起動時にインストール済みアプリとフレームワークの情報を収集し、書き込み可能なファイルとして生成され最適化されたアプリのバイトコードを格納することで、アプリのスムーズな動作を実現しています。dalvik-cacheはAPKファイルに含まれるclass.dexからDalvikによってビルドされます。

dalvik-cacheのサイズを小さくする(=本体側の必要容量を小さくする)には、

  • プログラムのサイズを小さくする
  • Proguardでバイトコードを最適化する(難読化の他にも最適化機能があります)

などが有効です。

私が試した限りでは、proguardを適用した後にSDカードへ移す処理を行ったところ、本体側で13Mバイト程度消費していたアプリが、移動後は700Kバイト程度まで抑えられる結果となりました。

※dalvik-cacheの詳しい解説は、こちらのサイトが参考になるかもしれません。
※proguardの詳細はこちら