首先我想澄清一下什么是构建变体。
构建变体是构建类型和风格的组合。
例如,构建类型可以是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
}
创建一个任务来重命名应用包
类似于accepted answer you linked in your question,我们将插入一个重命名任务。
我对应用名称进行了硬编码,但如果您想要使用不同的应用名称,可以将它们放在 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 部分:此答案假设您没有使用产品风味
如果您不使用产品风味,则可以使用更简单的东西,例如 accepted answer you linked in your question 并进行一些修改。这将产生一个类似<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)
}
}