Android:MultiDex使用時、起動直後にクラッシュする問題の対応

メソッド数が65kを超えたのでhttp://developer.android.com/intl/ja/tools/building/multidex.html
に従いmultiDexの処理を追加した。
Nexus5(5.1.1),XperiaZ3(4.4.4)ではこれで対処できたがGalaxyS2WiMAX(4.0.4)だと何故か起動時にクラッシュした。

下記がエラーログ


    ApplicationContext  W  Unable to create files directory
              MultiDex  I  MultiDexExtractor.load(/mnt/asec/my.big-2/pkg.apk, false)
                        I  Detected that extraction must be performed.
                        E  Failed to create dir /data/data/my.big/code_cache. parent file is a dir true, a file false, exists true, readable false, writable false
                        E  Multidex installation failure
                        E  java.io.IOException: Failed to create cache directory /data/data/my.big/code_cache
                        E      at android.support.multidex.MultiDexExtractor.mkdirChecked(MultiDexExtractor.java:301)
                        E      at android.support.multidex.MultiDexExtractor.prepareDexDir(MultiDexExtractor.java:260)
                        E      at android.support.multidex.MultiDexExtractor.performExtractions(MultiDexExtractor.java:170)
                        E      at android.support.multidex.MultiDexExtractor.load(MultiDexExtractor.java:102)
                        E      at android.support.multidex.MultiDex.install(MultiDex.java:159)
                        E      at android.support.multidex.MultiDexApplication.attachBaseContext(MultiDexApplication.java:39)
                        E      at my.big.MyApp.attachBaseContext(MyApp.java:360)
                        E      at android.app.Application.attach(Application.java:77)
                        E      at android.app.Instrumentation.newApplication(Instrumentation.java:958)
                        E      at android.app.Instrumentation.newApplication(Instrumentation.java:942)
                        E      at android.app.LoadedApk.makeApplication(LoadedApk.java:461)
                        E      at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3260)
                        E      at android.app.ActivityThread.access$2200(ActivityThread.java:117)
                        E      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:969)
                        E      at android.os.Handler.dispatchMessage(Handler.java:99)
                        E      at android.os.Looper.loop(Looper.java:123)
                        E      at android.app.ActivityThread.main(ActivityThread.java:3683)
                        E      at java.lang.reflect.Method.invokeNative(Native Method)
                        E      at java.lang.reflect.Method.invoke(Method.java:507)
                        E      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
                        E      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
                        E      at dalvik.system.NativeStart.main(Native Method)

プロガードを有効にしたら発生しなくなったが、デバッグが困難になるしまたいくつかライブラリを追加したら再発すると思うので別の解決法を探した。

[このissue](https://code.google.com/p/android/issues/detail?id=79388)の最初の投稿を参考にしてマニフェストに`installLocation="internalOnly"`を追記して一応解決した。

```lang:AndroidManifest.xml

<application
android:installLocation="internalOnly"
...
>

```

上記のissueによれば原因はMultiDexのバグ？
エラーメッセージに
`Failed to create dir /data/data/my.big/code_cache. parent file is a dir true, a file false, exists true, readable false, writable false`
とあるが、本来`/data/data/my.package.name`はアプリケーションに割り当てられる領域で読み込みも書き込みもできるはず。なんらかの理由でMultiDexが必要なファイルの作成に失敗してる感じ。(容量不足が原因かと思ったが違った)

`installLocation="internalOnly"`はアプリのインストール場所を内部ストレージに指定する。
この設定の詳細は[[Android　Android 2.2　外部メディア (SDcard) へのインストール指定](http://y-anz-m.blogspot.jp/2010/05/android_24.html)]。簡単に言うと、ServicesやApp Widgetsなどを使ってるアプリはinternalに保存するべきで、そうでないアプリはできればユーザーの内部ストレージを取らないためにexternalに保存するのが好ましい。

できれば別の解決方法を知りたいがこれ以上この問題に取り組むと憤死しそうなのでやめておく。