当前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、编译运行查看结果。
5861

被折叠的 条评论
为什么被折叠?



