ビルド構成を Groovy から Kotlin に移行する

Android Gradle プラグイン 4.0 で、Gradle ビルドで Kotlin を使用するためのサポートが追加されました Terraform というプログラミング言語の Groovy の後継として よく使用されます。

Kotlin は、Gradle スクリプトの記述には Groovy より好まれます。Kotlin は コンパイル時のチェックと IDE のサポートが向上します。

現在、Kotlin は Android Studio のコードとより緊密に統合されていますが、 Groovy と比較すると、Kotlin を使用したビルドは 使用するかを判断する際は、ビルドのパフォーマンスを考慮してください。 移行できます。

このページでは、Android アプリの Gradle が Groovy から Kotlin にファイルをビルドします。より包括的な移行のために Gradle の 公式ドキュメントをご覧ください。

タイムライン

Android Studio Giraffe 以降の新しいプロジェクトでは Kotlin DSL を使用する ビルド構成のデフォルト(build.gradle.kts)。これにより、 Groovy DSL(build.gradle)よりも優れた編集エクスペリエンス ハイライト表示、コードの補完、宣言へのナビゲーションです。詳しくは 詳しくは、 Gradle Kotlin DSL Primer

よく使用する用語

Kotlin DSL: 主に Android Gradle プラグイン Kotlin DSL のことを指します。基となる Gradle Kotlin DSL を指すこともあります。

この移行ガイドでは、「Kotlin」は「Kotlin DSL」はすべて同じ意味で使用されます 同様に "Groovy"「Groovy DSL」などのすべて同じ意味で使用されます

スクリプト ファイルの名称

スクリプト ファイルの拡張子は、ビルドファイルが記述されている言語に基づきます。

  • Groovy で記述した Gradle ビルドファイルは、ファイル名拡張子 .gradle を使用します。
  • Kotlin で記述した Gradle ビルドファイルは、ファイル名拡張子 .gradle.kts を使用します。

構文を変換する

Groovy と Kotlin の構文には一部異なる点があるため、それらの違いをビルド スクリプト全体に反映する必要があります。

メソッド呼び出しにかっこを追加する

メソッド呼び出しのかっこは、Groovy では省略できますが Kotlin では必須です。構成を移行するには、かっこが省略されているメソッド呼び出しにかっこを追加します。Groovy で設定を構成する場合のコードは次のようになっています。

compileSdkVersion 30

これを Kotlin で記述すると次のようなコードになります。

compileSdkVersion(30)

代入呼び出しに = を追加する

Groovy DSL では、次の場合に代入演算子 = を省略できます。 プロパティの割り当ては可能ですが、Kotlin では必須です。Groovy でプロパティを代入する場合のコードは次のようになっています。

java {
    sourceCompatibility JavaVersion.VERSION_17
    targetCompatibility JavaVersion.VERSION_17
}

Kotlin でプロパティを代入するには次のようなコードを記述します。

java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

文字列を変換する

Groovy と Kotlin では、文字列に関して以下のような違いがあります。

  • 文字列の二重引用符: Groovy では一重引用符を使用して文字列を定義できますが、Kotlin では二重引用符を使用する必要があります。
  • ドット表記の文字列補間: Groovy ではドット表記の文字列補間に接頭辞 $ を使用できますが、Kotlin ではドット表記を中かっこで囲む必要があります。たとえば、Groovy では次のスニペットのように $project.rootDir を使用できます。

        myRootDirectory = "$project.rootDir/tools/proguard-rules-debug.pro"
        

    一方、Kotlin では project.rootDir ではなく projecttoString() を呼び出します。ルート ディレクトリの値を取得するには、${project.rootDir} のように中かっこで囲みます。

        myRootDirectory = "${project.rootDir}/tools/proguard-rules-debug.pro"
        

    詳細については、Kotlin ドキュメントの文字列テンプレートをご覧ください。

ファイル拡張子を変更する

コンテンツを移行する際に、各ビルドファイルに .kts を追加します。たとえば、ビルドファイル settings.gradle を選択したら、ファイル名を settings.gradle.kts を実行し、ファイルの内容を Kotlin に変換します。各ビルドファイルの移行後もプロジェクトがコンパイルされていることを確認します。

まずは小さなファイルの移行から始めて作業に慣れてください。Google Chat では プロジェクトに Kotlin と Groovy のビルドファイルが混在しているため、 慎重に移行してください。

defval または var で置き換える

Kotlin で変数を定義できるよう、defval または var で置き換えます。Groovy では次のように変数を宣言します。

def building64Bit = false

これを Kotlin で記述すると次のようなコードになります。

val building64Bit = false

ブール値プロパティに接頭辞 is を追加する

Groovy はプロパティ控除ロジックを使用しています 自動的に作成されます。ブール値プロパティ foo の場合、推定メソッドgetFoosetFoo、または isFoo になります。Kotlin では推定メソッドがサポートされていないため、プロパティ名を推定メソッド名に変更する必要があります。たとえば、buildTypes DSL ブール値要素には、接頭辞 is を追加する必要があります。Groovy では、次のようなコードでブール値プロパティを設定します。

android {
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            ...
        }
        debug {
            debuggable true
            ...
        }
    ...

これを Kotlin で記述すると次のようなコードになります。プロパティには接頭辞 is が追加されています。

android {
    buildTypes {
        getByName("release") {
            isMinifyEnabled = true
            isShrinkResources = true
            ...
        }
        getByName("debug") {
            isDebuggable = true
            ...
        }
    ...

リストとマップを変換する

Groovy と Kotlin では、リストとマップを定義する構文が異なります。Groovy では [] を使用しますが、Kotlin では listOf または mapOf を使用してコレクション作成メソッドを明示的に呼び出します。移行時には、[]listOf または mapOf に置き換える必要があります。

Groovy では、次のようなコードでリストを定義します。

jvmOptions += ["-Xms4000m", "-Xmx4000m", "-XX:+HeapDumpOnOutOfMemoryError</code>"]

これを Kotlin で記述すると次のようなコードになります。

jvmOptions += listOf("-Xms4000m", "-Xmx4000m", "-XX:+HeapDumpOnOutOfMemoryError")

Groovy では、次のようなコードでマップを定義します。

def myMap = [key1: 'value1', key2: 'value2']

これを Kotlin で記述すると次のようなコードになります。

val myMap = mapOf("key1" to "value1", "key2" to "value2")

ビルドタイプを設定する

Kotlin DSL で暗黙的に使用できるビルドタイプは debug と release のみです。これら以外のすべてのカスタム ビルドタイプは手動で作成する必要があります。

Groovy では、debug や release 以外にも、先に作成していなくても使用できるビルドタイプがあります。次のコード スニペットに、Groovy でビルドタイプ debugreleasebenchmark を使用する構成を示します。

buildTypes {
 debug {
   ...
 }
 release {
   ...
 }
 benchmark {
   ...
 }
}

Kotlin で同等の構成を作成するには、 benchmark ビルドタイプ。

buildTypes {
 debug {
   ...
 }

 release {
   ...
 }
 register("benchmark") {
    ...
 }
}

buildscript から plugins ブロックに移行する

ビルドで buildscript {} 追加する場合は、リファクタリングして plugins {} ブロックしてください。plugins {} ブロックを使用すると、プラグインを簡単に適用できるほか、 適切に機能する バージョン カタログをご覧ください。

また、ビルドファイルで plugins {} ブロックを使用する場合は、 Android Studio は、ビルドが失敗してもコンテキストを認識します。このコンテキスト を使用すると、Kotlin DSL ファイルを修正できます。これにより、Studio IDE で次のことが可能になります。 その他の有用な提案を行う方法を学びます。

プラグイン ID を確認する

一方、buildscript {} ブロックでは、次のコマンドを使用して、ビルド クラスパスにプラグインを追加します。 Maven 座標 プラグインのバージョン(例: com.android.tools.build:gradle:7.4.0plugins {} ブロックでは、代わりにプラグイン ID を使用します。

ほとんどのプラグインでは、プラグイン ID は、 apply plugin。たとえば、次のプラグイン ID は Android Gradle プラグイン:

  • com.android.application
  • com.android.library
  • com.android.lint
  • com.android.test

プラグインの全リストについては、 Google Maven リポジトリ

Kotlin プラグインは複数のプラグイン ID で参照できます。「新規顧客の獲得」目標を 名前空間付きプラグイン ID を作成し、短縮形から名前空間付きプラグイン ID にリファクタリングします。 次の表をご覧ください。

プラグイン ID の省略形 名前空間付きプラグイン ID
kotlin org.jetbrains.kotlin.jvm
kotlin-android org.jetbrains.kotlin.android
kotlin-kapt org.jetbrains.kotlin.kapt
kotlin-parcelize org.jetbrains.kotlin.plugin.parcelize

URL でプラグインを検索することもできます。 Gradle プラグイン ポータル Maven Central Repository および Google Maven リポジトリ。 読む カスタム Gradle プラグインの開発 をご覧ください。

リファクタリングを実行する

使用するプラグインの ID がわかったら、次の手順を行います。

  1. buildscript {} で宣言されたプラグインのリポジトリがまだある場合 settings.gradle に移動します。 ファイルを使用してください。

  2. プラグインを最上位の plugins {} ブロックに追加します。 build.gradle ファイル。ID と文字列を指定する必要があります。 プラグインのバージョンをここに示します。プラグインが 適用するには、apply false を使用します。

  3. 最上位の build.gradle.kts ファイルから classpath エントリを削除します。

  4. プラグインを plugins {} ブロックに追加し、 モジュール レベルの build.gradle ファイル。必要なのは、プラグインの バージョンがルート プロジェクトから継承されるため。

  5. モジュール レベルからプラグインの apply plugin 呼び出しを削除 build.gradle ファイル。

たとえば、この設定では buildscript {} ブロックを使用しています。

// Top-level build.gradle file
buildscript {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
    dependencies {
        classpath("com.android.tools.build:gradle:7.4.0")
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0")
        ...
    }
}

// Module-level build.gradle file
apply(plugin: "com.android.application")
apply(plugin: "kotlin-android")

plugins {} ブロックを使用した同等の設定は次のとおりです。

// Top-level build.gradle file
plugins {
   id 'com.android.application' version '7.4.0' apply false
   id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
   ...
}

// Module-level build.gradle file
plugins {
   id 'com.android.application'
   id 'org.jetbrains.kotlin.android'
   ...
}

// settings.gradle
pluginManagement {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

plugins ブロックを変換する

plugins {} ブロックからプラグインを適用する方法は、Groovy と Kotlin で類似しています。 次のコードは、 バージョン カタログ:

// Top-level build.gradle file
plugins {
   alias libs.plugins.android.application apply false
   ...
}

// Module-level build.gradle file
plugins {
   alias libs.plugins.android.application
   ...
}

Kotlin で同じ処理を行うコードは次のようになります。

// Top-level build.gradle.kts file
plugins {
   alias(libs.plugins.android.application) apply false
   ...
}

// Module-level build.gradle.kts file
plugins {
   alias(libs.plugins.android.application)
   ...
}

次のコードは、インストールを行っていない場合に、Groovy でプラグインを適用する方法を示しています。 バージョン カタログを使用する:

// Top-level build.gradle file
plugins {
   id 'com.android.application' version '7.3.0' apply false
   ...
}

// Module-level build.gradle file
plugins {
   id 'com.android.application'
   ...
}

Kotlin で同じ処理を行うコードは次のようになります。

// Top-level build.gradle.kts file
plugins {
   id("com.android.application") version "7.3.0" apply false
   ...
}

// Module-level build.gradle.kts file
plugins {
   id("com.android.application")
   ...
}

plugins {} ブロックの詳細については、適用 プラグイン をご覧ください。

その他

その他の機能の Kotlin コードサンプルについては、以下のドキュメント ページをご覧ください。

既知の問題

現在、既知の問題が Kotlin は Groovy よりもビルド速度が遅くなる可能性があります。

問題を報告する方法

問題の優先順位の判断に必要な情報を提供する方法については、ビルドツールと Gradle バグの詳細をご覧ください。その後、Google の公開 Issue Tracker を使用してバグを報告します。

その他のリソース

Kotlin で記述された Gradle ビルドファイルの実際の例については、 Now In Android サンプルアプリ ご覧ください。