Gradle 8.0 插件开发;AndroidComponentsExtension

392 阅读1分钟

标签:Gradle 8.0 插件开发;AndroidComponentsExtension找不到;Transform废弃;ASM

参考资料

  1. 《AndroidComponentsExtension》developer.android.com/reference/t…
  2. 《字节码转换:Android Gradle 插件》blog.sentry.io/bytecode-tr…
  3. github.com/RicardoJian…

1、Transform废弃

Transform废弃在gradle 8.0以上已经被废弃

2、使用AndroidComponentsExtension

首先要确保新建的java-library 的build.gradle的设置是对的,包含相应的com.android.tools.build:gradlegradle-api等库。部分同学说就是找不到AndroidComponentsExtension是以上原因引起的。

举例:

plugins {
    id 'java-library'
    id 'java-gradle-plugin'
    id 'maven-publish'

    alias(libs.plugins.jetbrains.kotlin.jvm)
}

java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

gradlePlugin {
    plugins {
        create("MyTestPlugin") {
            id = 'com.xx.myplugin'
            //插件的包名+类名
            implementationClass = 'com.xx.myplugin.MyPlugin'
        }
    }
}


println("原本的version:" + version)
println("原本的group:" + group)

//设置group
group = 'com.xx.group'
//设置版本号
version = "1.0.0"

println("设置后的group:" + group)
println("设置后的version:" + version)

afterEvaluate {
    publishing {
        // 配置仓库地址
        repositories {
            maven {
                url = uri('../repo')
            }
        }
    }
}


dependencies {
    //Gradle 的核心 API,这包含了 Gradle 的基本功能,如任务声明与执行等。这主要用于开发 Gradle 插件或其他扩展功能。
    implementation(gradleApi())
    //Android 的构建系统,这基于 Gradle,但提供了 Android 开发特有的构建功能,如 APK 打包,资源管理等
    implementation("com.android.tools.build:gradle:8.4.2")
    compileOnly("commons-io:commons-io:2.13.0")
    compileOnly("commons-codec:commons-codec:1.15")
    compileOnly("org.ow2.asm:asm-commons:9.2")
    compileOnly("org.ow2.asm:asm-tree:9.2")
}

然后把包引入设置完毕后,就可以使用AndroidComponentsExtension了:

import com.android.build.api.variant.AndroidComponentsExtension
import com.android.build.api.variant.ApplicationAndroidComponentsExtension
import com.android.build.gradle.AppPlugin
import org.gradle.api.Plugin
import org.gradle.api.Project

class MyPlugin : Plugin<Project> {
    override fun apply(project: Project) {

        //方式1
        val androidComponentsExtension = project.extensions.getByType(AndroidComponentsExtension::class.java)
        
        //方式2
        project.plugins.withType(AppPlugin::class.java) {
            val androidComponentsExtension = project.extensions.getByType(ApplicationAndroidComponentsExtension::class.java)
        }

        //方式3
        project.pluginManager.withPlugin("com.android.application") {
            val androidComponentsExtension = project.extensions.getByType(AndroidComponentsExtension::class.java)
        }
    }
}