fabricプラグインを入れるとInstantRun時にABIs APK Splitのアーキテクチャがx86になるのを回避する

Realmを使っているアプリではAPKの肥大化を防ぐためにアーキテクチャ毎にAPKを分けるようにするのが定石です。

- [Realm導入によるAPK肥大化を防ぐ(Split APK) - Qiita](http://qiita.com/takke/items/8f7ca95d35e6f942eba2)
- [Apk Splits - Android Studio Project Site](http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits)
- [Realm Javaのセットアップ方法が変わります](https://realm.io/jp/news/android-installation-change/)

異なるアーキテクチャのAPKをPlayストアで公開するためにはVersionCodeを各アーキテクチャ毎に異なったものを設定する必要があります。

- [Multiple APK Support | Android Developers](https://developer.android.com/google/play/publishing/multiple-apks.html)

そんなアプリでInstantRunを有効にしてみたところ、なぜかABIがx86として扱われてしまいました。
具体的には

```groovy:app/build.gradle
...
    // アーキテクチャ毎にバージョンコードを変更する
    applicationVariants.all { variant ->
        // assign different version code for each output
        variant.outputs.each { output ->
            def flavorName = variant.productFlavors[0].name
            def buildTypeName = variant.buildType.name

            def arch = output.getFilter(com.android.build.OutputFile.ABI)
            output.versionCodeOverride = android.defaultConfig.versionCode * 10 + rootProject.ext.versionCodes.get(arch)

            System.println("* override version code : [${android.defaultConfig.versionCode}] -> [${output.versionCodeOverride}] (${flavorName} ${buildTypeName} ${arch})")
        }
    }
```

こうすると下記のようにバージョンコードが書き換わります。

```
* override version code : [6] -> [62] (premium debug x86)
* override version code : [6] -> [64] (premium debug armeabi-v7a)
* override version code : [6] -> [62] (premium release x86)
* override version code : [6] -> [64] (premium release armeabi-v7a)
* override version code : [6] -> [62] (free debug x86)
* override version code : [6] -> [64] (free debug armeabi-v7a)
* override version code : [6] -> [62] (free release x86)
* override version code : [6] -> [64] (free release armeabi-v7a)
```

これを普通にAndroidStudioから実行すると VersionCode=64 のほうがインストールされます。

しかし、InstantRun を有効にして実行すると VersionCode=64 のほうがインストールされてしまい、再インストールを促されてしまいました。

![](https://i.gyazo.com/8a7c01019f2c9608df42d9d0325e081a.png)

色々調べたところ、fabric プラグインを入れることでこの現象が発生するようです。

```groovy
classpath 'io.fabric.tools:gradle:1.21.7'
```

前置きが長くなりましたが、これを解消するために debug 版では バージョンコードの下一桁を 0 にするようにしてみました。

```groovy:app/build.gradle
...
    // アーキテクチャ毎にバージョンコードを変更する
    applicationVariants.all { variant ->
        // assign different version code for each output
        variant.outputs.each { output ->
            def flavorName = variant.productFlavors[0].name
            def buildTypeName = variant.buildType.name

            def arch = output.getFilter(com.android.build.OutputFile.ABI)
            def versionCode1 = rootProject.ext.versionCodes.get(arch)
            if (buildTypeName == "debug") {
                // InstantRun を有効にすると fabric プラグインの影響で ABI が "x86" になってしまい、
                // InstantRun の有効/無効でバージョンコードが変化してしまう。これを防ぐためデバッグ時は "0" にする。
                versionCode1 = 0;
            }
            output.versionCodeOverride = android.defaultConfig.versionCode * 10 + versionCode1

            System.println("* override version code : [${android.defaultConfig.versionCode}] -> [${output.versionCodeOverride}] (${flavorName} ${buildTypeName} ${arch})")
        }
    }
```

下記のように書き換わっているので大丈夫そうです。

```
* override version code : [6] -> [60] (premium debug x86)
* override version code : [6] -> [60] (premium debug armeabi-v7a)
* override version code : [6] -> [62] (premium release x86)
* override version code : [6] -> [64] (premium release armeabi-v7a)
* override version code : [6] -> [60] (free debug x86)
* override version code : [6] -> [60] (free debug armeabi-v7a)
* override version code : [6] -> [62] (free release x86)
* override version code : [6] -> [64] (free release armeabi-v7a)
```