android - Android appbundle:重命名生成的输出文件(.aab)
问题描述
我正在尝试以.aab
格式重命名生成的文件<appname>-<variant>-<buildType>-<version>
,有什么方法可以重命名输出包文件,类似于 apk 重命名。
我尝试过复制和重命名,但问题是我需要将包命名为<appname>-<variant>-<buildType>-<version>
. 当我创建这里提到的任务时如何使用 Gradle 更改 App Bundles 的生成文件名?
获取变体是使用子字符串,它同时提供variantBuildtype
.
解决方案
首先,我想澄清一下构建变体是什么。构建变体是构建类型和风格的组合。例如,构建类型可能是release
,风味可能是freeVersion
. 所以一个变体是releaseFreeVersion
.
.aab
注意:您链接的答案具有创建文件的附加副本而不是仅重命名它的副作用。这个答案也解决了这个问题。
第 1 部分:此答案假设您使用的是产品风味
在这个答案中,我假设您使用的是产品风味。我还将假设您想要的格式是<appname>-<flavor>-<buildType>-<version>
.
首先创建一些补充的 Gradle 方法
您可以将它们添加到build.gradle
文件的底部(所有花括号之外)。
static String firstMatchingSubstring(String taskName, String[] keys) {
def lcName = taskName.toLowerCase()
for(String key: keys) {
if(lcName.contains(key.toLowerCase())) return key
}
return null
}
/**
*
* @param taskName e.g., bundleMyFlavorRelease or bundleRelease
* @return
*/
String getBuildType(String taskName) {
return firstMatchingSubstring(taskName, getBuildTypeNames())
}
/**
*
* @param taskName e.g., bundleMyFlavorRelease
* @return
*/
String getFlavor(String taskName) {
return firstMatchingSubstring(taskName, getProductFlavorNames())
}
String[] getBuildTypeNames() {
def types = []
android.buildTypes.all { type ->
types.add(type.name)
}
return types
}
String[] getProductFlavorNames() {
def flavors = []
android.productFlavors.all { flavor ->
flavors.add(flavor.name)
}
return flavors
}
创建任务以重命名应用程序包
与您在问题中链接的已接受答案类似,我们将插入重命名任务。我对应用程序名称进行了硬编码,但如果您想要使用不同的应用程序名称,可以将它们放在android.defaultConfig
块内,然后引用下面的名称。
tasks.whenTaskAdded { task ->
def name = task.name
//Skip some unnecessary tasks
if (name.startsWith("bundle")
&& !name.contains("Classes")
&& !name.contains("Resources")
&& name != "bundle") {
def renameTaskName = "rename${task.name.capitalize()}Aab"
def version = "${android.defaultConfig.versionName}-${android.defaultConfig.versionCode}"
def flavor = getFlavor(name)
def type = getBuildType(name)
if(flavor == null || type == null) return
def outputName = "AppName-$flavor-$type-$version"
tasks.create(renameTaskName) {
def path = "${rootDir}/app/${flavor}/${type}/"
def originalFile = "$path/app-${flavor}-${type}.aab"
doLast {
if (file("$originalFile").exists()) {
ant.move file: "$originalFile",
tofile: "$path/${outputName}.aab"
}
}
}
task.finalizedBy(renameTaskName)
}
}
第 2 部分:此答案假设您没有使用产品风味
如果您不使用产品风味,那么更简单的东西就像您在问题中链接的已接受答案并进行了一些修改。这将产生一个名称,如<appname>-<buildType>-<version>.aab
.
tasks.whenTaskAdded { task ->
def name = task.name
//Skip some unnecessary tasks
if (name.startsWith("bundle")
&& !name.contains("Classes")
&& !name.contains("Resources")
&& name != "bundle") {
def renameTaskName = "rename${task.name.capitalize()}Aab"
def type = task.name.substring("bundle".length()).uncapitalize()
def version = "${android.defaultConfig.versionName}-${android.defaultConfig.versionCode}"
def outputName = "AppName-$type-$version"
tasks.create(renameTaskName) {
def path = "${rootDir}/app/${type}/"
def originalFile = "$path/app-${type}.aab"
doLast {
if (file("$originalFile").exists()) {
ant.move file: "$originalFile",
tofile: "$path/${outputName}.aab"
}
}
}
task.finalizedBy(renameTaskName)
}
}
推荐阅读
- python - 使用 seglearn 中的决策树对多元时间序列数据进行分类时的解释变量
- c# - Xamarin - 可滚动的微型列表
- visual-studio-code - VSCode:如何更改参数提示的延迟?
- docker - Docker:如何更改卷的挂载点?
- android - 在 Xamarin 表单运行时启用电话权限而不提醒用户启用
- datetime - Flutter 如何在“共享”偏好设置中保存我的日期
- angular - mat-button-toggle 默认值返回 null 或 "" insted 值
- python - 在 groupby 之后过滤行并应用函数
- python - 从 DockerFile 修改 Python 脚本
- python - 如何编写根据传递的 pandas 列 dtype 行为不同的通用函数