AGP 7.1下发布带源码的Android Kotlin库sourceSet引用报错如何解决
问题原因
AGP 7.1.0-beta01 版本中,AndroidSourceSet 未直接公开 kotlin 属性的成员访问,直接调用android.sourceSets["release"].kotlin会触发未找到属性的编译错误。
方案1:同时获取Java+Kotlin全部源码(推荐)
这是兼容性最好的写法,不需要手动区分Java和Kotlin目录,直接获取当前sourceSet下所有已注册的源码目录:
tasks.register<Jar>("androidReleaseSourcesJar", Jar::class) { archiveClassifier.set("sources") // 直接读取release源码集下所有源码目录,自动包含Java、Kotlin路径 from(android.sourceSets["release"].allJava.srcDirs) }
如果你已经在plugins块中引入了kotlin-android插件,也可以用以下写法显式指定两种源码:
tasks.register<Jar>("androidReleaseSourcesJar", Jar::class) { archiveClassifier.set("sources") from(android.sourceSets["release"].java.srcDirs) // 注意kotlin是扩展方法,需要加括号调用 from(android.sourceSets["release"].kotlin.srcDirs()) }
方案2:仅获取Kotlin源码
需要确保你已经在build.gradle.kts的plugins块中引入了kotlin-android插件,写法如下:
import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension tasks.register<Jar>("androidReleaseSourcesJar", Jar::class) { archiveClassifier.set("sources") // 仅读取Kotlin源码目录 from(project.extensions.getByType<KotlinProjectExtension>().sourceSets.getByName("release").kotlin.srcDirs) }
额外优化建议
AGP 7.0+ 已经内置了源码打包的能力,你可以完全删掉自定义的androidReleaseSourcesJar任务,直接在publication中使用内置的源码产出,写法更简洁:
project.afterEvaluate { publishing { publications { register<MavenPublication>("release") { groupId = mGroupId artifactId = mArtifactId version = mVersion from(components["release"]) // 直接引用AGP自动生成的release源码Jar任务,不需要自己手动实现 artifact(tasks.named("releaseSourcesJar")) } } } }
内容的提问来源于stack exchange,提问作者Saran Sankaran
相关产品推荐
相关产品推荐

