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

时间:2017-05-18 05:07:30

标签: android android-gradle

我在之前的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会显示错误。

我阅读了https://developer.android.com/studio/preview/features/new-android-plugin-migration.html链接,但无法找到确切的错误来源。

我有什么问题可以修复吗?

3 个答案:

答案 0 :(得分:17)

要更改APK名称,您可以将其更改为:

android.applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "companyName-app-v${variant.versionName}.apk"
    }
}
  

如果使用each()迭代变量对象,则需要   开始使用all()。那是因为each()只遍历了   在配置期间已经存在的对象 - 但那些   配置时,对象在新模型中不存在。然而,   all()通过在添加对象时拾取对象来适应新模型   执行期间。

Source

答案 1 :(得分:2)

我在加那利3号,这对我有用。但是看看ABI名称的kludge?我无法弄清楚在新结构中获取ABI的位置,因此将其从默认名称(sucks)中提取出来。如果有人知道在使用分割时获得ABI名称的更好方法(更改每个ABI的versionCode),我很乐意听到。也许是时候发一个单独的问题了。无论如何,这适用于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
        }
    }
}

从"构建APK"生成的结果文件名对于versionCode 1,versionName" 1.0.0"分别使用armeabi-v7a和x86 ABI:

AppName-Prod-1.0.0-2001.apk
AppName-Prod-1.0.0-8001.apk

我无法在新设置中找到ABI名称的任何文档。得到它们的旧方法显然已被打破: - )

答案 2 :(得分:0)

似乎问题已经addressed,答案是目前不支持,但会为其引入新的API。