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
- com.android.tools.build:gradle:9.2.1
Built-in Kotlin
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.
Runtime dependency on Kotlin Gradle plugin
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.
Upgrade to a higher 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")
}
}
Downgrade to a lower KGP 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

浙公网安备 33010602011771号