年末の大掃除、アプリの容量を削減するためのチェックリスト


## APKの最大ファイルサイズが50MBから100MBに倍増
　9/28、GoogleはAPKの最大ファイルサイズは50MBから100MBに倍増し、今まで50MBを超えるアプリで別途インストールが100MBまで不要になりました。ゲーム系以外でも他言語対応などで画像を大量に含んだアプリなどでは、50MB近くの大きなサイズになることもあるようです。


[APK 拡張ファイルの使用と添付](https://support.google.com/googleplay/android-developer/answer/2481797?hl=ja)
　
　今回のアップデートでAPKのファイルサイズを気にする必要がなくなったのでしょうか？
そんなことにはなりませんよね。
 アプリをより多くのユーザーに使ってもらう為にAPKサイズにも目を向けるべきです。

<br>

## FaceBook・LINEの取り組み
　日本にいると当たり前に高速通信を使用できることから、APKサイズを意識してインストールを躊躇する人は少ないと思います。
　しかし、高速通信が利用できない新興国では、ネットにアクセスするためにプリペイド式のSIMを購入して利用することが多いようです。

[Facebook、従業員が新興国モバイルのスピードを体験「2G Tuesday」](http://bylines.news.yahoo.co.jp/satohitoshi/20151121-00051676/)
引用
>新興国ではほとんどがプリペイド方式であり、ネットにアクセスするためのデータ通信を行う時にもプリペイドのSIMを購入して利用する。例えば「1GBで10ドル」のような値段設定で、1GBを超えたらまたチャージするというプランである。

こういった新興国向けに最適化されたアプリをFaceBookは[FaceBook Lite](https://play.google.com/store/apps/details?id=com.facebook.lite&hl=ja)(約0.5MB)を、LINEは[LINE Lite](https://play.google.com/store/apps/details?id=com.linecorp.linelite&hl=ja)(約1MB)を提供しています。
どちらも非常に小さなサイズで、APKのサイズを最小に抑える重要性が伺えます。

新興国でもスマートフォンが急速に普及し、その人口の母数からも、今後より多くのユーザーにアプリを使用してもらうために、無視できない市場です。

このような流れを見て「自分のアプリってどこまでサイズ圧縮できるのだろう」と試した項目をまとめてみました。（単純な好奇心です。）

<br>


### 【1】最適化する
まずzipalignコマンドで最適化していきます。
実際に運用しているアプリでzipalignを行っていない方は、ほぼいらっしゃらないと思いますが、zipalignが何をしているのか知らないかたは多いのではないでしょうか。

[Androidにおいてなぜzipalignをやる必要があるのか](http://qiita.com/nogson/items/abe1016f36c3b331db30)
引用
> ### 何をしているのか
>
>apk内のリソースファイルなどの未圧縮データを4バイトバウンダリに整列している。

> ### 実施しないと何が悪いのか
>
>Androidでは、データが4バイトバウンダリに整列されている時に効率良くそのデータにアクセスする事が出来る。
>逆に整列されていない場合、その整理されていないデータを正しく読むために遅くなり、また多くのメモリを消費するようになる。

<br>

```build.gradle
buildTypes {
    release {
        debuggable false
        zipAlignEnabled true
     }
}
```
<br>


### 【2】ProGuardを適応する
難読化ツールのProGuardを適応させます。
恥ずかしながら過去にProGuardを適応した際に設定を誤り、クラッシュを起こして以来、怖くて使うのを避けておりました。。

ProGuardは難読化だけでなく、使用されていないメソッドや変数を削除したり、バイトコードの最適化行ったりと、APKファイルサイズを圧縮するにも非常に効果があります。

僕は設定ファイルの導入までは結構ハマることが多かったですが、[こちらのサイト](http://www.andr0o0id.com/?p=5340)を参考になります。


```
buildTypes {
    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
```
<br>
### 【3】画像をアイコンフォントに変更する
シンプルなアイコンなどを画像で表示している場合は、なるべくアイコンフォントを使いましょう。
ProGuardの次に削減の効果がでます。

導入についてはちょうど７日目の記事があがっていますね！
[Androidiアプリ開発をIconFontで幸せに](http://qiita.com/motodimago/items/8f10a7ddb3bb8f523bfc)


僕は導入が楽な[android-iconify](https://github.com/JoanZapata/android-iconify)を使うことが多いです。
独自のttfを使用する際は以下の実装しています。

```
public enum AnimalIcons implements Icon {
    dog('\ue100'),
    cat('\ue101');

    char character;

    AnimalIcons(char character) {
        this.character = character;
    }

    @Override
    public String key() {
        return name().replace('_', '-');
    }

    @Override
    public char character() {
        return character;
    }

    public String icon() {
        return "{" + key() + "}";
    }
}
```

```
public class AnimalIconModule implements IconFontDescriptor {

    @Override
    public String ttfFileName() {
        return "fonts/animal-icon.ttf";
    }

    @Override
    public Icon[] characters() {
        return AnimalIcons.values();
    }
}
```

```
iconTextView.setText(AnimalIcons.dog.icon());
```

ライブラリによって実装方法が異なるので、複数人で開発しているプロジェクトでは、好みが分かれる可能性があります。

## 結果
上記は僕がもっとも効果のあった３つを挙げています。
結果として25MB→17MBと8MB圧縮できたので、取り組んだ甲斐があったと思います。
（他にも画像の圧縮など行っています。）

年末の大掃除も兼ねて、どこまで圧縮できるか試してみてはいかがでしょうか。

また、他にもよい方法をご存知の方がいれば、ご教授のほどお願いいたします。