在新的Android插件3.0.0-alpha1中重命名输出文件
我在上一个gradle插件中使用了它,它工作得很好在新的Android插件3.0.0-alpha1中重命名输出文件,android,android-gradle-plugin,Android,Android Gradle Plugin,我在上一个gradle插件中使用了它,它工作得很好 applicationVariants.all { v -> v.outputs.each { output -> output.outputFile = new File( output.outputFile.parent, output.outputFile.name.replace("app-release.apk", "companyName-app-v${varian
applicationVariants.all { v ->
v.outputs.each { output ->
output.outputFile = new File(
output.outputFile.parent,
output.outputFile.name.replace("app-release.apk", "companyName-app-v${variant.versionName}.apk"))
}}
最近更新到3.0.0-alpha1时,显示错误
我读了链接,但找不到错误的确切来源
是否有我所缺少的解决方案?问题似乎已经存在,答案是目前不支持它,但将为此引入新的API。要更改APK名称,您可以将其更改为:
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "companyName-app-v${variant.versionName}.apk"
}
}
如果使用each()遍历变量对象,则需要
开始使用all()。这是因为each()只遍历
配置期间已存在的对象-但
对象在配置新模型时不存在。然而,
all()通过在添加对象时拾取对象来适应新模型
在执行期间
我在金丝雀3号上,这对我有用。但是看到ABI的名字了吗?我不知道在新结构中从何处获取ABI,所以从默认名称中提取了它(sucks)。如果有人知道在使用splits(更改每个ABI的版本代码)时获取ABI名称的更好方法,我很乐意听到。也许是时候发布一个单独的问题了。无论如何,这在prod-APK构建上是有效的
def ext = rootProject.extensions.getByName("ext")
ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'x86': 8]
android.applicationVariants.all { variant ->
if (variant.buildType.name != "debug") {
variant.outputs.all { vOutput ->
// there has got to be a better way to get the ABI name than this kludge
def nameTokens = vOutput.name.split("-");
def abiName = nameTokens[1]
abiName = nameTokens[2].contains("v7a") ? abiName + "-v7a" : abiName
def versionNumber = ext.versionCodes.get(abiName) * 1000 + variant.versionCode
def newApkName = "${getAppName()}-${variant.flavorName}-${variant.versionName}-${versionNumber}.apk"
outputFileName = newApkName
}
}
}
分别使用armeabi-v7a和x86 ABI为versionCode 1、versionName“1.0.0”的“构建APK”生成的结果文件名:
AppName-Prod-1.0.0-2001.apk
AppName-Prod-1.0.0-8001.apk
在新设置中,我找不到任何关于ABI名称的文档。获取它们的旧方法显然已被打破:-)我阅读了链接,但我只是想知道是否有其他方法可以实现同样的效果。如果有其他API可以帮助我完成这项任务,我很乐意知道。现在看来,对于不太简单的项目来说,唯一正确的方法是使用旧版本,并在它变得更成熟后开始使用新版本。目前正在这样做。尽管这是官方文档所说的,它不起作用。仔细查看variant.outputs会返回com.android.build.gradle.api.BaseVariantOutput类型的集合,而不是DefaultDomainObjectCollection,因此无法对其应用all闭包。