apkのサイズが大きくなる
環境
Unity2018.2.10f1
target SDK 28
状況
開発中のアプリをandroid buildしたら、まだ開発初期(テクスチャ1枚とかレベル)なのに、apk のサイズが60MBになった。
これはあまりよろしくないなぁと思い、少し調査してみました。
影響がありそうなbuild設定
下記に羅列してみます。
- development build
- target architecture
- Unity の library ファイル
上記を1つずつ検証してみます。
まずは
development build ON
target architecture ARMv7,ARM64,x86
でbuildしてみます。
target architectureにARM64が入っているので、もちろんIL2CPP bulidになっています。
ビルド結果は「60.4MB」です
他、いくつかのパターンを試した結果は下記のようになりました。
devBuild | ARMv7 | ARM64 | x86 | ScriptingBackend | apk Size(MB) |
---|---|---|---|---|---|
ON | ○ | ○ | ○ | IL2CPP | 60.4 |
OFF | ○ | ○ | ○ | IL2CPP | 41.4 |
ON | ○ | ○ | × | IL2CPP | 40.6 |
ON | ○ | × | ○ | IL2CPP | 42.5 |
ON | ○ | × | ○ | Mono | 40.6 |
developmentBuild外しただけでも40Mとなると、LTE下でダウンロードしてもらうためには、まだまだ他のやり方も模索する必要がありそうです。
ARMv7、ARM64、x86がそれぞれ同じサイズぐらいなので、思い切ってx86を切ってしまうとか、当分ARM64は放置しておくとかでしょうか。
アーキテクチャごとにapk分割
UnityのPlayer Settingsをみると、アーキテクチャのチェックボックスの下に「Split APKs by target architecture」というチェックボックスがあります。
これを試しにONにして実行して見たところ、どうもアーキテクチャごとにapkを勝手に分けてくれるみたいです。ググってみると、Android Studioにもありそう・・・?
ただ、現在Unityでは、まだ experimental になっているので、実験段階ということですね。早く実用化して欲しいです。
アーキテクチャごとにapk分割した後、どうやってストアで配信するかはまた別の記事で。
Unityのライブラリについて
最近TimelineやSpriteAtlasを試してみるために、いくつかライブラリを追加してしまったので、それを外すとどうなるかを試してます。
なお、using namespaceを外すだけでなく、関連するリソースも外さないと、ライブラリは未使用判定にならないと思います。
- UnityEngine.Playablesを外す、playable assetを削除(Timeline関連)
60.4MB → 59.5MB
- UnityEngine.U2Dを外す、Sprite Atlasの参照を削除(SpriteAtlas関連)
60.4MB → 59.6MB
あまり変化がないですね・・・
SpriteAtlasのサイズは結構大きいと思っていたのですが、それを含めてもこれだけしか減らないんですね。
Unityのライブラリはもっとごそっと減らす方法を考えないといけないんでしょうか。
それこそUI全体外してみるとか・・・?
uGUIやSprite外して、UI系のアセット使うとか、全部3Dオブジェクトで気合いでなんとかする、とかしたらどれぐらいのサイズになるんでしょうね。
まとめ
apkのサイズが大きくなったことに関して、対応アーキテクチャが増えたのと、Unityでできることが増えた反面、必要なライブラリのサイズが大きくなってしまったことが原因なのでしょう。
せっかくある機能ですが、使用するかどうかはアプリのサイズ、代替機能などの検証が必要になりそうです。
とはいえ、現在 experimental である、apk 分割がうまくいくのであれば、それはそれでいいのではないかなと思っています。
テストをどうするかが悩ましいところですが。。。
補足
Unite2018でGoogleの松田さん(@hak)が確か、いつからか64bit対応が必須になる、とおっしゃっていた気がするんですが、別のサイトを見てみると、ネイティブコードを使用していないなら対応の必要がないとも書いてあったような・・・?
そうなると無理にIL2CPPビルドにしなくても大丈夫なんでしょうかね?