【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


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

Plugin DSL に移行ながらの気持ちが悪いのは以下の変化。


// 2020-10-13
// build.gradle ( root | Project )
classpath "com.android.tools.build:gradle:4.0.2"

// build.gradle ( module | Module )
apply plugin: 'com.android.application'


// 2022-10-25
// build.gradle ( root | Project )
plugins {
  id 'com.android.application' version '7.3.1' apply false
  id 'com.android.library' version '7.3.1' apply false
}

// build.gradle ( module | Module )
plugins {
  id 'com.android.application'
}

👉 今現在 AndroidStudio が推してくる Gradle の設定記述と構成を2年前と比較 - libs.versions.toml, settings.gradle, build.gradle hatena-bookmark

ここに登場する3つの文字列。


com.android.tools.build:gradle
com.android.application
com.android.library

ここらがなんとなくあやふやに使っていたのでよく調べてみます。

 

■ アプリケーションかライブラリか

root の build.gradle でプラグインのバージョンを指定しておいて、


// 2022-10-25
// build.gradle ( root | Project )
plugins {
  id 'com.android.application' version '7.3.1' apply false
  id 'com.android.library' version '7.3.1' apply false
}

その子のモジュールの build.gradle で適用する、


// 2022-10-25
// build.gradle ( module | Module )
plugins {
  id 'com.android.application'
}

ということです。

👉 Applying external plugins with same version to subprojects - Using Gradle Plugins hatena-bookmark

そのときに、そのモジュールがアプリケーションかライブラリかで適用するGradleプラグインのIDが変わります。


plugins {
  id 'com.android.application'
}


plugins {
  id 'com.android.library'
}

👉 Android ライブラリの作成  |  Android デベロッパー  |  Android Developers hatena-bookmark

 

■ 'com.android.tools.build:gradle' の記述

Plugin DSL が登場する前は以下のような記述でしたが、


// 2020-10-13
// build.gradle ( root | Project )
classpath "com.android.tools.build:gradle:4.0.2"

// build.gradle ( module | Module )
apply plugin: 'com.android.application'

Plugin DSL では消えてます、"com.android.tools.build:gradle"

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

ここで、Plugin ID から参照されるリポジトリの内容を見てみます。

Google Maven Repository では、

Plugin Marker Artifacts
Since the plugins {} DSL block only allows for declaring plugins by their globally unique plugin id and version properties, Gradle needs a way to look up the coordinates of the plugin implementation artifact. To do so, Gradle will look for a Plugin Marker Artifact with the coordinates plugin.id:plugin.id.gradle.plugin:plugin.version. This marker needs to have a dependency on the actual plugin implementation. Publishing these markers is automated by the java-gradle-plugin.

プラグインマーカーアーティファクト
plugins {} DSLブロックでは、グローバルにユニークなプラグインIDとバージョンプロパティによってのみプラグインを宣言できるので、Gradleはプラグイン実装アーティファクトの座標を検索する方法が必要です。そのために、Gradleは plugin.id:plugin.id.gradle.plugin:plugin.version という座標を持つプラグインマーカーアーティファクトを探します。このマーカーは、実際のプラグイン実装への依存関係を持つ必要があります。これらのマーカーの発行は、java-gradle-pluginによって自動化されます。

👉 Plugin Marker Artifacts - Using Gradle Plugins hatena-bookmark


plugin.id:plugin.id.gradle.plugin:plugin.version
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

ということなので、

Plugin ID : com.android.application は、


Group Id    : com.android.application
Artifact ID : com.android.application.gradle.plugin

で、

Plugin ID : com.android.library は、


Group Id    : com.android.library
Artifact ID : com.android.library.gradle.plugin

で、検索します。


Group ID	com.android.application
Artifact ID	com.android.application.gradle.plugin
Version	8.0.0-alpha06
Gradle Groovy DSL	
implementation 'com.android.application:com.android.application.gradle.plugin:8.0.0-alpha06'
Gradle Kotlin DSL	
implementation("com.android.application:com.android.application.gradle.plugin:8.0.0-alpha06") 
Last Updated Date	10/24/2022


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.android.application</groupId>
  <artifactId>com.android.application.gradle.plugin</artifactId>
  <version>8.0.0-alpha06</version>
  <packaging>pom</packaging>
  <description>Gradle plug-in to build Android applications.</description>
  <url>https://developer.android.com/studio/build</url>
  <name>com.android.tools.build.gradle</name>
  <licenses>
    <license>
      <name>The Apache Software License, Version 2.0</name>
      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
      <distribution>repo</distribution>
    </license>
  </licenses>
  <developers>
    <developer>
      <name>The Android Open Source Project</name>
    </developer>
  </developers>
  <scm>
    <connection>git://android.googlesource.com/platform/tools/base.git</connection>
    <url>https://android.googlesource.com/platform/tools/base</url>
  </scm>
  <dependencies>
    <dependency>
      <groupId>com.android.tools.build</groupId>
      <artifactId>gradle</artifactId>
      <version>8.0.0-alpha06</version>
    </dependency>
  </dependencies>
</project>

👉 com.android.application.com.android.application.gradle.plugin-8.0.0-alpha06 - Google's Maven Repository hatena-bookmark


Group ID	com.android.library
Artifact ID	com.android.library.gradle.plugin
Version	8.0.0-alpha06
Gradle Groovy DSL	
implementation 'com.android.library:com.android.library.gradle.plugin:8.0.0-alpha06' 
Gradle Kotlin DSL	
implementation("com.android.library:com.android.library.gradle.plugin:8.0.0-alpha06")
Last Updated Date	10/24/2022


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.android.library</groupId>
  <artifactId>com.android.library.gradle.plugin</artifactId>
  <version>8.0.0-alpha06</version>
  <packaging>pom</packaging>
  <description>Gradle plug-in to build Android applications.</description>
  <url>https://developer.android.com/studio/build</url>
  <name>com.android.tools.build.gradle</name>
  <licenses>
    <license>
      <name>The Apache Software License, Version 2.0</name>
      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
      <distribution>repo</distribution>
    </license>
  </licenses>
  <developers>
    <developer>
      <name>The Android Open Source Project</name>
    </developer>
  </developers>
  <scm>
    <connection>git://android.googlesource.com/platform/tools/base.git</connection>
    <url>https://android.googlesource.com/platform/tools/base</url>
  </scm>
  <dependencies>
    <dependency>
      <groupId>com.android.tools.build</groupId>
      <artifactId>gradle</artifactId>
      <version>8.0.0-alpha06</version>
    </dependency>
  </dependencies>
</project>

👉 com.android.library.com.android.library.gradle.plugin-8.0.0-alpha06 - Google's Maven Repository hatena-bookmark

それぞれ、同じ


<dependency>
  <groupId>com.android.tools.build</groupId>
  <artifactId>gradle</artifactId>
  <version>8.0.0-alpha06</version>
</dependency>

となってますので、以下の実装アーティファクトを解決できてるのでしょう。


Group ID	com.android.tools.build
Artifact ID	gradle
Version	8.0.0-alpha06
Gradle Groovy DSL	
implementation 'com.android.tools.build:gradle:8.0.0-alpha06'
Gradle Kotlin DSL	
implementation("com.android.tools.build:gradle:8.0.0-alpha06") 
Last Updated Date	10/24/2022

👉 com.android.tools.build.gradle-8.0.0-alpha06 - Google's Maven Repository hatena-bookmark

よって、'com.android.tools.build:gradle' の記述は、plugin DSL では記述の必要はないのでしょう。

少し古いコードに以下のような記述が見られるのは、プラグインマーカーアーティファクトが公開される前のものだったということで納得できます。


pluginManagement {
  // ...
  resolutionStrategy {
    eachPlugin {
      if(requested.id.namespace == "com.android") {
        useModule("com.android.tools.build:gradle:${requested.version}")
      }
    }
  }

 

■ まとめ

最後に、AndroidStudio のプロジェクトテンプレートを利用して確認します。

例にならって、 New Project から Empty Activity を選択後、 New Module から Android Library を作成します。

【Plugin DSL】'com.android.tools.build:gradle'

以下、Gradle まわりの設定ファイル該当部分です。


// settings.gradle
pluginManagement {
  repositories {
    gradlePluginPortal()
    google()
    mavenCentral()
  }
  repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
  repositories {
    google()
    mavenCentral()
  }

include ':app'
include ':el'


// build.gradle
plugins {
  id 'com.android.application' version '7.3.1' apply false
  id 'com.android.library' version '7.3.1' apply false
  id 'org.jetbrains.kotlin.android' version '1.7.20' apply false


// app/build.gradle
plugins {
  id 'com.android.application'
  id 'org.jetbrains.kotlin.android'
  implementation project(path: ':el')


// el/build.gradle
plugins {
  id 'com.android.library'
  id 'org.jetbrains.kotlin.android'

'com.android.tools.build:gradle' は見当たりませんね!

素晴らしいです、Plugin DSL !!

👉 Jetpack Compose Samples でも使われている「Version catalog update plugin」で libs.versions.toml を書き出してみる hatena-bookmark
👉 今現在 AndroidStudio が推してくる Gradle の設定記述と構成を2年前と比較 - libs.versions.toml, settings.gradle, build.gradle hatena-bookmark


今現在 AndroidStudio が推してくる Gradle の設定記述と構成を2年前と比較 - libs.versions.toml, settings.gradle, build.gradle

「推してくる」ていうか、AndroidStudio で、プロジェクトをシンプルに作ろうとするときのテンプレートの記述がどうなっているか、の話です。

利用した AndroidStudio は、当時と今現在の Stable 最新です。

Build #AI-213.7172.25.2113.9123335, built on September 30, 2022


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.
macOS 12.6
GC: G1 Young Generation, G1 Old Generation
Memory: 2048M
Cores: 16
Registry:
    external.system.auto.import.disabled=true
    ide.text.editor.with.preview.show.floating.toolbar=false
    documentation.show.toolbar=true

Non-Bundled Plugins:
    manjaro.mpb (1.7)
    com.thvardhan.gradianto (4.5)
    com.imuxuan.core.search (1.1)
    com.cursive-ide.emacsplus (0.3.900)
    org.jetbrains.compose.desktop.ide (1.2.0)
    com.developerphil.adbidea (1.6.8)
    com.squareup.sqldelight (1.5.3)
    com.jetbrains.kmm (0.3.4(213-1.7.11-357-IJ)-241)
    GradleDependenciesHelper (1.16)

最も使いやすい「Empty Activity」でプロジェクトを構成したときの、Gradle 設定まわりのファイルがどうなってるかの確認です。

Empty Activity

2020-10-13 と2年後の 2022-10-25 のテンプレートを比較してみます。

👉 benigumocom/EmptyActivity hatena-bookmark

 

■ gradle/libs.versions.toml

2020-10-13 と 2022-10-25 ともに作成されませんでした。

gradle/libs.versions.toml

Version Catalog は、今現在はまだ推されてません。

👉 「⚠ This project uses Gradle Version Catalogs: this tool may not behave as expected.」→ 今現在、Gradle Version Catalog には gradle-versions-plugin が必須では? hatena-bookmark
👉 【Gradle Version Catalog】libs.versions.toml キー名の形式 camelCase vs kebab-case hatena-bookmark
👉 Gradle Version Catalog への書き換えツールを作る【python】 hatena-bookmark

 

■ settings.gradle

2020-10-13


include ':app'
rootProject.name = "EmptyActivity"

2022-10-25


pluginManagement {
  repositories {
    gradlePluginPortal()
    google()
    mavenCentral()
  }
}
dependencyResolutionManagement {
  repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
  repositories {
    google()
    mavenCentral()
  }
}
rootProject.name = "EA"
include ':app'

pluginManagement, dependencyResolutionManagement が新しく使われています。

プラグインやライブラリのリポジトリ指定は、優先順にここに記述するようになっています。

 

■ build.gradle ( root | Project )

2020-10-13


// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
  ext.kotlin_version = "1.4.10"
  repositories {
    google()
    jcenter()
  }
  dependencies {
    classpath "com.android.tools.build:gradle:4.0.2"
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
  }
}

allprojects {
  repositories {
    google()
    jcenter()
  }
}

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

2022-10-25


// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
  id 'com.android.application' version '7.3.1' apply false
  id 'com.android.library' version '7.3.1' apply false
  id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
}

プラグイン、ライブラリの取得先リポジトリの記述がなくなり、

プラグインに関しては、


classpath "{groupId}:{artifactId}:{version}"

の記述から、plugin DSL を利用した


plugins {
  id "{pluginId}" version '{version}' apply false
}

の記述になりました。

{groupId}:{artifactId} から {pluginId} へのの変換は、Gradleプラグインと公開リポジトリの連携で解決されます。

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

あと、task clean(type: Delete) は消えています、不要なのか。

 

■ build.gradle ( module | Module )

2020-10-13


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

android {
  compileSdkVersion 29
  buildToolsVersion "29.0.3"

  defaultConfig {
    applicationId "com.example.emptyactivity"
    minSdkVersion 24
    targetSdkVersion 29
    versionCode 1
    versionName "1.0"

    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  }

  buildTypes {
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
  }
}

dependencies {
  implementation fileTree(dir: "libs", include: ["*.jar"])
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
  implementation 'androidx.core:core-ktx:1.3.2'
  implementation 'androidx.appcompat:appcompat:1.2.0'
  implementation 'androidx.constraintlayout:constraintlayout:2.0.2'
  testImplementation 'junit:junit:4.12'
  androidTestImplementation 'androidx.test.ext:junit:1.1.2'
  androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

}

2022-10-25


plugins {
  id 'com.android.application'
  id 'org.jetbrains.kotlin.android'
}

android {
  namespace 'com.template.ea'
  compileSdk 32

  defaultConfig {
    applicationId "com.template.ea"
    minSdk 28
    targetSdk 32
    versionCode 1
    versionName "1.0"

    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  }

  buildTypes {
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
  kotlinOptions {
    jvmTarget = '1.8'
  }
}

dependencies {

  implementation 'androidx.core:core-ktx:1.7.0'
  implementation 'androidx.appcompat:appcompat:1.5.1'
  implementation 'com.google.android.material:material:1.7.0'
  implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
  testImplementation 'junit:junit:4.13.2'
  androidTestImplementation 'androidx.test.ext:junit:1.1.3'
  androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

apply plugin:Plugin DSL 記述となっています。

あとは、namespace と Java のバージョン指定


namespace 'com.template.ea'


compileOptions {
  sourceCompatibility JavaVersion.VERSION_1_8
  targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
  jvmTarget = '1.8'
}

が追加されています。

 

■ まとめ

大まかに全体的に見て、理解して変更しやすいのですが、気になるのは、


// 2020-10-13
// build.gradle ( root | Project )
classpath "com.android.tools.build:gradle:4.0.2"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

// build.gradle ( module | Module )
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'


// 2022-10-25
// build.gradle ( root | Project )
plugins {
  id 'com.android.application' version '7.3.1' apply false
  id 'com.android.library' version '7.3.1' apply false
  id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
}

// build.gradle ( module | Module )
plugins {
  id 'com.android.application'
  id 'org.jetbrains.kotlin.android'
}

となる変化です。

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

あと、buildSrc や build.gradle.kts は推されてないのでしょうかね。


👉 「⚠ This project uses Gradle Version Catalogs: this tool may not behave as expected.」→ 今現在、Gradle Version Catalog には gradle-versions-plugin が必須では? hatena-bookmark
👉 【Gradle Version Catalog】libs.versions.toml キー名の形式 camelCase vs kebab-case hatena-bookmark
👉 Gradle Version Catalog への書き換えツールを作る【python】 hatena-bookmark