Android Studio Groovy迁移至Kotlin DSL完整指南(Gradle 8.6+

6 阅读2分钟

Android Studio Groovy迁移至Kotlin DSL完整指南(Gradle 8.6+)


一、迁移全景路线图

1. 环境准备
   - JDK 17+
   - Android Studio Flamingo 2023.2.1+
   - 网络代理工具(Clash/Charles)

2. 文件转换顺序
   settings.gradle → settings.gradle.kts  
   gradle.properties → 保持原样(需Kotlin兼容处理)  
   build.gradle → build.gradle.kts  
   libs.versions.toml → 新建版本目录  
   gradle-wrapper.properties → 升级至8.6+

3. 验证流程
   阶段验证 → 全量验证 → 性能对比

二、版本目录(Version Catalogs)深度实践

1. 目录结构规范

# gradle/libs.versions.toml
[versions]
agp = "8.3.0"         # Android Gradle Plugin
kotlin = "1.9.20"     # Kotlin版本
coreKtx = "1.12.0"    # AndroidX Core

[libraries]
# 标准格式
androidx-core = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }

# 简写格式
material3 = "androidx.compose.material3:material3:1.1.2"

# 包含分类器
firebase-analytics = { 
  group = "com.google.firebase", 
  name = "firebase-analytics", 
  version = "21.5.0", 
  classifier = "play-services" 
}

[bundles]
compose = [
  "androidx.compose.foundation:foundation",
  "androidx.compose.material3:material3",
  "androidx.compose.ui:ui-tooling-preview"
]

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" }

2. 多环境版本控制

# 通过环境变量切换版本
[versions]
retrofit = { strictly = "[2.9.0, 3.0.0[", prefer = "2.9.0" }

3. 动态版本解析

// build.gradle.kts
dependencies {
    val retrofitVersion = libs.versions.retrofit.get()
    implementation("com.squareup.retrofit2:retrofit:$retrofitVersion")
}

三、仓库配置全维度解析

1. 企业级仓库配置

// settings.gradle.kts
dependencyResolutionManagement {
    repositories {
        // 私有Maven仓库
        maven {
            url = uri("https://nexus.example.com/repository/maven-public/")
            credentials {
                username = providers.gradleProperty("nexusUser").get()
                password = providers.gradleProperty("nexusPassword").get()
            }
            content {
                includeGroup("com.company")
            }
        }

        // 阿里云镜像
        maven { 
            url = uri("https://maven.aliyun.com/repository/public") 
            metadataSources {
                mavenPom()
                artifact()
                ignoreGradleMetadataRedirection()
            }
        }
    }
}

2. 仓库过滤策略

repositories {
    mavenCentral {
        content {
            excludeModule("com.google.guava", "guava")
        }
    }
    google {
        content {
            includeGroupByRegex("androidx\\..*")
        }
    }
}

四、构建脚本迁移详解

1. Android配置完全转换

android {
    namespace = "com.example.app"
    compileSdk = 34

    defaultConfig {
        applicationId = "com.example.app"
        minSdk = 24
        targetSdk = 34
        versionCode = libs.versions.appVersionCode.get().toInt()
        versionName = libs.versions.appVersionName.get()

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables.useSupportLibrary = true
    }

    signingConfigs {
        create("release") {
            storeFile = file("keys/release.jks")
            storePassword = System.getenv("STORE_PASSWORD")
            keyAlias = "releaseKey"
            keyPassword = System.getenv("KEY_PASSWORD")
        }
    }

    buildTypes {
        getByName("debug") {
            applicationIdSuffix = ".debug"
            isDebuggable = true
        }
        getByName("release") {
            signingConfig = signingConfigs.getByName("release")
            isMinifyEnabled = true
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
        isCoreLibraryDesugaringEnabled = true
    }

    kotlinOptions {
        jvmTarget = "17"
        freeCompilerArgs = freeCompilerArgs + listOf(
            "-opt-in=kotlin.ExperimentalStdlibApi",
            "-Xcontext-receivers"
        )
    }

    buildFeatures {
        compose = true
        buildConfig = true
    }

    composeOptions {
        kotlinCompilerExtensionVersion = libs.versions.composeCompiler.get()
    }

    packaging {
        resources {
            excludes += "/META-INF/{AL2.0,LGPL2.1}"
        }
    }
}

2. 依赖管理的20个关键场景

dependencies {
    // 基础依赖
    implementation(libs.androidx.core.ktx)
    
    // Compose全家桶
    implementation(platform(libs.androidx.compose.bom))
    implementation(libs.bundles.compose)
    debugImplementation(libs.androidx.compose.ui.tooling)
    
    // 动态功能模块
    implementation(libs.play.core.ktx)
    
    // 测试依赖
    testImplementation(libs.junit.jupiter.api) {
        exclude(group = "org.hamcrest", module = "hamcrest-core")
    }
    androidTestImplementation(libs.androidx.test.ext.junit)
    
    // 注解处理
    ksp(libs.room.compiler)
    
    // 条件依赖
    if (project.hasProperty("enableAnalytics")) {
        implementation(libs.firebase.analytics)
    }
    
    // 排除传递依赖
    implementation(libs.okhttp) {
        exclude(module = "kotlin-stdlib")
    }
    
    // 强制版本
    configurations.all {
        resolutionStrategy.force(libs.findLibrary("guava").get())
    }
}

五、高级构建场景

1. 自定义APK输出

androidComponents {
    onVariants { variant ->
        variant.outputs.forEach { output ->
            output.outputFileName.set(
                "app-${variant.name}-${variant.versionName}.apk"
            )
        }
    }
}

2. 动态清单修改

tasks.named("processDebugManifest").configure {
    doLast {
        val manifestFile = File(processManifest.manifestOutputDirectory.get().asFile, "AndroidManifest.xml")
        val modifiedContent = manifestFile.readText()
            .replace("android:debuggable=\"false\"", "android:debuggable=\"true\"")
        manifestFile.writeText(modifiedContent)
    }
}

3. 多渠道打包

flavorDimensions += "environment"
productFlavors {
    create("dev") {
        dimension = "environment"
        applicationIdSuffix = ".dev"
        resValue("string", "app_name", "App Dev")
    }
    create("prod") {
        dimension = "environment"
        resValue("string", "app_name", "My App")
    }
}

六、企业级优化方案

1. 构建缓存配置

// settings.gradle.kts
buildCache {
    local {
        directory = File(rootDir, "build-cache")
        removeUnusedEntriesAfterDays = 30
    }
    
    remote<HttpBuildCache> {
        url = uri("https://cache.example.com/gradle/")
        credentials {
            username = "user"
            password = "pass"
        }
    }
}

2. 构建扫描集成

plugins {
    id("com.gradle.build-scan") version "3.16"
}

buildScan {
    termsOfServiceUrl = "https://gradle.com/terms-of-service"
    termsOfServiceAgree = "yes"
    publishAlways()
}

七、迁移验证Checklist

- [ ] 编译通过:./gradlew assembleDebug  
- [ ] 单元测试通过:./gradlew test  
- [ ] 静态分析通过:./gradlew lint  
- [ ] 性能对比:对比新旧构建时间(--profile)  
- [ ] 产物验证:对比APK/Metadata  
- [ ] IDE兼容:Android Studio无红色错误  
- [ ] 增量构建:修改单个文件验证增量编译  
- [ ] 缓存测试:clean后二次构建时间正常  

本教程深度整合Gradle官方文档、Android最佳实践及企业级项目经验,覆盖从基础配置到高阶优化的全场景,建议配合Gradle的--dry-run参数分阶段验证。遇到问题时,可通过./gradlew build --scan生成详细分析报告。