新規プロジェクト作成から始めるbuild.gradle.kts

Yuki FujisakiさんのDroidKaigi2019のセッションを聞いて実践してみたので、備忘録がてら手順を記します。
YukiさんのセッションのSlideShareは[こちら](https://speakerdeck.com/tnj/lets-migrate-to-build-dot-gradle-dot-kts)

# 環境情報
AndroidStudioの新規プロジェクトでEmptyActivityを作成した状態からスタートします。

- AndroidStudio4.0
- gradle distribution6.1.1
- use androidX
- use viewBinding

# settings.gradle

## kotlinで読み込める形に書き換える

Before

```groovy:settings.gradle
include ':app'
```
After

```groovy:settings.gradle
include(":app")
```
Syncする

## ktsにRenameする
ファイル名をsettings.gradle.ktsにリネーム
.ktsを追加するだけ
ダイアログが出るかもしれませんが、ContinueでOK
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192408/ac7373b4-a884-505e-4d8a-649eabce8c63.png)

改めてSyncすれば、引数名が出てきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192408/e639efd3-79de-2dcc-72be-792bdeba06fc.png)

# プロジェクトルートのbuild.gradle
基本的には正規表現置換が楽
StudioのReplaceで置換(Regexにチェックを入れること)

文字リテラル

```
'([^']+)'
↓置換↓
"$1"
```
メソッド呼び出し

```
(classpath|delete) (\S+)
↓置換↓
$1($2)
```

- kotlinでは文字リテラルはダブルクォーテーション
- メソッド呼び出しには()が必要

## ext.kotlin_version
kotlinの書き方に変える

Before

```groovy:build.gradle
buildscript {
    ext.kotlin_version = "1.3.21"
    repositories {
```
After

```kotlin:build.gradle
buildscript {
    val kotlin_version by extra("1.3.21")
    repositories {
```

## taskを変える
Before

```groovy
task clean(type: Delete) {
    delete(rootProject.buildDir)
}
```
After

```groovy

task<Delete>("clean") {
    delete(rootProject.buildDir)
}

// または下記でもOK
tasks.create("clean", type = Delete::class) {
    delete(rootProject.buildDir)
}
```

## ktsにリネームする
build.gradle.ktsに。
Syncすれば色が付きます。

# app/build.gradle
## 文字リテラルの置換(さっきと同じ)

```
'([^']+)'
↓置換↓
"$1"
```

## apply plugin
plugins{}に変更
Before

```groovy:app/build.gradle
apply plugin: "com.android.application"
apply plugin: "kotlin-android"
apply plugin: "kotlin-android-extensions"
```
After

```groovy:app/build.gradle
plugins {
    id("com.android.application")
    id("kotlin-android")
    id("kotlin-android-extensions")
}
```

## android
代入とメソッド呼び出しが混在している
とりあえず代入してみてダメだったらメソッド呼び出しにすればよいが、正規表現で出来る(dependenciesの方も置換されますがしてしまってOK)

```
(\w(?:ion|Giles)) (.+)$
↓置換↓
$1($2)
```
他のもの(メソッド呼び出しにならなかったもの)は代入に変更。
Before

```groovy:app/build.gradle
android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.morayl.simple_sample"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
```
After

```groovy:app/build.gradle
    compileSdkVersion(28)
    defaultConfig {
        applicationId = "com.morayl.simple_sample"
        minSdkVersion(21)
        targetSdkVersion(28)
        versionCode = 1
        versionName = "1.0"
        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }
```

## buildTypes
getByNameを使う
Before

```groovy:app/build.gradle
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
        }
    }
```
After

```groovy:app/build.gradle
    buildTypes {
        getByName("release") {
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
        }
    }
```
- minifyEnabledはメソッドなので、setMinifyEnabledになるが、kotlinはpropertyアクセスが出来るため`isMinifyEnabled = false`

##buildFeatures
=を利用する
Before

```groovy:app/build.gradle
    buildFeatures {
        viewBinding true
    }
```
After

```groovy:app/build.gradle
    buildFeatures {
        viewBinding = true
    }
```



## fileTree
初期状態では使っていないので消してしまってもよい。
変えるなら下記
Before

```groovy:app/build.gradle
implementation(fileTree(dir: 'libs', include: ['*.jar']))
```
After

```groovy:app/build.gradle
implementation(fileTree("dir" to "libs", "include" to listOf("*.jar")))
```


## kotlin_version
そのままでは見えないので、定義を追加。
dependenciesのブロックで見えればどこでも良いが、私は1行目に書きました(最終的にはDepsVersionとして外に出した)

```kotlin:app/build.gradle
val kotlin_version: String by project
```


## ktsにリネームしてSync
解決できない問題があると、上部にメッセージが出るので、適用していけば通るはず。
Syncに成功したら、ビルド実行すればアプリが立ち上がるはず・・・！

# kts化後に、appModuleなどが見えなくなる問題
リポジトリを別環境でクローンした際に、projectViewにルートのgradleファイルしか見えなくなったことがありました。
その時解決した対処法は別の記事で記載しました。
遭遇したらお役に立てると幸いです。
[build.gradle.kts移行したプロジェクトで、appModuleすら認識しなくなってしまったときの解決法](https://qiita.com/morayl/items/7eb02f4f7d9e894fccb9)

# 最後に
サンプルプロジェクトをkts化しただけですが、こちらにコードを置きました。
https://github.com/morayl/simple-sample/tree/feature/kts

kotlinで書けるというのがやっぱりいいですね。kotlin最高。