Skip to content

产物重命名与拷贝

在构建完成后,我们经常需要将生成的 APK 或 AAR 自动拷贝到指定目录,或者根据版本号动态修改文件名。

1. 产物重命名

通过修改 applicationVariants 的输出属性实现。

kotlin
android {
    applicationVariants.all {
        val variant = this
        variant.outputs.all {
            val output = this as com.android.build.gradle.internal.api.BaseVariantOutputImpl
            // 获取当前日期
            val date = java.text.SimpleDateFormat("yyyyMMdd").format(java.util.Date())
            // 组装文件名:AppName_v1.0_release_20240225.apk
            val newName = "MyApp_v\${variant.versionName}_\${variant.name}_\${date}.apk"
            output.outputFileName = newName
        }
    }
}

2. 自动拷贝产物 (Task 挂载)

如果你希望在编译完成后,自动将 APK 拷贝到项目的 outputs/ 目录或桌面。

kotlin
val copyApkTask = tasks.register<Copy>("copyReleaseApk") {
    group = "publishing"
    description = "拷贝生成的 APK 到发布目录"

    // 源文件:编译生成的 AAB 或 APK 目录
    from(layout.buildDirectory.dir("outputs/bundle/release"))
    // 目标目录
    into(rootProject.layout.projectDirectory.dir("release_history"))
    
    include("*.aab")
}
kotlin
// 确保在 bundleRelease 任务完成后自动执行拷贝
tasks.named("bundleRelease") {
    finalizedBy(copyApkTask)
}

3. 清理旧产物

在打包前自动清理之前的历史记录。

kotlin
tasks.register<Delete>("cleanHistory") {
    delete(rootProject.layout.projectDirectory.dir("release_history"))
}

// 让 clean 任务依赖这个自定义清理任务
tasks.named("clean") {
    dependsOn("cleanHistory")
}

4. 专家技巧:使用 Provider 避免路径硬编码

在编写拷贝逻辑时,应优先使用 layout.buildDirectory 等 API,而不是手动拼接 "build/outputs/..." 字符串,以确保代码在不同的机器和 Gradle 版本下都能正常工作。