Android Studioを2.3から3.0へ移行する

## はじめに
[Android Studio 3.0](https://developer.android.com/topic/libraries/support-library/revisions.html#27-1-0) がリリースされました。
ということで、Android Studioを2.3から3.0に移行しました。

## 手順

### 1. Android Studioのアップデート
`Android Studio -> Check for Updates...`からアップデート

### 2. Gradleのアップデート
Gradleを最新の 4.1 にアップデート

```properties:gradle/wrapper/gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
```

### 3. Android Plugin for Gradleのアップデート
Googleから提供されたmavenリポジトリを使うようにもする

```groovy:build.gradle
buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
    }
}
allprojects {
    repositories {
        google()
    }
}
```

### 4. SDK Build Toolsのアップデートのアップデート

```groovy:app/build.gradle
android {
    buildToolsVersion '26.0.2'
}
```

### 5. Flavor Dimensionsの設定
Android Studio 3.0 から、すべての Flavor に対して、[Flavor Dimensions](https://developer.android.com/studio/build/build-variants.html#flavor-dimensions) の設定が必須

```groovy:app/build.gradle
android {
    flavorDimensions "source"
    productFlavors {
        free {
            dimension "source"
        }
    }
}
```

Flavor Dimensionsを設定していなかったら、以下のようなエラーになる
> Error:All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html

### 6. Dependencyの設定
Android Studio 3.0 から、`compile`は非推奨で、その代わりに`implementation`か`api`を使うことが推奨されている
`implementation`と`api`の違いはここに詳しく書いているhttps://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html?utm_source=android-studio#new_configurations

また、`provided`は`compileOnly`に、`apk`は`runtimeOnly`を使うことも推奨されている

```groovy:app/build.gradle
// before
dependencies {
    compile 'com.xxx.yyy:zzz:1.0.0'
    freeCompile 'com.xxx.zzz:yyy:1.0.0'
}
```

```groovy:app/build.gradle
// after
dependencies {
    implementation 'com.xxx.yyy:zzz:1.0.0'
    freeImplementation 'com.xxx.zzz:yyy:1.0.0'
}
```

### 7. その他行ったこと

#### Retrolambda
ビルドしたときに以下のような警告
> Warning:One of the plugins you are using supports Java 8 language features. To try the support built into the Android plugin, remove the following from your build.gradle:
    apply plugin: 'me.tatarka.retrolambda'
> To learn more, go to https://d.android.com/r/tools/java-8-support-message.html

Android Studio 3.0から、Java8記法がサポートされて、Retrolambdaが不要になったので、RetrolambdaをDependencyから削除

#### Error:Error converting bytecode to dex
ビルドしたときに以下のようなエラー
> Information:Gradle tasks [:app:assembleDebug]
> Error:Error converting bytecode to dex:

プロジェクトをクリーンしたら直りました

#### FATAL EXCEPTION: android.view.InflateException: Binary XML file line #0:

特定の画面に遷移したときにアプリが落ちて、以下のようなエラー
> FATAL EXCEPTION: android.view.InflateException: Binary XML file line #0:

Android Studio 3.0 から、Android Asset Packaging Tool 2.0 (AAPT2) を使ったリソース処理がデフォルト動作となったらしい
これを無効にしたいので、以下の追記をした

```properties:gradle.properties
android.enableAapt2=false
```

#### APKの出力先が変わった
Flavor Dimensionsの設定をしたことで、APKの出力先が変わり、CI環境でエラーとなった
APKの出力先が
`/app/build/outputs/apk/[flavor]/[buildType]/app-[flavor]-[buildType].apk`に変わっていました

## 追記
Android Studioを3.1に上げた記事も書きました。

* [Android Studioを 3.0 から 3.1 へ移行する](https://qiita.com/taki4227/items/00e295c8aaf79d463312)

## 参考
* [Migrate to Android Plugin for Gradle 3.0.0](https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html)
* [Android Studio 2.3から3.0へのマイグレーションポイント](https://qiita.com/eaglesakura/items/133aa7130dea81c9fc1e)