在新的Android插件3.0.0-alpha1中重命名输出文件

在新的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

我在上一个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${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闭包。