Android APK工件名称与各自的ABI架构

时间:2017-12-14 07:36:51

标签: android gradle android-gradle

我正在尝试提取并使用工件的体系结构来组成输出文件名:

void defineDefaultVariantsAPK(String appName) {
    defineVariantsAPK({ variant, output ->
        def versionName = variant.versionName
        def versionCode = "-(${variant.versionCode}"
        def buildLetter = variant.buildType.name == "release" ? "-R" : "-D"
        def flavor = variant.productFlavors.size() > 0 ? "-${variant.productFlavors[0].name}" : ""
        def architecture = "-" + output.getFilter(com.android.build.OutputFile.ABI)

        "v${versionName}${versionCode}${buildLetter}${flavor}${architecture}--${appName}.apk"
    })
}

void defineVariantsAPK(Closure nameBuild) {
    android {
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                output.outputFile = new File((String) output.outputFile.parent, nameBuild(variant, output))
            }
        }
    }
}

由于某些原因,许多帖子说这是解决方案,但我的格斗失败了:

> Could not get unknown property 'com' for project ':app' of type org.gradle.api.Project.

我尝试过使用导入:

unable to resolve class com.android.build.OutputFile

配置:

com.android.tools.build:gradle:2.3.3
Gradle version 3.5

所以我真的很想知道,我做的不同之处在于它不起作用吗?

4 个答案:

答案 0 :(得分:2)

此代码对我适用于Gradle 3+(适用于Android)

android.applicationVariants.all { variant ->
    variant.outputs.all { output ->
        def architecture = output.filters[0].identifier
        outputFileName = "myapp-${architecture}-${variant.versionName}.apk"
    }
}

答案 1 :(得分:1)

你在哪里定义这个功能?尝试将它移动到你的app / build.gradle文件,因为这是buildscript所在的位置,gradle将类加载到类路径中。

答案 2 :(得分:1)

使用Gradle 3.0.0进行开始,你可以这样做:

applicationVariants.all { variant ->
    variant.outputs.all { output ->
        def appName = "AppName_"
        def buildType = variant.variantData.variantConfiguration.buildType.name
        def architecture = output.getFilter(com.android.build.OutputFile.ABI)
        def newName
        if (buildType == 'debug') {
            newName = "${appName}debug_${defaultConfig.versionName}_${architecture}.apk"
        } else {
            newName = "${appName}release_${defaultConfig.versionName}_${architecture}.apk"
        }
        outputFileName = newName
    }
}

*将它放在你的模块(app)build.gradle文件中。

答案 3 :(得分:0)

因此,按照@blazsolar的建议,我已将方法移至app build gradle文件,当我尝试添加导入时,移动本身不是解决方案:

import com.android.build.OutputFile

由于某种原因,IDE(Android工作室)决定删除导入..

但是一旦我进口了这个:

import com.android.build.OutputFile.FilterType

很好! 但这不是它的结束......我希望该方法位于一个公共的gradle文件中,我的所有项目都可以重用。

一旦我将最后一次导入添加到公共gradle文件中...导入图像再次消失..

我还没有another question

更新

所以我分别将Android插件和gradle版本更新到3.0.1和4.1,现在......事情发生了变化..现在没有了

com.android.build.OutputFile.FilterType

现在您需要使用:

com.android.build.VariantOutput.ABI

万一有人想知道......