android - 在用Kotlin编写的自定义插件中访问gradle Android插件

标签 android gradle groovy gradle-plugin gradle-kotlin-dsl

我正在编写一个自定义Gradle插件,该插件应该能够从Android插件访问配置参数。

我当然可以从groovy插件(这是我当前的代码)中做到这一点:

MyPlugin.groovy:

class MyPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.android.applicationVariants.all { variant ->
              variant.registerJavaGeneratingTask( // all the right parameters

我的问题是我不希望插件位于Groovy中,而是希望使用Kotlin。
据我了解,我只需要在Kotlin中键入project.android无效,就需要编写类似于以下内容的内容:
MyPlugin.kt

import com.android.build.gradle.AndroidBasePlugin

class MyPlugin : Plugin<Project> {
    override fun apply(target: Project) {
         val android = target.plugins.findPlugin(AndroidBasePlugin::class.java)
          // and call android here

我的主要问题是导入import com.android.不存在。
我尝试在build.gradle.kts上添加许多不同的依赖项,例如implementation("com.android.tools.build:gradle:3.6.1")示例,但是没有任何东西可以使我对其进行访问。

问题:
  • 是正确的方法吗?

  • 案件:
    (是)2.如何导入和使用它?
    (否)2.什么是正确的方法?

    tl; dr:

    如何在Gradle Kotlin插件中编写project.android.applicationVariants.all { variant ->
    编辑:

    @tim_yates的答案很完美。对谁感兴趣,这是最终代码。

    build.gradle.kts:
    plugins {
        `kotlin-dsl`
    }
    
    repositories {
        mavenCentral()
        jcenter()
        google()
    }
    
    dependencies {
        implementation("com.android.tools.build:gradle:3.6.1")
        ... my other dependencies
    }
    

    包名称/MyPlugin.kt:
    import com.android.build.gradle.AppExtension
    import com.android.build.gradle.api.ApplicationVariant
          (...)
      override fun apply(target: Project) {
        val android = target.extensions.findByType(AppExtension::class.java)
        android?.applicationVariants?.configureEach {
          configureVariant(target, this)
        }
    
      private fun configureVariant(...) { // register my taks there
    }
    

    最佳答案

    您需要的是这样的东西:

            project.extensions.configure<AppExtension>("android") {
                it.applicationVariants.all {
                    it.registerJavaGeneratingTask( // all the right parameters
                }
            }
    

    正如您所说,您将需要com.android.tools.build:gradle依赖项。

    为什么不能被识别,我不确定...您在编写独立插件吗?如果是这样,那么您所拥有的就可以了...如果它是buildSrc文件夹中的嵌入式插件,那么您需要将lib添加到buildSrc构建中

    关于android - 在用Kotlin编写的自定义插件中访问gradle Android插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60776207/

    相关文章:

    java - 返回特定 Activity 而不重新开始它

    gradle - 如何检查gradle是否真正解决了传递POM依赖关系?

    java - 缺少库 - DurationFormatUtils - 我该下载什么

    jenkins - 在 Groovy 中使用分隔符拆分字符串并避免 IndexOutOfBoundsException

    java - rsa 生成的解密文本

    android - 清除 WebView 缓存的 101 种方法 - 所有这些都不起作用

    gradle - azure devops - gradle 身份验证

    android - Gradle 无法解决 Play 服务依赖

    eclipse - Groovy/Grails - 无法解析类

    Android Activity 生命周期在启动新 Activity 时调用两次