Arc*_*nes 16 android gradle android-gradle-plugin android-app-bundle
因此,要在gradle android中更改生成的APK文件名,我可以执行以下操作:
applicationVariants.output.all {
outputFileName = "the_file_name_that_i_want.apk"
}
Run Code Online (Sandbox Code Playgroud)
生成的App Bundle文件有类似的东西吗?如何更改生成的App Bundle文件名?
小智 29
你可以使用这样的东西:
defaultConfig {
applicationId "com.test.app"
versionCode 1
versionName "1.0"
setProperty("archivesBaseName", applicationId + "-v" + versionCode + "(" + versionName + ")")
}
Run Code Online (Sandbox Code Playgroud)
Dav*_*jak 16
作为Martin Zeitlers的一种更通用的方式,回答以下内容将侦听添加的任务,然后为任何添加的任务插入重命名任务bundle*.
只需将其添加到build.gradle文件的底部即可.
注意:它将添加超出必要的任务,但这些任务将被跳过,因为它们与任何文件夹都不匹配.例如
> Task :app:renameBundleDevelopmentDebugResourcesAab NO-SOURCE
tasks.whenTaskAdded { task ->
if (task.name.startsWith("bundle")) {
def renameTaskName = "rename${task.name.capitalize()}Aab"
def flavor = task.name.substring("bundle".length()).uncapitalize()
tasks.create(renameTaskName, Copy) {
def path = "${buildDir}/outputs/bundle/${flavor}/"
from(path)
include "app.aab"
destinationDir file("${buildDir}/outputs/renamedBundle/")
rename "app.aab", "${flavor}.aab"
}
task.finalizedBy(renameTaskName)
}
}
Run Code Online (Sandbox Code Playgroud)
pet*_*ejl 14
@SaXXuM的解决方案效果很好!重命名工件不需要执行任务。可以setProperty()直接在android {}区块中调用。我更喜欢在文件名中包含:
这就是我在项目中使用它的方式:
构建.gradle:
apply from: "../utils.gradle"
android {
...
setProperty("archivesBaseName", getArtifactName(defaultConfig))
}
Run Code Online (Sandbox Code Playgroud)
utils.gradle:
ext.getArtifactName = {
defaultConfig ->
def date = new Date().format("yyyyMMdd")
return defaultConfig.applicationId + "-" + project.name + "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + "-" + date
}
Run Code Online (Sandbox Code Playgroud)
结果是:
com.example-app-1.2.0-10200000-20191206-release.aab
Run Code Online (Sandbox Code Playgroud)
它适用于 APK 和 AAB。
为什么没有人使用现有的 gradle 任务来实现这一点?
有一个带有该类型的 gradle 任务FinalizeBundleTask,它被称为包生成的最后一步,它正在做两件事:
您所需要做的只是将此任务的“输出”更改为您想要的任何结果。此任务包含一个属性finalBundleFile- 最终 AAB 包的完整路径。
我正在使用它类似的东西:
applicationVariants.all {
outputs.all {
// AAB file name that You want. Falvor name also can be accessed here.
val aabPackageName = "$App-v$versionName($versionCode).aab"
// Get final bundle task name for this variant
val bundleFinalizeTaskName = StringBuilder("sign").run {
// Add each flavor dimension for this variant here
productFlavors.forEach {
append(it.name.capitalizeAsciiOnly())
}
// Add build type of this variant
append(buildType.name.capitalizeAsciiOnly())
append("Bundle")
toString()
}
tasks.named(bundleFinalizeTaskName, FinalizeBundleTask::class.java) {
val file = finalBundleFile.asFile.get()
val finalFile = File(file.parentFile, aabPackageName)
finalBundleFile.set(finalFile)
}
}
}
Run Code Online (Sandbox Code Playgroud)
flavors它与任何、dimensions、 和完美配合buildTypes。没有任何额外的任务,适用于为输出设置的任何路径Toolbar -> Generate signed Bundle,可以为任何flavor.
同时,我找到了一种更好的方法...
// it sets task.finalizedBy for :bundle
tasks.whenTaskAdded { task ->
switch (task.name) {
case 'bundleDebug':
case 'bundleRelease':
task.finalizedBy renameBundle
break
}
}
Run Code Online (Sandbox Code Playgroud)
使用Exec任务(仍然想知道任务的语法如何ant.move):
// it finalizes task :bundle
task renameBundle (type: Exec) {
description "it renames an Android App Bundle"
def bundlePath = rootProject.getProjectDir().getAbsolutePath() + "/${project.name}/build/outputs/bundle/release/"
def baseName = getProperty('archivesBaseName')
def srcFile = "${baseName}.aab"
def dstFile = "${baseName}_renamed.aab"
def stdout = new ByteArrayOutputStream()
def stderr = new ByteArrayOutputStream()
commandLine "mv", "-v", "${srcFile}", "${dstFile}"
workingDir = bundlePath
ignoreExitValue true
standardOutput stdout
errorOutput stderr
doLast {
if (execResult.getExitValue() == 0) {
println ":${project.name}:${name} > ${stdout.toString()}"
} else {
println ":${project.name}:${name} > ${stderr.toString()}"
}
}
}
Run Code Online (Sandbox Code Playgroud)
这样就不会留下任何东西-并且可以将文件移动到任何需要的地方。
| 归档时间: |
|
| 查看次数: |
4216 次 |
| 最近记录: |