AndroidStuidio 指定APK 文件的输出路径和文件名格式
步骤总结
1、编辑build.gradle(Module :app)文件;
2、在 android {……} 结构体·中添加如上方法1、方法2的函数方法;
方法一:使用使用 java.nio.file.Files.copy 方法来完成文件复制操作。
缺点:outputDir (输出文件路径)必须跟完整绝对路径!
💡原因:调试发现def outputDir = new File("E:/SVN/ASProjects/Release")
实际指向了{Gradle_Location}/Release
😝优化:需要跟相对路径,使用
def outputDir = new File(project.rootDir, "../Release")
格式
android {
...
// 指定 APK 输出路径和文件名格式
applicationVariants.all { variant ->
variant.outputs.all {
def appName = "TouchAssistant"
def versionName = variant.versionName
def buildType = variant.buildType.name
def outputDir = new File(project.rootDir, "../Release")
println "目标输出目录: ${outputDir.absolutePath}"
// 创建输出目录
if (!outputDir.exists()) {
if (outputDir.mkdirs()) {
println "成功创建输出目录: ${outputDir.absolutePath}"
} else {
println "无法创建输出目录: ${outputDir.absolutePath}"
}
}
def outputFileName = "${appName}-${versionName}-${buildType}.apk"
// 设置输出文件名
setOutputFileName(outputFileName)
// 获取原输出文件
def originalOutputDir = outputFile.parentFile
// 计算新的输出文件
def newOutputFile = new File(outputDir, outputFileName)
// 如果新的输出目录不存在,则创建它
if (!newOutputFile.parentFile.exists()) {
if (newOutputFile.parentFile.mkdirs()) {
println "成功创建新输出文件的父目录: ${newOutputFile.parentFile.absolutePath}"
} else {
println "无法创建新输出文件的父目录: ${newOutputFile.parentFile.absolutePath}"
}
}
// 在构建完成后将 APK 复制到新位置
variant.assemble.doLast {
try {
java.nio.file.Files.copy(
outputFile.toPath(),
newOutputFile.toPath(),
java.nio.file.StandardCopyOption.REPLACE_EXISTING)
println "成功复制 APK: ${outputFile.absolutePath} -> ${newOutputFile.absolutePath}"
} catch (java.io.IOException e) {
println "复制 APK 失败: ${outputFile.absolutePath} -> ${newOutputFile.absolutePath}: ${e.message}"
}
}
}
}
}
❌方法二 :使用’newOutputFile.text = outputFile.text’复制文件
Error:使用该方法拷贝的文件内容可能不一致,不可用;
因为它是将文件内容作为文本处理,可能会在处理二进制文件(如 APK 文件)时改变文件的编码和格式,导致内容不一致。
我们可以使用 Java NIO 的 Files.copy 方法来进行二进制文件的复制,确保文件内容完整一致。
android {
......
// 在构建完成后将 APK 复制到新位置
variant.assemble.doLast {
try {
newOutputFile.text = outputFile.text //按txt文本复制,存在编码或格式错误问题
} catch (java.io.IOException e) {
println "复制 APK 失败: ${outputFile.absolutePath} -> ${newOutputFile.absolutePath}: ${e.message}"
}
}
}