Gradle 插件使用和创建方式2

当前as版本

gradle使用的是阿里云的镜像

distributionUrl=https\://mirrors.aliyun.com/macports/distfiles/gradle/gradle-8.14-all.zip

#Thu Dec 11 16:45:07 CST 2025
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
#distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
distributionUrl=https\://mirrors.aliyun.com/macports/distfiles/gradle/gradle-8.14-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

agp和kotlin版本如下(kotlin版2.3.0版本太高,部分插件会不兼容,改成2.2.20)

agp = "8.13.1"
kotlin = "2.2.20"
android-library = { id = "com.android.library", version.ref = "agp" }
android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }

1、新建module 选择Java or Koltin LIbrary 名字取的是build-logic,这里名字是可以随便取的as里面的是buildSrc这个文件夹,可以直接在buildSrc这个模块直接操作,我这边选择的是自己创建一个模块。

2、settings.gradle.kts文件中添加

pluginManagement {
    includeBuild("build-logic")
       ....其它代码
}
新建模块的生成的
include(":build-logic")这里可以直接删除

3、在build-logic里面的build.gradle.kts文件中添加支持

plugins {
    `kotlin-dsl`
}

repositories {
    google()
    mavenCentral()
}


dependencies {
    implementation("com.android.tools.build:gradle:8.13.1")
    implementation("com.android.tools.build:gradle-api:8.13.1")
    implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20")
    //引用hilt才需要加
    implementation("com.google.dagger:hilt-android-gradle-plugin:2.57.2")
}

4、选中build-logic选择build 编译当前模块

编译完成会生成如下文件

5、创建插件文件

        5.1 新建common.gradle.kts文件,里面写一些通用配置当前使用的是

        com.android.library 只能使用在子模块

package com.sun.build_logic

import com.android.build.gradle.LibraryExtension
import org.gradle.api.JavaVersion
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension

class CommonPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        with(project) {
            pluginManager.apply {
                apply("com.android.library")
                apply("org.jetbrains.kotlin.android")
                apply("kotlin-kapt")
                apply("com.google.dagger.hilt.android")
                apply("kotlin-parcelize")
            }
            extensions.configure(LibraryExtension::class.java) {
                compileSdk = 36
                defaultConfig {

                    minSdk = 23
                    targetSdk = 36
                    testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
                }
                buildTypes {
                    release {
                        isMinifyEnabled = false
                        proguardFiles(
                            getDefaultProguardFile("proguard-android-optimize.txt"),
                            "proguard-rules.pro"
                        )
                    }
                }
                compileOptions {
                    sourceCompatibility = JavaVersion.VERSION_17
                    targetCompatibility = JavaVersion.VERSION_17
                }
                // 修正kotlin标签找不到问题
                extensions.configure<KotlinAndroidProjectExtension>("kotlin"){
                    compilerOptions {
                        jvmTarget.set(JvmTarget.JVM_17)
                    }
                }
            }
        }
    }
}

5.2 创建application插件

package com.sun.build_logic

import com.android.build.api.dsl.ApplicationExtension
import com.android.build.gradle.AppExtension
import com.android.build.gradle.api.ApplicationVariant
import org.gradle.api.JavaVersion
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale

class ApplicationPlugin: Plugin<Project>{
    override fun apply(project: Project) {
        with(project) {
            pluginManager.apply {
                apply("com.android.application")
                apply("org.jetbrains.kotlin.android")
                apply("kotlin-kapt")
                apply("com.google.dagger.hilt.android")
                apply("kotlin-parcelize")
            }
            extensions.configure(ApplicationExtension::class.java) {
                namespace = AndroidConfig.APPLICATION_ID
                compileSdk = AndroidConfig.COMPILE_SDK
                defaultConfig {
                    applicationId = AndroidConfig.APPLICATION_ID
                    minSdk = AndroidConfig.MIN_SDK
                    targetSdk = AndroidConfig.TARGET_SDK
                    versionCode = AndroidConfig.VERSION_CODE
                    versionName = AndroidConfig.VERSION_NAME
                    testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

                    buildConfigField("String", "BASE_URL", "\"https://www.wanandroid.com/\"")
                    buildConfigField("boolean", "DEBUG_MODE", "true")
                }
                //如果只启用 V2 签名,应用将无法在 Android 7.0 以下设备上安装
                //V3 签名需要 V2 签名作为基础
                //V4 签名需要 V2 或 V3 签名作为基础
                signingConfigs{
                    create("release") {
                        storeFile =file("../keystore/sun.jks")
                        storePassword = AndroidConfig.STORE_PASSWORD
                        keyAlias = AndroidConfig.KEY_ALIAS
                        keyPassword = AndroidConfig.KEY_PASSWORD
                        // 推荐的签名配置
                        // 启用所有签名方案以确保最大的兼容性和安全性
                        //V1 保证低版本兼容
                        //V2/V3 提供安全性
                        //V4 用于未来的增量更新
                        enableV1Signing = true  // 保证兼容性
                        enableV2Signing = true  // 提高安全性
                        enableV3Signing = true  // 支持密钥轮换
                        enableV4Signing = true  // 优化开发体验
                    }

                    getByName("debug"){
                        storeFile =file("../keystore/sun.jks")
                        storePassword = AndroidConfig.STORE_PASSWORD
                        keyAlias = AndroidConfig.KEY_ALIAS
                        keyPassword = AndroidConfig.KEY_PASSWORD
                        // 推荐的签名配置  开发环境
//                        可以只启用 V1 和 V2
//                                V4 签名主要用于调试时的快速安装
                        enableV1Signing = true  // 保证兼容性
                        enableV2Signing = true  // 提高安全性
//                        enableV3Signing = true  // 支持密钥轮换
//                        enableV4Signing = true  // 优化开发体验
                    }
                }
                buildTypes {
                    release {
                        isMinifyEnabled = false
                        isShrinkResources = false
                        proguardFiles(
                            getDefaultProguardFile("proguard-android-optimize.txt"),
                            "proguard-rules.pro"
                        )
                        signingConfig = signingConfigs.getByName("release")
                        // 构建配置字段
                        buildConfigField("boolean", "DEBUG_MODE", "false")
                    }
                    debug {
                        isDebuggable = true
//                        applicationIdSuffix = ".debug"
//                        versionNameSuffix = "-debug"
                        signingConfig = signingConfigs.getByName("debug")
                        // 构建配置字段
//                        buildConfigField("String", "API_BASE_URL", "\"https://api-dev.example.com/\"")

                    }
                }
                compileOptions {
                    sourceCompatibility = JavaVersion.VERSION_17
                    targetCompatibility = JavaVersion.VERSION_17
                }
                // 修正kotlin标签找不到问题
                extensions.configure<KotlinAndroidProjectExtension>("kotlin"){
                    compilerOptions {
                        jvmTarget.set(JvmTarget.JVM_17)
                    }
                }

                // 配置构建特性
                buildFeatures {
//                    viewBinding = true
//                    dataBinding = true
                    buildConfig = true
                }

                flavorDimensions +=listOf("wanandroid")

                productFlavors{
                    create("wanandroid"){
                        dimension = "wanandroid"
                        applicationId = AndroidConfig.APPLICATION_ID
                        versionCode = AndroidConfig.VERSION_CODE
                        versionName = AndroidConfig.VERSION_NAME
//                        applicationIdSuffix = ".wanandroid"
//                        versionNameSuffix = "-wanandroid"
//                        buildConfigField("String", "BASE_URL", "\"https://www.wanandroid.com/\"")
//                        buildConfigField("boolean", "DEBUG_MODE", "true")
                    }
                }
                extensions.configure<AppExtension>("android") {
                    applicationVariants.all {
                        configureVariantOutput(this)
                    }
                }

                // 配置 Lint 选项
                lint {
                    abortOnError = false
                    checkReleaseBuilds = false
                    disable += setOf("MissingTranslation")
                }

                // 配置打包选项
                packagingOptions {
                    resources {
                        excludes += setOf(
                            "META-INF/AL2.0",
                            "META-INF/LGPL2.1",
                            "META-INF/DEPENDENCIES",
                            "META-INF/LICENSE",
                            "META-INF/LICENSE.txt",
                            "META-INF/NOTICE",
                            "META-INF/NOTICE.txt"
                        )
                    }
                }

                // 配置测试选项
                testOptions {
                    unitTests {
                        isIncludeAndroidResources = true
                        isReturnDefaultValues = true
                    }
                }

                // 配置资源选项
//                sourceSets {
//                    getByName("main") {
//                        java.srcDirs("src/main/kotlin")
//                    }
//                    getByName("test") {
//                        java.srcDirs("src/test/kotlin")
//                    }
//                    getByName("androidTest") {
//                        java.srcDirs("src/androidTest/kotlin")
//                    }
//                }
            }
        }
    }

    private fun configureVariantOutput(variant: ApplicationVariant) {
        variant.outputs.all {
            // 获取当前时间戳
            val timestamp = SimpleDateFormat("yyyyMMdd-HHmm", Locale.getDefault()).format(Date())

            // 构建新的 APK 名称
            val apkName = buildString {
                // 应用名称
                append(variant.applicationId.replace(".", "_"))
                append("-")

                // 版本信息
                append("v")
                append(variant.versionName)
                append("-")
                append(variant.versionCode)
                append("-")

                // 构建类型
                append(variant.buildType.name)
                append("-")

                // 时间戳
                append(timestamp)

                // 如果有风味维度,添加风味名称
                variant.flavorName?.takeIf { it.isNotEmpty() }?.let { flavor ->
                    append("-")
                    append(flavor)
                }

                // 添加文件扩展名
                append(".apk")
            }

            // 设置输出文件名
            (this as com.android.build.gradle.internal.api.BaseVariantOutputImpl).outputFileName = apkName
        }
    }

}


6、注册或发布插件,本文只注册插件

plugins {
    `kotlin-dsl`
}

repositories {
    google()
    mavenCentral()
}

//注册插件 方式一  引入时使用使用路径 id("com.sun.build_logic.CommonPlugin")
//gradle.pluginManager.apply("com.sun.build_logic.CommonPlugin")
//gradle.pluginManager.apply("com.sun.build_logic.ApplicationPlugin")

//方式二  引入时使用使用路径 id("common_plugin")
gradlePlugin{
    plugins{
       create("common_plugin"){
           id = "common_plugin"
           implementationClass = "com.sun.build_logic.CommonPlugin"
            version =1.0
       }
       create("application_plugin"){
            id  = "application_plugin"
            implementationClass = "com.sun.build_logic.ApplicationPlugin"
            version =1.0
        }
    }
   
}

dependencies {
    implementation("com.android.tools.build:gradle:8.13.1")
    implementation("com.android.tools.build:gradle-api:8.13.1")
    implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20")
    implementation("com.google.dagger:hilt-android-gradle-plugin:2.57.2")
}

7、引用插件

//applicaion中使用"application_plugin"
plugins {
    id("application_plugin")
    alias(libs.plugins.kotlin.compose)

}
android {
    namespace = "com.sun.wanandroid"
    buildFeatures {
        compose = true
        buildConfig = true
    }
}

dependencies {
    implementation(platform(libs.androidx.compose.bom))
    
    testImplementation(libs.junit)
    androidTestImplementation(libs.androidx.junit)
    androidTestImplementation(libs.androidx.espresso.core)
    androidTestImplementation(platform(libs.androidx.compose.bom))
    androidTestImplementation(libs.androidx.ui.test.junit4)
    debugImplementation(libs.androidx.ui.tooling)
    debugImplementation(libs.androidx.ui.test.manifest)
}


//模块内使用"common_plugin"
import com.sun.build.AndroidConfig
import org.jetbrains.kotlin.gradle.dsl.JvmTarget

plugins {
    id("common_plugin")
    alias(libs.plugins.kotlin.compose)
}

android {
    namespace = "com.sun.module_category"
    buildFeatures {
        compose = true
    }
}

dependencies {
    testImplementation(libs.junit)
    androidTestImplementation(libs.androidx.junit)
    androidTestImplementation(libs.androidx.espresso.core)
}

8、编译运行查看结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值