Android 開発環境のいろいろな「バージョン」の 確認方法 と 関係 2022年11月

開発中に、こんなエラーでました。


The project is using an incompatible version (AGP 8.0.0-alpha05) of the Android Gradle plugin. Latest supported version is AGP 7.3.1
https://developer.android.com/studio/releases#android_gradle_plugin_and_android_studio_compatibility

良く分かっていないですが2つの「バージョン」の相性が悪いようです。

開発環境はそれぞれのバージョンを持つ複数の何かで構成されています。

これまでも整理してきましたが、

👉 【Android Studio】ビルド環境を安定した最新バージョンにする hatena-bookmark
👉 Android Studio の設定で「バージョン」の記述してるとこありすぎね? hatena-bookmark

これらを踏まえて、今現在のバージョンで再度整理してみます。

まずは、私の環境でそれぞれのバージョンを確認していきます。

 

■ Android Studio

Android Studio で、左上のメニューから、


Android Studio

  ↓

About Android Studio

Android Studio Dolphin | 2021.3.1 Patch 1


Android Studio Dolphin | 2021.3.1 Patch 1
Build #AI-213.7172.25.2113.9123335, built on September 30, 2022
Runtime version: 11.0.13+0-b1751.21-8125866 x86_64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.

Android Studio のバージョンは、


Android Studio Dolphin | 2021.3.1 Patch 1

です。

 

■ Android Gradle Plugin

同様にメニューから、


File

 ↓

Project Structure

 ↓

Project

選択肢しか表示されてない!

Android Gradle Plugin
👉 Cannot find AGP version in build files & empty Android Gradle Plugin Version - Stack Overflow hatena-bookmark

Plugin DSL の影響でしょうか。

module = "com.android.tools.build:gradle" を参照する id = "com.android.application" のバージョンを確認します。

👉 【Plugin DSL】「com.android.tools.build:gradle」の記述は不要? hatena-bookmark


# gradle/libs.versions.toml

[versions]
agp = "7.3.1"

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
# android-application = { id = "com.android.library", version.ref = "agp" }

Android Gradle plugin のバージョンは、


7.3.1

です。

最初のエラーのメッセージに従って 8.0.0-alpha05 → 7.3.1 と下げました。

👉 【Plugin DSL】Android Gradle Plugin のバージョンがわからない hatena-bookmark

 

■ Gradle

メニューから、


File

 ↓

Project Structure

 ↓

Project

Gradle version

または、ターミナルでコマンド打ちます。


❯ ./gradlew --version

------------------------------------------------------------
Gradle 7.5.1
------------------------------------------------------------

Build time:   2022-08-05 21:17:56 UTC
Revision:     d1daa0cbf1a0103000b71484e1dbfe096e095918

Kotlin:       1.6.21
Groovy:       3.0.10
Ant:          Apache Ant(TM) version 1.10.11 compiled on July 10 2021
JVM:          11.0.16.1 (Homebrew 11.0.16.1+0)
OS:           Mac OS X 13.0 x86_64

または、gradle-wrapper.properties を見ます。


# gradle/wrapper/gradle-wrapper.properties

distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

Gradle のバージョンは、


7.5.1

です。

 

■ 各バージョン同士の関係

The Android Studio build system is based on Gradle, and the Android Gradle plugin adds several features that are specific to building Android apps. The following table lists which version of the Android Gradle plugin is required for each version of Android Studio.

Android StudioのビルドシステムはGradleをベースにしており、Android Gradleプラグインは、Androidアプリのビルドに特化したいくつかの機能を追加します。次の表は、Android Studioの各バージョンに必要なAndroid Gradleプラグインのバージョンを示しています。

Android Gradle plugin and Android Studio compatibility
👉 Android Gradle plugin and Android Studio compatibility - Android Studio Dolphin | 2021.3.1  |  Android Developers hatena-bookmark

Android Studio Dolphin | 2021.3.1 に、今現在、最適な Android Gradle Plugin は、安定版最新の 7.3.1 です。

The following table lists which version of Gradle is required for each version of the Android Gradle plugin. For the best performance, you should use the latest possible version of both Gradle and the plugin.

次の表は、Android Gradleプラグインの各バージョンに必要なGradleのバージョンを示しています。最高のパフォーマンスを得るためには、Gradleとプラグインの両方の可能な限り最新のバージョンを使用する必要があります。

The following table lists which version of Gradle is required for each version of the Android Gradle plugin. For the best performance, you should use the latest possible version of both Gradle and the plugin.
👉 Update Gradle - Android Gradle plugin release notes  |  Android Developers hatena-bookmark

Android Gradle Plugin7.3.1 に、最適な Gradle のバージョンは、安定版最新の 7.5.1 です。

 

■ 各リポジトリとダウンロード先

Android StudioAndroid Gradle PluginGradle それぞれの公開してるURLを並べておきます。

👉 Download Android Studio & App Tools - Android Developers hatena-bookmark
Android Studio Download

👉 Android Gradle Plugin - Google's Maven Repository hatena-bookmark
Android Gradle Plugin

👉 Gradle Distributions hatena-bookmark
Gradle Distributions

 

■ まとめ

それぞれのバージョン同士に範囲があることを考えながら、その中で安定版の最新のバージョンにするのがいいでしょう。

この先には、Kotlin Gradle Plugin "org.jetbrains.kotlin:kotlin-gradle-plugin" のバージョンなどもあったりしますが、また次の機会に書きます。

👉 【Android Studio Flamingo】dependencies をバージョンアップデートするときに確認するべき3つの相性 hatena-bookmark

👉 AndroidStudio 利用する Java (JDK) の選択・設定の方法 hatena-bookmark


【Plugin DSL】Android Gradle Plugin のバージョンを調べる方法

Google Maven Repository では公開されているバージョンは分かりますが。

【Plugin DSL】Android Gradle Plugin のバージョンはどこに記述するのか

👉 Google's Maven Repository hatena-bookmark

Plugin DSLVersion Catalogtoml を使うと、今現在安定版の Android Studio 上ではうまく表示されないようです。

Android Gradle Plugin

レガシーな記述では、build.gradle の以下の* 部分に記述されていました。


// build.gradle (root)

buildscript {
  repositories {
    gradlePluginPortal()
    google()
    mavenCentral()
  }

  dependencies {
    classpath 'com.android.tools.build:gradle:3.2.1' // *
    classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.41'
  }
}


// app/build.gradle (module)

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'

一方、 Plugin DSL では、Plugin Marker Artifacts を利用して解決されるので、com.android.tools.build:gradle の記述は消えます。

よくある基本的な記述を以下に挙げます。


# gradle/libs.versions.toml

[versions]
agp = "7.3.1" // *
kotlin = "1.7.20"

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" } // *
android-library = { id = "com.android.library", version.ref = "agp" } // *
android-lint = { id = "com.android.lint", version.ref = "agp" }
android-test = { id = "com.android.test", version.ref = "agp" }

kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" }


// build.gradle.kts (root)

plugins {
    alias(libs.plugins.android.application) apply false
    alias(libs.plugins.android.library) apply false
    alias(libs.plugins.android.lint) apply false
    alias(libs.plugins.android.test) apply false
    alias(libs.plugins.kotlin.android) apply false
    alias(libs.plugins.kotlin.kapt) apply false
}


// app/build.gradle.kts (module)

plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.kotlin.android)
}

この場合の、Android Gradle plugin のバージョンは、 [version]agp の値になりますので、7.3.1 ということになります。

詳しくは以前にに書きました。
👉 【Plugin DSL】「com.android.tools.build:gradle」の記述は不要? hatena-bookmark

 

■ まとめ

build.gradle


classpath 'com.android.tools.build:gradle:x.y.z'

の記述がない場合の Android Gradle Plugin のバージョンは、

以下の、どれかのプラグインID のバージョン(共通) です。


- com.android.application
- com.android.library
- com.android.lint
- com.android.test

👉 q=.gradle.plugin - Google's Maven Repository hatena-bookmark

👉 Jetpack Compose Samples でも使われている「Version catalog update plugin」で libs.versions.toml を書き出してみる hatena-bookmark

👉 【Plugin DSL】「com.android.tools.build:gradle」の記述は不要? hatena-bookmark


【Gradle Version Catalog】libs.versions.toml キー名の形式 camelCase vs kebab-case

一流のプログラマーのコードには、それぞれのこだわりや哲学があります。

Gradle Version Catalog で利用される設定ファイルの libs.versions.toml を眺めながら、気になったことがありました。

キー名の形式です。

Gradle Version Catalog

 

■ いろんな形式がある

Naming convention (programming)
👉 Naming convention (programming) - Wikipedia hatena-bookmark

 

■ TOML 的には

Case についてははっきりとしたきまりはないようです。

キーはベア・キー、クォート付きキー、ドット付きキーのいずれかです。
ベア・キーはASCII英数字とアンダースコア、ダッシュのみで構成されます(A-Za-z0-9_-)。 ASCII数字のみでも構いませんが、文字列として解釈されることに注意してください(例: 1234)。

👉キー TOML: 日本語 v1.0.0-rc.2 hatena-bookmark

こんなきまりもあります。

インライン・テーブルは一行で表現されるべきです。インライン・テーブルでは、配列と違って、最後の要素のあとにコンマを足すことはできません。波括弧の内側では改行は認められません。ただし、それぞれの値の中で改行することは、それぞれの値型で認められている範囲でできます。ですが、できるとしてもインライン・テーブルを複数行に分割することはなるべく避けるべきです。もしあなたがその必要があるように感じたのならば、普通のテーブルを用いるべきです。


name = { first = "Tom", last = "Preston-Werner" }
point = { x = 1, y = 2 }
animal = { type.name = "pug" }

👉 インライン・テーブル TOML: 日本語 v1.0.0-rc.2 hatena-bookmark

 

■ GitHub で見てみる

camelCase


[libraries]
androidPlugin = { module = "com.android.tools.build:gradle", version = "4.2.2" }
robovmPlugin = { module = "com.mobidevelop.robovm:robovm-gradle-plugin", version.ref = "robovm" }
kotlinStdLib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" }
kotlinCoroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version = "1.5.1" }
okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }

👉 retrofit/libs.versions.toml at 5180f481c58b0be80ad81a0c1ec540fe7e91ee81 · square/retrofit hatena-bookmark

kebab-case


[libraries]
plugin-android = { module = "com.android.tools.build:gradle", version.ref = "plugin-android" }
plugin-kotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "plugin-kotlin" }
plugin-kotlin-serialization = { module = "org.jetbrains.kotlin:kotlin-serialization", version.ref = "plugin-kotlin" }
plugin-gver = { module = "com.github.ben-manes:gradle-versions-plugin", version.ref = "plugin-gver" }

👉 kmm-production-sample/libs.versions.toml at aed57893bab7e88a0df50285196e942be6934bf8 · Kotlin/kmm-production-sample hatena-bookmark
👉 PosterBox/libs.versions.toml at 9e988e7fb62620a6913493aeecc51cb71aba3595 · JakeWharton/PosterBox hatena-bookmark
👉 awesome-kotlin/libs.versions.toml at ae83263c467da6f81bb1abc7536ab6af7bc5b4d0 · KotlinBy/awesome-kotlin hatena-bookmark

camelCase - kebab-case


[libraries]
gradlePlugin-android = { module = "com.android.tools.build:gradle", version = "4.2.2" }
gradlePlugin-kotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlinCompiler" }
gradlePlugin-dokka = { module = "org.jetbrains.dokka:dokka-gradle-plugin", version = "1.6.20" }

👉 leakcanary/libs.versions.toml at f9462209ab553c76ad77673f7bebbd155fa76fa9 · square/leakcanary hatena-bookmark

その他


jsoup = { module = "org.jsoup:jsoup", version.ref = "1.15.3" }

でなく


jsoup = "org.jsoup:jsoup:1.15.3"

とも書ける。

👉 okhttp/libs.versions.toml at a94769c31ff18c5c768f790a92eab1de9b27fd83 · square/okhttp hatena-bookmark

あと、どこを選択するか、という問題もある。


com.google.firebase:firebase-bom
                    ^^^^^^^^^^^^

com.google.firebase:firebase-*
                    ^^^^^^^^^^

com.google.accompanist:accompanist-*
    ^^^^^^.^^^^^^^^^^^

com.google.accompanist:accompanist-imageloading-core
    ^^^^^^.^^^^^^^^^^^.            ^^^^^^^^^^^^^^^^^

com.google.accompanist:accompanist-glide
    ^^^^^^.^^^^^^^^^^^.            ^^^^^

com.google.android.libraries.places:places
    ^^^^^^.^^^^^^^.          ^^^^^^

com.google.maps.android:*
    ^^^^^^.     ^^^^^^^.^

com.google.maps.android:android-maps-utils
    ^^^^^^.     ^^^^^^^.        ^^^^^^^^^^

com.google.maps.android:maps-ktx
    ^^^^^^.     ^^^^^^^.^^^^^^^^

👉 refreshVersions/google-version-alias-rules.txt at main · jmfayard/refreshVersions hatena-bookmark

 

■ まとめ

「.(ドット)」に置き換えられて読み込まれる build,gradle 側の考慮も必要になります。

「重複しない直感的に分かりやすい名前」「kebab-case」にするのがスッキリしていいように思うけどみんなはどうしてますか?

👉 Jetpack Compose Samples でも使われている「Version catalog update plugin」で libs.versions.toml を書き出してみる hatena-bookmark
👉 Gradle Version Catalog への書き換えツールを作る【python】 hatena-bookmark
👉 「⚠ This project uses Gradle Version Catalogs: this tool may not behave as expected.」→ 今現在、Gradle Version Catalog には gradle-versions-plugin が必須では? hatena-bookmark