Android Gradle plugin Built-in Kotlin

  • com.android.application:com.android.application.gradle.plugin:9.2.1
    • com.android.tools.build:gradle:9.2.1
      • org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.10

ref: AGP 9.0.0 release-notes

Android Gradle plugin 9.0 introduces built-in Kotlin support and enables it by default. That means you no longer have to apply the org.jetbrains.kotlin.android (or kotlin-android) plugin in your build files to compile Kotlin source files. This simplifies the Kotlin integration with AGP, avoids the use of deprecated APIs, and improves performance in some cases.

Therefore, when you upgrade your project to AGP 9.0, you need to also migrate to built-in Kotlin or opt out.

You can also selectively disable built-in Kotlin support for Gradle subprojects that don't have Kotlin sources.

ref: AGP 9.0.0 release-notes

To provide built-in Kotlin support, Android Gradle plugin 9.0 now has a runtime dependency on Kotlin Gradle plugin (KGP) 2.2.10. That means you no longer have to declare a KGP version, and if you use a KGP version lower than 2.2.10, Gradle will automatically upgrade your KGP version to 2.2.10. Likewise, if you use a KSP version lower than 2.2.10-2.0.2, AGP will upgrade it to 2.2.10-2.0.2 to match the KGP version.

To use a higher version of KGP or KSP, add the following to your top-level build file:

buildscript {
    dependencies {
        // For KGP
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:KGP_VERSION")

        // For KSP
        classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin:KSP_VERSION")
    }
}

You can only downgrade the KGP version if you've opted out of built-in Kotlin. This is because AGP 9.0 enables built-in Kotlin by default, and built-in Kotlin requires KGP 2.2.10 or higher.

More

0x01 build script: plugins block

plugins {
    alias(libs.plugins.android.application)
}
kotlin-dsl:/Workspace/MyApplication/app/build.gradle.kts:Project/TopLevel/stage1
// Program
public final class Program
extends ExecutableProgram.StagedProgram {
    public void execute(ExecutableProgram.Host host, KotlinScriptHost<?> kotlinScriptHost) {
        host.setupEmbeddedKotlinFor(kotlinScriptHost);
        try {
            PluginRequestCollector pluginRequestCollector = new PluginRequestCollector(kotlinScriptHost.getScriptSource());
            new Build_gradle(kotlinScriptHost, pluginRequestCollector.createSpec(1));
            host.applyPluginsTo(kotlinScriptHost, pluginRequestCollector.getPluginRequests());
        }
        catch (Throwable throwable) {
            host.handleScriptException(throwable, Build_gradle.class, kotlinScriptHost);
        }
        host.applyBasePluginsTo((Project)kotlinScriptHost.getTarget());
        host.evaluateSecondStageOf((ExecutableProgram.StagedProgram)this, kotlinScriptHost, "Project/TopLevel/stage2", HashCode.fromBytes((byte[])new byte[]{117, 77, -45, -77, -10, 77, -1, -90, -26, -92, -84, -80, -100, 100, 22, 62}), host.accessorsClassPathFor(kotlinScriptHost));
    }

    public String getSecondStageScriptText() {
        return "         \n                                           \n \n\nandroid {\n    namespace = \"app.myapplication\"\n    compileSdk {\n        version = release(36) {\n            minorApiLevel = 1\n        }\n    }\n\n    defaultConfig {\n        applicationId = \"app.myapplication\"\n        minSdk = 29\n        targetSdk = 36\n        versionCode = 1\n        versionName = \"1.0\"\n\n        testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n    }\n\n    buildTypes {\n        release {\n            optimization {\n                enable = false\n            }\n        }\n    }\n    compileOptions {\n        sourceCompatibility = JavaVersion.VERSION_11\n        targetCompatibility = JavaVersion.VERSION_11\n    }\n}\n\ndependencies {\n    implementation(libs.androidx.appcompat)\n    implementation(libs.androidx.core.ktx)\n    implementation(libs.material)\n    testImplementation(libs.junit)\n    androidTestImplementation(libs.androidx.espresso.core)\n    androidTestImplementation(libs.androidx.junit)\n}";
    }

    public CompiledScript loadSecondStageFor(ExecutableProgram.Host host, KotlinScriptHost kotlinScriptHost, ProgramId programId, ClassPath classPath) {
        return host.compileSecondStageOf((ExecutableProgram.StagedProgram)this, kotlinScriptHost, programId, ProgramKind.TopLevel, ProgramTarget.Project, classPath);
    }
}

// Build_gradle
@Metadata(mv={2, 2, 0}, k=1, xi=52, d1={"\u0000\u0006\n\u0002\u0018\u0002\n\u0000\u0018\u0000\u00a8\u0006\u0001"}, d2={"LBuild_gradle;", "buildscript"})
public final class Build_gradle
extends CompiledKotlinPluginsBlock {
    final KotlinScriptHost<ExtensionAware> host;
    final PluginDependenciesSpec pluginDependencies;

    public Build_gradle(KotlinScriptHost<? extends ExtensionAware> host, PluginDependenciesSpec pluginDependencies) {
        Intrinsics.checkNotNullParameter(host, "host");
        Intrinsics.checkNotNullParameter(pluginDependencies, "pluginDependencies");
        super(host, pluginDependencies);
        this.host = host;
        this.pluginDependencies = pluginDependencies;
        ((CompiledKotlinPluginsBlock)this).plugins(Build_gradle::_init_$lambda$0);
    }

    public static final void main(String[] args) {
        Intrinsics.checkNotNullParameter(args, "args");
        RunnerKt.runCompiledScript(Build_gradle.class, (String[])args);
    }

    private static final Unit _init_$lambda$0(PluginDependenciesSpecScope $this$plugins) {
        Intrinsics.checkNotNullParameter($this$plugins, "$this$plugins");
        Provider provider = VersionCatalogAccessorsKt.getLibs((PluginDependenciesSpecScope)$this$plugins).getPlugins().getAndroid().getApplication();
        Intrinsics.checkNotNullExpressionValue(provider, "getApplication(...)");
        $this$plugins.alias(provider);
        return Unit.INSTANCE;
    }
}
kotlin-dsl:org.gradle.kotlin.dsl.execution.ResidualProgramCompiler
    private
    fun emitStaticProgram(program: Static) {

        program<ExecutableProgram> {

            overrideExecute {
                emit(program.instructions)
            }
        }
    }

// 0 = {ResidualProgram$Instruction$SetupEmbeddedKotlin@12179} SetupEmbeddedKotlin
// 1 = {ResidualProgram$Instruction$ApplyPluginRequestsOf@25183} ApplyPluginRequestsOf(program=Plugins(fragment=ProgramSourceFragment("plugins {\n    alias(libs.plugins.android.application)\n}")))
// 2 = {ResidualProgram$Instruction$ApplyBasePlugins@24956} ApplyBasePlugins

    private
    fun MethodVisitor.emitSetupEmbeddedKotlinFor() {
        // programHost.setupEmbeddedKotlinFor(scriptHost)
        ALOAD(Vars.ProgramHost)
        ALOAD(Vars.ScriptHost)
        invokeHost("setupEmbeddedKotlinFor", kotlinScriptHostToVoid)
    }

    private
    fun MethodVisitor.emitCompiledPluginsBlock(program: Program.Plugins) {

        val compiledPluginsBlock = compilePlugins(program)        // Build_gradle

        compiledScriptClassInstantiation(compiledPluginsBlock) {

            /*
             * val collector = PluginRequestCollector(kotlinScriptHost.scriptSource)
             */
            emitPluginRequestCollectorInstantiation()

            // ${compiledPluginsBlock}(collector.createSpec(lineNumber))
            NEW(compiledPluginsBlock)
            ALOAD(Vars.ScriptHost)
            emitPluginRequestCollectorCreateSpecFor(program)
            INVOKESPECIAL(
                compiledPluginsBlock,
                "<init>",
                "(Lorg/gradle/kotlin/dsl/support/KotlinScriptHost;Lorg/gradle/plugin/use/PluginDependenciesSpec;)V"
            )

            emitApplyPluginsTo()
        }
    }

    private
    fun MethodVisitor.emitApplyBasePluginsTo() {
        ALOAD(Vars.ProgramHost)
        loadTargetOf(Project::class)
        invokeHost(
            "applyBasePluginsTo",
            "(Lorg/gradle/api/Project;)V"
        )
    }
kotlin-dsl:org.gradle.kotlin.dsl.execution.Interpreter$ProgramHost
        override fun setupEmbeddedKotlinFor(scriptHost: KotlinScriptHost<*>) {
            host.setupEmbeddedKotlinFor(scriptHost)
        }

        override fun applyPluginsTo(scriptHost: KotlinScriptHost<*>, pluginRequests: PluginRequests) {
            host.applyPluginsTo(scriptHost, pluginRequests)
        }

        override fun applyBasePluginsTo(project: Project) {
            host.applyBasePluginsTo(project as ProjectInternal)
        }
kotlin-dsl:org.gradle.kotlin.dsl.provider.StandardKotlinScriptEvaluator$InterpreterHost
        override fun setupEmbeddedKotlinFor(scriptHost: KotlinScriptHost<*>) {
            setupEmbeddedKotlinForBuildscript(scriptHost.scriptHandler)
        }

        override fun applyPluginsTo(scriptHost: KotlinScriptHost<*>, pluginRequests: PluginRequests) {
            pluginRequestsHandler.handle(
                pluginRequests,
                scriptHost.scriptHandler as ScriptHandlerInternal,
                scriptHost.target as PluginAwareInternal,
                scriptHost.targetScope
            )
        }

        override fun applyBasePluginsTo(project: ProjectInternal) {
            kotlinScriptBasePluginsApplicator
                .apply(project)              // KotlinScriptBasePlugin [task: kotlinDslAccessorsReport]
        }
host.setupEmbeddedKotlinFor(kotlinScriptHost)
// org.gradle.kotlin.dsl.provider.StandardKotlinScriptEvaluator$InterpreterHost
        override fun setupEmbeddedKotlinFor(scriptHost: KotlinScriptHost<*>) {
            setupEmbeddedKotlinForBuildscript(scriptHost.scriptHandler)
        }

// org.gradle.kotlin.dsl.provider.StandardKotlinScriptEvaluator
    private
    fun setupEmbeddedKotlinForBuildscript(scriptHandler: ScriptHandler) {
        embeddedKotlinProvider.pinEmbeddedKotlinDependenciesOn(
            scriptHandler.dependencies,
            "classpath"
        )
    }


// org.gradle.kotlin.dsl.support.EmbeddedKotlinProvider
    internal
    fun pinEmbeddedKotlinDependenciesOn(
        dependencies: DependencyHandler,
        configuration: String
    ) {
        embeddedKotlinVersions.forEach { (module, version) ->
            dependencies.constraints.add(configuration, module).apply {
                version { strictly(version) }
                because("Pinned to the embedded Kotlin")
            }
        }
    }

    private
    val embeddedKotlinVersions by lazy {
        uncheckedCast<Map<String, String>>(
            Properties().apply {
                EmbeddedKotlinProvider::class.java
                    .classLoader
                    .getResourceAsStream("gradle-kotlin-dsl-embedded-kotlin.properties")
                    .use { input ->
                        load(input)
                    }
            }
        )
    }

// gradle-9.4.1/lib/gradle-kotlin-dsl-9.4.1.jar!/gradle-kotlin-dsl-embedded-kotlin.properties
org.jetbrains.kotlin\:kotlin-reflect=2.3.0
org.jetbrains.kotlin\:kotlin-stdlib=2.3.0
org.jetbrains\:annotations=13.0
host.applyPluginsTo(kotlinScriptHost, pluginRequestCollector.getPluginRequests());
// org.gradle.kotlin.dsl.provider.StandardKotlinScriptEvaluator$InterpreterHost
        override fun applyPluginsTo(scriptHost: KotlinScriptHost<*>, pluginRequests: PluginRequests) {
            host.applyPluginsTo(scriptHost, pluginRequests)
        }

// org.gradle.kotlin.dsl.provider.StandardKotlinScriptEvaluator
        // arg: pluginRequests: "[id: 'com.android.application', version: '9.2.1']"
        override fun applyPluginsTo(scriptHost: KotlinScriptHost<*>, pluginRequests: PluginRequests) {
            pluginRequestsHandler.handle(
                pluginRequests,
                scriptHost.scriptHandler as ScriptHandlerInternal,
                scriptHost.target as PluginAwareInternal,
                scriptHost.targetScope
            )
        }

// plugin-use: org.gradle.plugin.use.internal.DefaultPluginRequestApplicator
    public void applyPlugins(PluginRequests requests, final ScriptHandlerInternal scriptHandler, @Nullable final PluginManagerInternal target, final ClassLoaderScope classLoaderScope) {}

// plugin-use: org.gradle.plugin.use.resolve.internal.ClassPathPluginResolution
    public void applyTo(PluginManagerInternal pluginManager) {
        pluginManager.apply(plugin);
    }

0x02 Android Gradle plugin (com.android.application)

dependencies
\--- com.android.application:com.android.application.gradle.plugin:9.2.1
     \--- com.android.tools.build:gradle:9.2.1
          +--- com.android.tools.build:gradle-settings-api:9.2.1
          |    +--- org.jetbrains.kotlin:kotlin-stdlib:2.2.10
          |    |    +--- org.jetbrains:annotations:13.0 -> 23.0.0
          |    |    +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0 -> 2.2.10 (c)
          |    |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0 -> 2.2.10 (c)
          |    \--- com.android.tools.build:gradle-common-api:9.2.1
          |         +--- org.jetbrains.kotlin:kotlin-stdlib:2.2.10 (*)
          |         +--- com.android.tools.build:gradle-api:9.2.1 (c)
          |         \--- com.android.tools.build:gradle-settings-api:9.2.1 (c)
          +--- com.android.tools:sdk-common:32.2.1
          |    +--- com.android.tools.analytics-library:shared:32.2.1
          |    |    +--- com.android.tools.analytics-library:protos:32.2.1
          |    |    |    \--- com.google.protobuf:protobuf-java:3.25.5
          |    |    +--- com.android.tools:annotations:32.2.1
          |    |    +--- com.android.tools:common:32.2.1
          |    |    |    +--- com.android.tools:annotations:32.2.1
          |    |    |    +--- com.google.guava:guava:33.3.1-jre
          |    |    |    |    +--- com.google.guava:failureaccess:1.0.2
          |    |    |    |    +--- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
          |    |    |    |    +--- com.google.code.findbugs:jsr305:3.0.2
          |    |    |    |    +--- org.checkerframework:checker-qual:3.43.0
          |    |    |    |    +--- com.google.errorprone:error_prone_annotations:2.28.0
          |    |    |    |    \--- com.google.j2objc:j2objc-annotations:3.0.0
          |    |    |    +--- net.java.dev.jna:jna-platform:5.6.0
          |    |    |    |    \--- net.java.dev.jna:jna:5.6.0
          |    |    |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.10
          |    |    |         +--- org.jetbrains.kotlin:kotlin-stdlib:2.2.10 (*)
          |    |    |         \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.2.10
          |    |    |              \--- org.jetbrains.kotlin:kotlin-stdlib:2.2.10 (*)
          |    |    +--- com.google.code.gson:gson:2.11.0
          |    |    |    \--- com.google.errorprone:error_prone_annotations:2.27.0 -> 2.28.0
          |    |    +--- com.google.guava:guava:33.3.1-jre (*)
          |    |    +--- net.java.dev.jna:jna-platform:5.6.0 (*)
          |    |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.10 (*)
          |    +--- com.android.tools.build:aapt2-proto:9.2.1-15009934
          |    |    \--- com.google.protobuf:protobuf-java:3.25.5
          |    +--- com.android.tools:common:32.2.1 (*)
          |    +--- com.android.tools.ddms:ddmlib:32.2.1
          |    |    +--- com.android.tools:common:32.2.1 (*)
          |    |    +--- com.google.protobuf:protobuf-java:3.25.5
          |    |    +--- net.sf.kxml:kxml2:2.3.0
          |    |    \--- org.jetbrains:annotations:23.0.0
          |    +--- com.android.tools.layoutlib:layoutlib-api:32.2.1
          |    |    +--- com.android.tools:annotations:32.2.1
          |    |    +--- com.android.tools:common:32.2.1 (*)
          |    |    +--- net.sf.kxml:kxml2:2.3.0
          |    |    \--- org.jetbrains:annotations:23.0.0
          |    +--- com.android.tools:sdklib:32.2.1
          |    |    +--- com.android.tools:repository:32.2.1
          |    |    |    +--- com.android.tools.analytics-library:shared:32.2.1 (*)
          |    |    |    +--- com.android.tools:common:32.2.1 (*)
          |    |    |    +--- com.google.jimfs:jimfs:1.1
          |    |    |    |    \--- com.google.guava:guava:18.0 -> 33.3.1-jre (*)
          |    |    |    +--- org.apache.commons:commons-compress:1.27.1
          |    |    |    |    +--- commons-codec:commons-codec:1.17.1
          |    |    |    |    +--- commons-io:commons-io:2.16.1
          |    |    |    |    \--- org.apache.commons:commons-lang3:3.16.0
          |    |    |    +--- org.glassfish.jaxb:jaxb-runtime:2.3.2
          |    |    |    |    +--- jakarta.xml.bind:jakarta.xml.bind-api:2.3.2
          |    |    |    |    |    \--- jakarta.activation:jakarta.activation-api:1.2.1
          |    |    |    |    +--- org.glassfish.jaxb:txw2:2.3.2
          |    |    |    |    +--- com.sun.istack:istack-commons-runtime:3.0.8
          |    |    |    |    |    \--- jakarta.activation:jakarta.activation-api:1.2.1
          |    |    |    |    +--- org.jvnet.staxex:stax-ex:1.8.1
          |    |    |    |    |    +--- jakarta.activation:jakarta.activation-api:1.2.1
          |    |    |    |    |    \--- jakarta.xml.bind:jakarta.xml.bind-api:2.3.2 (*)
          |    |    |    |    +--- com.sun.xml.fastinfoset:FastInfoset:1.2.16
          |    |    |    |    \--- jakarta.activation:jakarta.activation-api:1.2.1
          |    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.10 (*)
          |    |    |    \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0
          |    |    |         \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0
          |    |    |              +--- org.jetbrains:annotations:23.0.0
          |    |    |              +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0
          |    |    |              |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 (c)
          |    |    |              |    \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 (c)
          |    |    |              \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 -> 2.2.10 (*)
          |    |    +--- com.android.tools:common:32.2.1 (*)
          |    |    +--- com.android.tools:dvlib:32.2.1
          |    |    |    \--- com.android.tools:common:32.2.1 (*)
          |    |    +--- com.android.tools.layoutlib:layoutlib-api:32.2.1 (*)
          |    |    +--- com.google.code.gson:gson:2.11.0 (*)
          |    |    +--- org.apache.commons:commons-compress:1.27.1 (*)
          |    |    +--- org.apache.httpcomponents:httpcore:4.4.16
          |    |    +--- org.apache.httpcomponents:httpmime:4.5.6
          |    |    |    \--- org.apache.httpcomponents:httpclient:4.5.6 -> 4.5.14
          |    |    |         +--- org.apache.httpcomponents:httpcore:4.4.16
          |    |    |         +--- commons-logging:commons-logging:1.2
          |    |    |         \--- commons-codec:commons-codec:1.11 -> 1.17.1
          |    |    \--- org.glassfish.jaxb:jaxb-runtime:2.3.2 (*)
          |    +--- com.google.code.gson:gson:2.11.0 (*)
          |    +--- com.google.guava:guava:33.3.1-jre (*)
          |    +--- com.google.protobuf:protobuf-java:3.25.5
          |    +--- javax.inject:javax.inject:1
          |    +--- net.sf.kxml:kxml2:2.3.0
          |    +--- org.apache.commons:commons-compress:1.27.1 (*)
          |    +--- org.bouncycastle:bcpkix-jdk18on:1.79
          |    |    +--- org.bouncycastle:bcprov-jdk18on:1.79
          |    |    \--- org.bouncycastle:bcutil-jdk18on:1.79
          |    |         \--- org.bouncycastle:bcprov-jdk18on:1.79
          |    +--- org.bouncycastle:bcprov-jdk18on:1.79
          |    +--- org.glassfish.jaxb:jaxb-runtime:2.3.2 (*)
          |    +--- org.jetbrains.kotlin:kotlin-reflect:2.2.10
          |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:2.2.10 (*)
          |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.10 (*)
          +--- com.android.tools:sdklib:32.2.1 (*)
          +--- com.android.tools:repository:32.2.1 (*)
          +--- com.android.tools.ddms:ddmlib:32.2.1 (*)
          +--- com.android.tools.build:aapt2-proto:9.2.1-15009934 (*)
          +--- com.android.tools.build:aaptcompiler:9.2.1
          |    +--- com.android.tools.build:aapt2-proto:9.2.1-15009934 (*)
          |    +--- com.android.tools.layoutlib:layoutlib-api:32.2.1 (*)
          |    +--- com.android.tools:common:32.2.1 (*)
          |    +--- com.google.protobuf:protobuf-java:3.25.5
          |    +--- com.google.guava:guava:33.3.1-jre (*)
          |    \--- org.jetbrains.kotlin:kotlin-stdlib:2.2.10 (*)
          +--- com.android.tools.analytics-library:crash:32.2.1
          |    +--- com.android.tools:annotations:32.2.1
          |    +--- com.google.guava:guava:33.3.1-jre (*)
          |    +--- org.apache.httpcomponents:httpclient:4.5.14 (*)
          |    +--- org.apache.httpcomponents:httpcore:4.4.16
          |    \--- org.apache.httpcomponents:httpmime:4.5.6 (*)
          +--- com.android.tools.analytics-library:shared:32.2.1 (*)
          +--- com.android.tools.lint:lint-model:32.2.1
          |    +--- com.android.tools.build:builder-model:9.2.1
          |    |    +--- com.android.tools:annotations:32.2.1
          |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:2.2.10 (*)
          |    +--- com.android.tools:common:32.2.1 (*)
          |    +--- com.android.tools:repository:32.2.1 (*)
          |    +--- com.android.tools:sdk-common:32.2.1 (*)
          |    +--- com.android.tools:sdklib:32.2.1 (*)
          |    +--- net.sf.kxml:kxml2:2.3.0
          |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.10 (*)
          +--- com.android.tools.lint:lint-typedef-remover:32.2.1
          |    +--- com.android.tools:annotations:32.2.1
          |    +--- com.google.guava:guava:33.3.1-jre (*)
          |    \--- org.ow2.asm:asm:9.9
          +--- androidx.databinding:databinding-compiler-common:9.2.1
          |    +--- androidx.databinding:databinding-common:9.2.1
          |    +--- com.android.databinding:baseLibrary:9.2.1
          |    +--- com.android.tools:annotations:32.2.1
          |    +--- com.android.tools.build.jetifier:jetifier-core:1.0.0-beta10
          |    |    +--- com.google.code.gson:gson:2.8.0 -> 2.11.0 (*)
          |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.3.71 -> 2.2.10 (*)
          |    +--- com.google.code.gson:gson:2.11.0 (*)
          |    +--- com.google.guava:guava:33.3.1-jre (*)
          |    +--- com.googlecode.juniversalchardet:juniversalchardet:1.0.3
          |    +--- com.squareup:javapoet:1.13.0
          |    +--- commons-io:commons-io:2.16.1
          |    +--- org.glassfish.jaxb:jaxb-runtime:2.3.2 (*)
          |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.10 (*)
          +--- androidx.databinding:databinding-common:9.2.1
          +--- com.android.databinding:baseLibrary:9.2.1
          +--- com.android.tools.build:builder-test-api:9.2.1
          |    +--- com.android.tools.ddms:ddmlib:32.2.1 (*)
          |    +--- com.android.tools:annotations:32.2.1
          |    +--- com.android.tools:common:32.2.1 (*)
          |    \--- com.google.guava:guava:33.3.1-jre (*)
          +--- com.android.tools.layoutlib:layoutlib-api:32.2.1 (*)
          +--- com.android.tools.utp:gradle-work-action-api:32.2.1
          |    \--- org.jetbrains.kotlin:kotlin-stdlib:2.2.10 (*)
          +--- org.jetbrains.kotlin:kotlin-stdlib:2.2.10 (*)
          +--- org.apache.httpcomponents:httpmime:4.5.6 (*)
          +--- commons-io:commons-io:2.16.1
          +--- org.ow2.asm:asm:9.9
          +--- org.ow2.asm:asm-analysis:9.9
          |    \--- org.ow2.asm:asm-tree:9.9
          |         \--- org.ow2.asm:asm:9.9
          +--- org.ow2.asm:asm-commons:9.9
          |    +--- org.ow2.asm:asm:9.9
          |    \--- org.ow2.asm:asm-tree:9.9 (*)
          +--- org.ow2.asm:asm-util:9.9
          |    +--- org.ow2.asm:asm:9.9
          |    +--- org.ow2.asm:asm-tree:9.9 (*)
          |    \--- org.ow2.asm:asm-analysis:9.9 (*)
          +--- org.glassfish.jaxb:jaxb-runtime:2.3.2 (*)
          +--- net.sf.jopt-simple:jopt-simple:4.9
          +--- com.android.tools.build:bundletool:1.18.3
          |    +--- com.android.tools.build:aapt2-proto:7.3.0-alpha07-8248216 -> 9.2.1-15009934 (*)
          |    +--- com.google.auto.value:auto-value-annotations:1.6.2
          |    +--- com.google.errorprone:error_prone_annotations:2.3.1 -> 2.28.0
          |    +--- com.google.guava:guava:32.0.1-jre -> 33.3.1-jre (*)
          |    +--- com.google.protobuf:protobuf-java:3.22.3 -> 3.25.5
          |    +--- com.google.protobuf:protobuf-java-util:3.22.3 -> 3.25.5
          |    |    +--- com.google.protobuf:protobuf-java:3.25.5
          |    |    +--- com.google.code.findbugs:jsr305:3.0.2
          |    |    +--- com.google.code.gson:gson:2.8.9 -> 2.11.0 (*)
          |    |    +--- com.google.errorprone:error_prone_annotations:2.18.0 -> 2.28.0
          |    |    +--- com.google.guava:guava:32.0.1-jre -> 33.3.1-jre (*)
          |    |    \--- com.google.j2objc:j2objc-annotations:2.8 -> 3.0.0
          |    +--- com.google.dagger:dagger:2.28.3
          |    |    \--- javax.inject:javax.inject:1
          |    +--- javax.inject:javax.inject:1
          |    +--- org.bitbucket.b_c:jose4j:0.9.5
          |    \--- org.slf4j:slf4j-api:1.7.30
          +--- com.android.tools.build.jetifier:jetifier-core:1.0.0-beta10 (*)
          +--- com.android.tools.build.jetifier:jetifier-processor:1.0.0-beta10
          |    +--- com.android.tools.build.jetifier:jetifier-core:1.0.0-beta10 (*)
          |    +--- org.ow2.asm:asm:8.0.1 -> 9.9
          |    +--- org.ow2.asm:asm-util:8.0.1 -> 9.9 (*)
          |    +--- org.ow2.asm:asm-commons:8.0.1 -> 9.9 (*)
          |    +--- org.jdom:jdom2:2.0.6
          |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.3.71 -> 2.2.10 (*)
          +--- com.squareup:javapoet:1.13.0
          +--- org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.10
          |    +--- org.jetbrains.kotlin:kotlin-gradle-plugin-idea:2.2.10
          |    |    +--- org.jetbrains.kotlin:kotlin-tooling-core:2.2.10
          |    |    \--- org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:2.2.10
          |    +--- org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:2.2.10
          |    |    \--- org.jetbrains.kotlin:kotlin-gradle-plugin-idea:2.2.10 (*)
          |    +--- org.jetbrains.kotlin:kotlin-klib-commonizer-api:2.2.10
          |    |    \--- org.jetbrains.kotlin:kotlin-native-utils:2.2.10
          |    |         +--- org.jetbrains.kotlin:kotlin-util-io:2.2.10
          |    |         \--- org.jetbrains.kotlin:kotlin-util-klib:2.2.10
          |    |              \--- org.jetbrains.kotlin:kotlin-util-io:2.2.10
          |    +--- org.jetbrains.kotlin:kotlin-build-statistics:2.2.10
          |    |    +--- org.jetbrains.kotlin:kotlin-build-tools-api:2.2.10
          |    |    \--- com.google.code.gson:gson:2.11.0 (*)
          |    +--- org.jetbrains.kotlin:kotlin-util-klib-metadata:2.2.10
          |    |    +--- org.jetbrains.kotlin:kotlin-util-io:2.2.10
          |    |    \--- org.jetbrains.kotlin:kotlin-util-klib:2.2.10 (*)
          |    +--- org.jetbrains.kotlin:abi-tools-api:2.2.10
          |    +--- org.jetbrains.kotlin:kotlin-gradle-plugins-bom:2.2.10
          |    |    +--- org.jetbrains.kotlin:kotlin-gradle-plugin-api:2.2.10 (c)
          |    |    +--- org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:2.2.10 (c)
          |    |    +--- org.jetbrains.kotlin:kotlin-gradle-plugin-model:2.2.10 (c)
          |    |    +--- org.jetbrains.kotlin:kotlin-native-utils:2.2.10 (c)
          |    |    +--- org.jetbrains.kotlin:kotlin-tooling-core:2.2.10 (c)
          |    |    +--- org.jetbrains.kotlin:fus-statistics-gradle-plugin:2.2.10 (c)
          |    |    \--- org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.10 (c)
          |    +--- org.jetbrains.kotlin:kotlin-gradle-plugin-api:2.2.10
          |    |    +--- org.jetbrains.kotlin:kotlin-gradle-plugins-bom:2.2.10 (*)
          |    |    +--- org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:2.2.10
          |    |    +--- org.jetbrains.kotlin:kotlin-native-utils:2.2.10 (*)
          |    |    +--- org.jetbrains.kotlin:kotlin-tooling-core:2.2.10
          |    |    \--- org.jetbrains.kotlin:kotlin-build-tools-api:2.2.10
          |    +--- org.jetbrains.kotlin:kotlin-gradle-plugin-model:2.2.10
          |    |    +--- org.jetbrains.kotlin:kotlin-gradle-plugin-api:2.2.10 (*)
          |    |    \--- org.jetbrains.kotlin:kotlin-gradle-plugins-bom:2.2.10 (*)
          |    +--- org.jetbrains.kotlin:fus-statistics-gradle-plugin:2.2.10
          |    |    \--- org.jetbrains.kotlin:kotlin-gradle-plugin-api:2.2.10 (*)
          |    \--- org.jetbrains.kotlin:kotlin-compiler-runner:2.2.10
          |         +--- org.jetbrains.kotlin:kotlin-daemon-client:2.2.10
          |         \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0 -> 1.9.0 (*)
          +--- com.google.protobuf:protobuf-java:3.25.5
          +--- com.google.protobuf:protobuf-java-util:3.25.5 (*)
          +--- com.google.code.gson:gson:2.11.0 (*)
          +--- com.google.crypto.tink:tink:1.7.0
          |    +--- com.google.protobuf:protobuf-java:3.19.3 -> 3.25.5
          |    \--- com.google.code.gson:gson:2.8.9 -> 2.11.0 (*)
          +--- org.tensorflow:tensorflow-lite-metadata:0.2.0
          |    +--- org.checkerframework:checker-qual:2.5.8 -> 3.43.0
          |    \--- com.google.flatbuffers:flatbuffers-java:1.12.0
          +--- com.android.tools.build:builder:9.2.1
          |    +--- com.android.tools.build:builder-model:9.2.1 (*)
          |    +--- com.android.tools.build:builder-test-api:9.2.1 (*)
          |    +--- com.android.tools:sdklib:32.2.1 (*)
          |    +--- com.android.tools:sdk-common:32.2.1 (*)
          |    +--- com.android.tools:common:32.2.1 (*)
          |    +--- com.android.tools.ddms:ddmlib:32.2.1 (*)
          |    +--- com.android:signflinger:9.2.1
          |    |    +--- com.android.tools:annotations:32.2.1
          |    |    +--- com.android.tools.build:apksig:9.2.1
          |    |    \--- com.android:zipflinger:9.2.1
          |    |         \--- com.android.tools:annotations:32.2.1
          |    +--- com.android.tools.analytics-library:protos:32.2.1 (*)
          |    +--- com.android.tools.analytics-library:tracker:32.2.1
          |    |    +--- com.android.tools.analytics-library:protos:32.2.1 (*)
          |    |    +--- com.android.tools.analytics-library:shared:32.2.1 (*)
          |    |    +--- com.android.tools:annotations:32.2.1
          |    |    +--- com.android.tools:common:32.2.1 (*)
          |    |    +--- com.google.guava:guava:33.3.1-jre (*)
          |    |    +--- com.google.protobuf:protobuf-java:3.25.5
          |    |    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.10 (*)
          |    +--- com.android.tools.layoutlib:layoutlib-api:32.2.1 (*)
          |    +--- org.jetbrains.kotlin:kotlin-stdlib:2.2.10 (*)
          |    +--- org.bouncycastle:bcpkix-jdk18on:1.79 (*)
          |    +--- org.bouncycastle:bcprov-jdk18on:1.79
          |    +--- javax.inject:javax.inject:1
          |    +--- org.ow2.asm:asm-commons:9.9 (*)
          |    +--- com.google.code.gson:gson:2.11.0 (*)
          |    +--- com.android.tools.build:manifest-merger:32.2.1
          |    |    +--- com.android.tools:common:32.2.1 (*)
          |    |    +--- com.android.tools:sdklib:32.2.1 (*)
          |    |    +--- com.android.tools:sdk-common:32.2.1 (*)
          |    |    +--- com.google.code.gson:gson:2.11.0 (*)
          |    |    \--- org.jetbrains.kotlin:kotlin-stdlib:2.2.10 (*)
          |    +--- com.android:zipflinger:9.2.1 (*)
          |    +--- com.android.tools.build:apksig:9.2.1
          |    +--- com.android.tools.build:apkzlib:9.2.1
          |    |    +--- com.android.tools.build:apksig:9.2.1
          |    |    +--- com.google.code.findbugs:jsr305:3.0.2
          |    |    +--- com.google.guava:guava:33.3.1-jre (*)
          |    |    +--- org.bouncycastle:bcpkix-jdk18on:1.79 (*)
          |    |    \--- org.bouncycastle:bcprov-jdk18on:1.79
          |    \--- com.squareup:javawriter:2.5.0
          +--- com.android.tools.build:builder-model:9.2.1 (*)
          \--- com.android.tools.build:gradle-api:9.2.1
               +--- com.android.tools.build:builder-test-api:9.2.1 (*)
               +--- com.google.guava:guava:33.3.1-jre (*)
               +--- org.jetbrains.kotlin:kotlin-stdlib:2.2.10 (*)
               +--- com.android.tools.build:gradle-common-api:9.2.1 (*)
               +--- org.ow2.asm:asm:9.9
               +--- org.jetbrains.kotlin:kotlin-gradle-plugin-api:2.2.10 (*)
               \--- com.android.tools.build:gradle:9.2.1 (*)
plugin-id
0 = "com.android.application"
1 = "com.android.library"
2 = "com.android.dynamic-feature"
3 = "com.android.test"
4 = "com.android.instantapp"
5 = "com.android.feature"
plugin-id
org.jetbrains.kotlin.android
com.android.built-in-kotlin
org.jetbrains.kotlin.kapt
com.android.legacy-kapt
org.jetbrains.kotlin.plugin.compose
com.google.devtools.ksp
org.jetbrains.kotlin.multiplatform
com.android.kotlin.multiplatform.library
com.android.application
// com.android.build.gradle
class AppPlugin : BasePlugin() {
  override fun apply(project: Project) {
    super.apply(project)

    project.apply(INTERNAL_PLUGIN_ID)       // com.android.internal.application
  }
}

// com.android.build.gradle
open class BasePlugin : Plugin<Project> {
  override fun apply(project: Project) {
    project.apply(VERSION_CHECK_PLUGIN_ID)  // com.android.internal.version-check
  }
}
com.android.internal.version-check
/**
 * Plugin that only checks the version of Gradle vs our min required version.
 *
 * By extracting this in a separate plugin this helps making sure that this plugin can be instantiated and run its check.
 */
class VersionCheckPlugin : Plugin<Project> 

  companion object {
    // The minimum version of Gradle that this plugin should accept is the version of Gradle
    // whose features the plugin uses, which may be substantially later than the earliest
    // version of Gradle that has all the features that Studio uses directly.
    val GRADLE_MIN_VERSION = GradleVersion.version(SdkConstants.GRADLE_LATEST_VERSION)!!
  }

// (com.android.tools:common:32.2.1) com.android.SdkConstants
com.android.internal.application
package com.android.build.gradle.internal.plugins;

/**
 * Gradle plugin class for 'application' projects, applied on the base application module
 */
public class AppPlugin
        extends AbstractAppPlugin<
                com.android.build.api.dsl.ApplicationExtension,
                ApplicationAndroidComponentsExtension,
                ApplicationVariantBuilder,
                ApplicationVariantDslInfo,
                ApplicationCreationConfig,
                ApplicationVariant>


abstract class AbstractAppPlugin<
  AndroidT : CommonExtension,
  AndroidComponentsT : AndroidComponentsExtension<in AndroidT, in VariantBuilderT, in VariantT>,
  VariantBuilderT : VariantBuilder,
  VariantDslInfoT : VariantDslInfo,
  CreationConfigT : VariantCreationConfig,
  VariantT : Variant,
>
@Inject
constructor(
  registry: ToolingModelBuilderRegistry?,
  componentFactory: SoftwareComponentFactory?,
  listenerRegistry: BuildEventsListenerRegistry?,
  buildFeatures: org.gradle.api.configuration.BuildFeatures,
) :
  BasePlugin<AndroidT, AndroidComponentsT, VariantBuilderT, VariantDslInfoT, CreationConfigT, VariantT>(
    registry!!,
    componentFactory!!,
    listenerRegistry!!,
    buildFeatures,
  )


abstract class BasePlugin<
  AndroidT : CommonExtension,
  AndroidComponentsT : AndroidComponentsExtension<in AndroidT, in VariantBuilderT, in VariantT>,
  VariantBuilderT : VariantBuilder,
  VariantDslInfoT : VariantDslInfo,
  CreationConfigT : VariantCreationConfig,
  VariantT : Variant,
>(
  val registry: ToolingModelBuilderRegistry,
  val componentFactory: SoftwareComponentFactory,
  listenerRegistry: BuildEventsListenerRegistry,
  private val gradleBuildFeatures: org.gradle.api.configuration.BuildFeatures,
) : AndroidPluginBaseServices(listenerRegistry, gradleBuildFeatures), Plugin<Project> 

  override fun apply(project: Project) {
    runAction {
      applyBaseServices(project, gradleBuildFeatures)
      project.pluginManager.apply(AndroidBasePlugin::class.java)      // com.android.base
      pluginSpecificApply(project)
    }
  }
com.android.base
package com.android.build.gradle.api

/**
 * Common plugin applied by all plugins that have a [CommonExtension]
 *
 * The purpose of this no-op plugin is to allow other plugin authors to determine if an Android plugin with a [CommonExtension] was applied.
 *
 * This is tied to the `com.android.base` plugin ID.
 */
class AndroidBasePlugin : Plugin<Project> {
  override fun apply(project: Project) {}
}
BuiltInKotlinServices.initBuiltInKotlinSupportIfRequired
// com.android.build.gradle.internal.plugins
// AppPlugin
//   AbstractAppPlugin
//     BasePlugin
//       apply -> initBuiltInKotlinSupportIfRequired

// com.android.build.gradle.internal.services.BuiltInKotlinServices
fun initBuiltInKotlinSupportIfRequired(project: Project, projectServices: ProjectServices) {
  // Provide built-in Kotlin support when built-in Kotlin is enabled
  if (projectServices.projectOptions.get(BooleanOption.BUILT_IN_KOTLIN)) {                         // android.builtInKotlin
    initBuiltInKotlinSupport(project, projectServices, BuiltInKotlinBooleanOptionEnabled)
  } else {
    project.pluginManager.withPlugin(ANDROID_BUILT_IN_KOTLIN_PLUGIN_ID) {                          // com.android.built-in-kotlin
      initBuiltInKotlinSupport(project, projectServices, BuiltInKotlinPluginApplied)
    }
  }

  // Also provide Kotlin support for test-fixture / screenshot-test components even when built-in
  // Kotlin is disabled
  if (
    projectServices.projectOptions.get(BooleanOption.ENABLE_TEST_FIXTURES_KOTLIN_SUPPORT) ||
      projectServices.projectOptions.get(BooleanOption.ENABLE_SCREENSHOT_TEST)
  ) {
    project.pluginManager.withPlugin(KOTLIN_ANDROID_PLUGIN_ID) {
      initKotlinSupportForTestFixturesOrScreenshotTest(project, projectServices)
    }
  }

  // Built-in Kapt plugin requires built-in Kotlin plugin
  project.pluginManager.withPlugin(ANDROID_BUILT_IN_KAPT_PLUGIN_ID) {
    if (!projectServices.projectOptions.get(BooleanOption.BUILT_IN_KOTLIN)) {
      project.requirePlugin(ANDROID_BUILT_IN_KAPT_PLUGIN_ID, ANDROID_BUILT_IN_KOTLIN_PLUGIN_ID)
    }
  }
}

private fun initBuiltInKotlinSupport(project: Project, projectServices: ProjectServices, reason: BuiltInKotlinServices.AvailabilityReason) {
  failIfIncompatiblePluginsArePresent(project)

  // Apply KotlinBaseApiPlugin
  val kotlinBaseApiPlugin = project.plugins.apply(KotlinBaseApiPlugin::class.java)                 // org.jetbrains.kotlin.gradle.plugin.KotlinBaseApiPlugin

  // Add the `kotlin` extension
  val kotlinAndroidExtension = kotlinBaseApiPlugin.createKotlinAndroidExtension() as KotlinAndroidProjectExtension
  kotlinAndroidExtension.setDefaults(project.name, kotlinBaseApiPlugin.pluginVersion)
  project.extensions.add("kotlin", kotlinAndroidExtension)

  // Create `BuiltInKotlinServices`
  projectServices.initBuiltInKotlinServices(reason)

  // Also provide built-in Kapt support
  initBuiltInKaptSupportIfRequired(project)
}
handleKotlinDependencies
// com.android.build.gradle.internal.plugins
abstract class BasePlugin

  override fun createTasks(project: Project)
    ...
    project.afterEvaluate(
      afterEvaluate {
        variantInputModel.sourceSetManager.runBuildableArtifactsActions()

        configuratorService.recordBlock(ExecutionType.BASE_PLUGIN_CREATE_ANDROID_TASKS, project.path, null) { createAndroidTasks(project) }
      }
    )

  fun createAndroidTasks(project: Project) 
    ...
    // Built-in Kotlin
    val builtInKotlin = builtInKotlinEnabledForProject(projectServices, newExtension)
    handleKotlinSourceSets(project, projectServices, extension.sourceSets, builtInKotlin)
    if (builtInKotlin) {
      handleKotlinDependenciesWithoutVersion(project, projectServices, extension.sourceSets)
      maybeAddKotlinStdlibDependency(project, projectServices, extension.sourceSets)
    }

// package com.android.build.gradle.internal.utils
/**
 * Handles the case where the user adds a Kotlin dependency without a version (b/443037365, b/471410336). In that case, we will set a
 * default version.
 *
 * This is similar to the `kotlin-android` plugin's behavior:
 * https://github.com/JetBrains/kotlin/blob/1cfbb801b77eaf00a7806631d29415dfd40f2fcd/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt#L60-L82
 */
internal fun handleKotlinDependenciesWithoutVersion(
  project: Project,
  projectServices: ProjectServices,
  androidSourceSets: NamedDomainObjectContainer<out AndroidSourceSet>,
) {
  val defaultKotlinVersion = projectServices.builtInKotlinServices.kotlinAndroidProjectExtension.coreLibrariesVersion
  val sourceSetsConfigurations = androidSourceSets.flatMap { it.getConfigurations(project) }

  sourceSetsConfigurations.forEach { configuration ->
    configuration.dependencies.forEach {
      if (it is ExternalDependency && it.group == KOTLIN_GROUP && it.version == null) {
        configuration.dependencyConstraints.add(
          project.dependencies.constraints.create("$KOTLIN_GROUP:${it.name}") { constraint ->
            constraint.version { versionConstraint ->
              // Note: We shouldn't use "versionConstraint.prefer()" because it does
              // not work well with Maven publishing (b/450851465).
              versionConstraint.require(defaultKotlinVersion)
            }
          }
        )
      }
    }
  }
}

/**
 * Adds kotlin-stdlib dependency to the `api` configurations if it's not yet added by the user, and they haven't set
 * `kotlin.stdlib.default.dependency=false` (b/452246814).
 *
 * This is similar to the `kotlin-android` plugin's behavior:
 * - https://youtrack.jetbrains.com/issue/KT-38221
 * - https://github.com/JetBrains/kotlin/blob/fd1d3d967df9eab306bdc9707229bd22a2d5d1c2/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/stdlibDependencyManagement.kt#L105-L111
 */
internal fun maybeAddKotlinStdlibDependency(
  project: Project,
  projectServices: ProjectServices,
  androidSourceSets: NamedDomainObjectContainer<out AndroidSourceSet>,
) {

  fun Configuration.hasKotlinStdlib(): Boolean =
    dependencies.any { it is ExternalDependency && it.group == KOTLIN_GROUP && it.name == KOTLIN_STDLIB }

  fun kotlinStdlibDefaultDependencyProperty(): Boolean? =
    project.providers.gradleProperty("kotlin.stdlib.default.dependency").orNull?.lowercase(Locale.US)?.toBooleanStrictOrNull()

  // If the user has added kotlin-stdlib to one of the configurations of the main source set
  // or if they set `kotlin.stdlib.default.dependency=false`, then do not add kotlin-stdlib
  // automatically
  val mainSourceSet = androidSourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME)
  if (mainSourceSet.getConfigurations(project).any { it.hasKotlinStdlib() } || kotlinStdlibDefaultDependencyProperty() == false) {
    return
  }

  // Otherwise, add kotlin-stdlib to the `api` configuration of the main source set
  val apiConfiguration = project.configurations.getByName(mainSourceSet.apiConfigurationName)
  val defaultKotlinVersion = projectServices.builtInKotlinServices.kotlinAndroidProjectExtension.coreLibrariesVersion
  apiConfiguration.dependencies.add(project.dependencies.create("$KOTLIN_GROUP:$KOTLIN_STDLIB:$defaultKotlinVersion"))
}

0x03 Kotlin Gradle plugin (org.jetbrains.kotlin.<...>)

kotlin-gradle-plugin
// com.android.application:com.android.application.gradle.plugin:9.2.1
//   com.android.tools.build:gradle:9.2.1
//     org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.10
//                          kotlin-gradle-plugin-2.2.10-gradle813.jar

// ref: https://kotlinlang.org/docs/gradle-configure-project.html#apply-the-plugin
//   KGP     2.2.0 , 2.2.10
//   Gradle  7.6.3 , 8.14
//   AGP     7.3.1 , 8.10.0

// ref: https://kotlinlang.org/docs/gradle-plugin-variants.html
//   With Gradle plugin variants, the Kotlin team can ship different 
//   Kotlin Gradle plugin (KGP) variants for different Gradle versions.
//
//   gradle813  < 8.13 and higher >
org.jetbrains.kotlin.gradle.plugin.KotlinBaseApiPlugin
abstract class KotlinBaseApiPlugin : DefaultKotlinBasePlugin(), KotlinJvmFactory

abstract class DefaultKotlinBasePlugin : KotlinBasePlugin

interface KotlinBasePlugin : Plugin<Project>
getKotlinPluginVersion
// org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.10
//                      kotlin-gradle-plugin-2.2.10-gradle813.jar

package org.jetbrains.kotlin.gradle.plugin

abstract class DefaultKotlinBasePlugin : KotlinBasePlugin
    override val pluginVersion: String = getKotlinPluginVersion(logger)
    ...

fun Project.getKotlinPluginVersion() = getKotlinPluginVersion(project.logger)

fun getKotlinPluginVersion(logger: Logger): String {
    if (!kotlinPluginVersionFromResources.isInitialized()) {
        logger.kotlinDebug("Loading version information")
        logger.kotlinDebug("Found project version [${kotlinPluginVersionFromResources.value}]")
    }
    return kotlinPluginVersionFromResources.value
}

val Project.kotlinToolingVersion: KotlinToolingVersion by projectStoredProperty {
    KotlinToolingVersion(getKotlinPluginVersion())
}

private fun loadKotlinPluginVersionFromResourcesOf(any: Any) =
    any.loadPropertyFromResources("project.properties", "project.version")

private val kotlinPluginVersionFromResources = lazy {
    loadKotlinPluginVersionFromResourcesOf(object {})
}


// kotlin-gradle-plugin-2.2.10-gradle813.jar!/project.properties
project.version=2.2.10
kotlin.native.version=2.2.10

 

posted @ 2026-09-07 00:11  UPeRVv  阅读(24)  评论(0)    收藏  举报