我正在尝试在build.gradle.kts
AGP 7.0.2 中实现这种结构buildSrc
android {
sourceSets {
main {
pythonLibs.srcDir("src/main/pythonLibs")
}
}
}
就像内置的jniLibs
.
经过一番研究,我从protobuf-gradle-plugin中找到了一个解决方案并转译为 Kotlin (buildSrc/src/main/kotlin/com/example/ExamplePlugin.kt):
abstract class ExamplePlugin : Plugin<Project> {
override fun apply(project: Project) {
addSourceSetExtensions(project)
}
private fun addSourceSetExtensions(project: Project) {
val android = project.extensions.getByType(ApplicationExtension::class.java)
android.sourceSets.forEach {
val name = it.name
val sds = project.objects.sourceDirectorySet(name, "$name Python libs")
(it as ExtensionAware).extensions.add("pythonLibs", sds)
sds.srcDir("src/${name}/pythonLibs")
sds.include("**/*.py", "**/*.so")
}
}
}
但为了让 DSL 按预期工作,应将以下代码添加到buildSrc/src/main/kotlin/com/example/AndroidSourceSetExtension.kt
:
fun com.android.build.api.dsl.AndroidSourceSet.pythonLibs(action: SourceDirectorySet.() -> Unit) {
(this as? ExtensionAware)
?.extensions
?.getByName("pythonLibs")
?.let { it as SourceDirectorySet }
?.apply(action)
}
然后在app/build.gradle.kts
:
import com.example.pythonLibs
android {
...
sourceSets {
getByName("main") {
pythonLibs {
srcDir("src/main/pythonLibs")
}
}
}
}
我还没有测试它是否真的有效。只需运行assembleDebug
没有错误。但
- 它实际上创建了 a
SourceDirectorySet
而不是AndroidSourceDirectorySet
, byproject.objects.sourceDirectorySet
。那么我该如何创建AndroidSourceDirectorySet
呢? - 虽然我已经应用了插件,但我必须导入
com.example.pythonLibs
,所以如何避免这种情况。 - 它仅适用于闭包语法 as
pythonLibs { srcDir() }
,而不适用于val
语法 aspythonLibs.srcDir()
因为我不知道如何使用val
类型成员扩展接口。