产物重命名与拷贝
在构建完成后,我们经常需要将生成的 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 版本下都能正常工作。