首页 > 解决方案 > 如何在 AGP 7.x 中定义新的 sourceSet 类型

问题描述

我正在尝试在build.gradle.ktsAGP 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没有错误。但

  1. 它实际上创建了 aSourceDirectorySet而不是AndroidSourceDirectorySet, by project.objects.sourceDirectorySet。那么我该如何创建AndroidSourceDirectorySet呢?
  2. 虽然我已经应用了插件,但我必须导入com.example.pythonLibs,所以如何避免这种情况。
  3. 它仅适用于闭包语法 as pythonLibs { srcDir() },而不适用于val语法 aspythonLibs.srcDir()因为我不知道如何使用val类型成员扩展接口。

标签: androidgradlegradle-pluginkotlin-dsl

解决方案


推荐阅读