android - 如何在 AGP 7.x 中定义新的 sourceSet 类型
问题描述
我正在尝试在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
类型成员扩展接口。
解决方案
推荐阅读
- android - Flutter 运行:任务“:app:processDebugResources”执行失败
- c++ - C99和C++03中空指针定义的区别
- function - 带有闭包的 Haskell 字典功能
- python - 熊猫得到错误的结果时
数字,蟒蛇 - c - Makefile 不推荐使用的语法
- javascript - 反应人生游戏(点击太快时出错)
- python - 在 Python 中,为什么集合运算并集、交集和对称差之间的时间复杂度不同?
- mysql - MySQL:用一个查询选择第一个不属于帮派的成员?
- php - 来自数据库的单选按钮导航
- php - 我的新网站没有显示有什么遗漏/错误?