在 AGP 8+ 及 9.0 中修改构建 APK 名称的方法

​不小心把项目升到AGP 9.0了,然后一看applicationVariants.all找不到了,看Android官方文档说被androidComponents替换了,换完发现怎么outputs也找不到了,下面的示例又绝口不提怎么修改apk名称,可给我一顿找啊,期间还找到有人提过issues:Renaming APK using new AGP DSL(里面回复这个答案的人也是我),都一个多月了谷歌也没有回复,好嘛,还得我自己来。经过我几天的研究,终于找到了方法(谷歌你坏事做尽啊)

旧版本方法 (AGP 7.0 及更早)

我们都知道,在 AGP 8.0 版本之前,通常通过 applicationVariantsAPI 在 android代码块内进行操作:

bash 复制代码
android {
    ...
    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            outputFileName = "你的应用名_V${variant.versionName}_Build${variant.versionCode}_${variant.buildType.name}.apk"
        }
    }
}

注意:从 AGP 8.0 开始,上述 API 已被废弃。下面的方法是适用于新版本 AGP (8.0+) 的解决方案。

新版本方法 (AGP 8.0+ 及 9.0 DSL)

从 AGP 8.0 开始,官方引入了新的变体 API (androidComponents),并在 AGP 9.0 中进一步优化。以下方法适用于 AGP 8.0 及以上版本。

场景一:仅重命名 APK(不改变输出位置)

如果只需要修改生成的 APK 文件的名称,可以使用以下相对简单的方法:

app/build.gradle.kts

kotlin 复制代码
// 放在最外层,不要放android块里
androidComponents {
    onVariants { variant ->
        variant.outputs.forEach { output ->
            val apkName = "你的应用名_V${output.versionName.get()}_Build${output.versionCode.get()}_${variant.buildType}.apk"
            (output as VariantOutputImpl).outputFileName = apkName
        }
    }
}

场景二:重命名并移动 APK 文件

如果你在重命名后还需要将 APK 文件移动到其他目录,则需要更复杂的逻辑,在构建任务完成后执行文件操作:

app/build.gradle.kts

kotlin 复制代码
import java.nio.file.Files
import java.nio.file.Paths
import java.nio.file.StandardCopyOption

// 放在最外层,不要放android块里
androidComponents {
    onVariants { variant ->
        variant.outputs.forEach { output ->
            val out = output as VariantOutputImpl
            // 等待项目配置完成后,再挂钩任务
            afterEvaluate {
                val capitalizedVariantName = variant.name.replaceFirstChar { it.uppercase() }
                tasks.named("assemble${capitalizedVariantName}") {
                    doLast {
                        // 默认的 APK 输出目录
                        val apkFolder = Paths.get(
                            variant.artifacts.get(
                                com.android.build.api.artifact.SingleArtifact.APK
                            ).get().toString()
                        )
                        // 构建原始文件路径和新文件路径
                        val apkPath = apkFolder.resolve(out.outputFileName.get())
                        val newApkName = "你的应用名_V${out.versionName.get()}_Build${out.versionCode.get()}_${variant.name}.apk"
                        // 我这里仅做复制处理,你也可在此处指定完全不同的目录
                        val newApkPath = apkFolder.resolve(newApkName)
                        Files.move(apkPath, newApkPath, StandardCopyOption.REPLACE_EXISTING)
                    }
                }
            }
        }
    }
}

相关推荐
没有bug.的程序员9 天前
依赖治理之巅:Maven 与 Gradle 依赖树分析内核、冲突判定博弈与工程自愈实战指南
java·gradle·maven·依赖治理·冲突判定·依赖树
没有bug.的程序员12 天前
Gradle 构建优化深度探秘:从 Java 核心到底层 Android 物理性能压榨实战指南
android·java·开发语言·分布式·缓存·gradle
索荣荣24 天前
Gradle全面指南:从入门到精通
java·gradle
onkel in blog1 个月前
【Java】Gradle 多模块项目实战:Spring Boot 微服务搭建全流程
java·spring boot·微服务·gradle
彬sir哥1 个月前
android studio如何把.gradle从C盘移到D盘
android·gradle·maven·android studio
kekegdsz1 个月前
Android构建优化:编译速度从 10 分钟编译到 10 秒
android·性能优化·gradle
码农小卡拉2 个月前
Maven与Gradle选型指南:如何匹配项目的依赖管理需求
java·gradle·maven
小当家.1052 个月前
Maven与Gradle完整对比指南:构建工具深度解析
java·gradle·maven
indexsunny2 个月前
互联网大厂Java面试实战:Spring Boot与微服务在电商场景的应用解析
java·spring boot·redis·微服务·kafka·gradle·maven