Help us understand the problem. What is going on with this article?

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

Yuki FujisakiさんのDroidKaigi2019のセッションを聞いて実践してみたので、備忘録がてら手順を記します。
YukiさんのセッションのSlideShareはこちら

環境情報

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

  • AndroidStudio3.3.2
  • gradle distribution4.10.1
  • use androidX

settings.gradle

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

Before

settings.gradle
include ':app'

After

settings.gradle
include(":app")

Syncする

ktsにRenameする

ファイル名をsettings.gradle.ktsにリネーム
.ktsを追加するだけ
ダイアログが出るかもしれませんが、ContinueでOK
image.png

改めてSyncすれば、引数名が出てきます。
image.png

プロジェクトルートのbuild.gradle

基本的には正規表現置換が楽
StudioのReplaceで置換(Regexにチェックを入れること)

文字リテラル

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

メソッド呼び出し

(classpath|delete) (\S+)
↓置換↓
$1($2)
  • kotlinでは文字リテラルはダブルクォーテーション
  • メソッド呼び出しには()が必要

ext.kotlin_version

kotlinの書き方に変える

Before

build.gradle
buildscript {
    ext.kotlin_version = "1.3.21"
    repositories {

After

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

taskを変える

Before

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

After

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

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

After

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

android

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

(\w(?:ion|Giles)) (.+)$
↓置換↓
$1($2)

他のもの(メソッド呼び出しにならなかったもの)は代入に変更。
Before

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

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

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

After

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

fileTree

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

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

After

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

kotlin-jdk

スペースが入ってないせいで置換できていないので修正

app/build.gradle
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
app/build.gradle
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version")

kotlin_version

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

app/build.gradle
val kotlin_version: String by project

ktsにリネームしてSync

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

kts化後に、appModuleなどが見えなくなる問題

リポジトリを別環境でクローンした際に、projectViewにルートのgradleファイルしか見えなくなったことがありました。
その時解決した対処法は別の記事で記載しました。
遭遇したらお役に立てると幸いです。
build.gradle.kts移行したプロジェクトで、appModuleすら認識しなくなってしまったときの解決法

最後に

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

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away