如何从 Gradle 设置 AAR 输出的名称

Posted

技术标签:

【中文标题】如何从 Gradle 设置 AAR 输出的名称【英文标题】:How to set name of AAR output from Gradle 【发布时间】:2014-09-03 21:37:02 【问题描述】:

我有一个项目,其中有几个模块,其中一个是一个名为(糟糕)为sdkandroid 库。当我构建项目时,它会输出一个名为 sdk.aar 的 AAR。

我无法在 Android 或 Gradle 文档中找到任何允许我更改 AAR 输出名称的内容。我希望它像 Jar 任务那样有一个基本名称 + 版本号,但我不知道如何为 AAR 做同样的事情,因为它的所有配置似乎都隐藏在 android.library 插件中。

在这个阶段重命名模块不是一个选项,并且仍然不会将版本号添加到最终的 AAR。

如何在 Gradle 中更改 com.android.library 生成的 AAR 的名称?

Gradle 解决方案

defaultConfig 
    minSdkVersion 9
    targetSdkVersion 19
    versionCode 4
    versionName '1.3'
    testFunctionalTest true
    project.archivesBaseName = "Project name"
    project.version = android.defaultConfig.versionName

【问题讨论】:

【参考方案1】:

正如下面的 cmets 和另一个答案中所述,这里的原始答案不适用于 Gradle 3+。根据docs,应该可以使用以下内容:

使用 Variant API 来操作变体输出被破坏 新插件。它仍然适用于简单的任务,例如更改 APK 构建时的名称,如下所示:

// If you use each() to iterate through the variant objects,
// you need to start using all(). That's because each() iterates
// through only the objects that already exist during configuration time—
// but those object don't exist at configuration time with the new model.
// However, all() adapts to the new model by picking up object as they are
// added during execution.
android.applicationVariants.all  variant ->
    variant.outputs.all 
        outputFileName = "$variant.name-$variant.versionName.apk"
    

旧答案:

我无法使用 Android Studio 0.8.13 / Gradle 2.1 获得适合我的 archivesBaseName 和版本。虽然我可以在我的 defaultConfig 中设置 archivesBaseName 和 version,但它似乎不会影响输出名称。最后,将以下 libraryVariants 块添加到我的 android 范围最终对我有用:

libraryVariants.all  variant ->
    variant.outputs.each  output ->
        def outputFile = output.outputFile
        if (outputFile != null && outputFile.name.endsWith('.aar')) 
            def fileName = "$archivesBaseName-$version.aar"
            output.outputFile = new File(outputFile.parent, fileName)
        
    

【讨论】:

对我不起作用,因为它说没有 libraryVariants 这样的属性 @Helmisek 尝试改用android.libraryVariants 对 Gradle 4.1 不再有效:developer.android.com/studio/build/…【参考方案2】:

对于带有 Gradle 4 和 Android Plugin for Gradle 3.0.0 的 Android Studio 3,您必须将 qix 的答案更改为以下内容:

android 
...    

    libraryVariants.all  variant ->
        variant.outputs.all  output ->
            if (outputFile != null && outputFileName.endsWith('.aar')) 
                outputFileName = "$archivesBaseName-$version.aar"
            
        
    

【讨论】:

我们把这个放在哪里? 在你的 app/build.gradle 里面的 android 。或者你可以把它放在你的 app/build.gradle 的最后,但是你必须把它命名为 android.libraryVariants.all 适用于 Android Studio 3.1、Gradle 4.4、Gradle 插件 3.1.0【参考方案3】:

就我而言,$version 导致“未指定”,最后我发现 $defaultConfig.versionName 有效。

android 
    ...
    libraryVariants.all  variant ->
        variant.outputs.all 
            outputFileName = "$variant.name-$defaultConfig.versionName.aar"
        
    

【讨论】:

输出文件是“relese-1.0.0.aar”【参考方案4】:

使用 build-plugin 1.5.0 现在可以在 defaultConfig 中使用 archivesBaseName

【讨论】:

这对我有用:setProperty("archivesBaseName", "$archivesBaseName-$versionName")build:gradle:1.5.0,添加到 defaultConfig @frouo 方法适用于最新版本的 Gradle。应该被视为最佳答案!【参考方案5】:

对于最新版本的 Gradle 5+,这是@frouo 答案之后的最佳答案:

defaultConfig 
    ...
    versionName "some-version-name-or-number"
    setProperty("archivesBaseName", "$archivesBaseName-$versionName")
    ...

AAR 扩展将自动添加。

【讨论】:

谢谢!这就是我 gradle 6 所需要的 很好。它在 AS4.1.1 gradle 6.1.1 上运行良好 很好。它在 AS 4.1.2 Gradle 6.8.3 上运行良好 这不会阻止附加变体“debug”或“release”(或其他变体)。【参考方案6】:

除了 qix 回答这里的信息,您还可以通过此方法通过常规字符串添加多个输出路径:

libraryVariants.all  variant ->
        variant.outputs.each  output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.aar')) 
                def fileName = "$archivesBaseName-$version.aar"
                output.outputFile = new File(outputFile.parent, fileName)
                output.outputFile = new File("/home/pepperonas/IdeaProjects/Libraries/Base/testapp/libs", fileName)
            
        
    

(赞成票属于 qix - 由于可读性,我只是将其写为答案)。

【讨论】:

这在最新的 gradle 版本(即 3+)中不再可能【参考方案7】:

使用 Gradle 6+ 和 AGP 4+,允许完全控制名称的替代答案是:

afterEvaluate 
    android.libraryVariants.all  variant ->
        variant.variantData.outputFactory.apkDataList.each  apkData ->
            if (apkData.outputFileName.endsWith('.aar')) 
                apkData.outputFileName = "$project.name-$buildType.name-anything-you-want.aar"
            
        
    

【讨论】:

【参考方案8】:

对于 Gradle 5+:

android.libraryVariants.all  variant ->
    variant.variantData.outputFactory.output.apkDatas.each  apkData ->
        apkData.outputFileName = "YourNewFileName.aar"
    

对于 Gradle 4+:

android.libraryVariants.all  variant ->
    variant.outputs.each  output ->
        output.outputFileName = "YourNewFileName.aar"
    

对于 Gradle 2+ 和 Gradle 3+:

android.libraryVariants.all  variant ->
    variant.outputs.each  output ->
        output.outputFile = new File(file.parent, "YourNewFileName.aar")
    

【讨论】:

以上是关于如何从 Gradle 设置 AAR 输出的名称的主要内容,如果未能解决你的问题,请参考以下文章

使用 Gradle 构建 Android AAR

如何将 AAR 转换为 JAR

Gradle 7.0+ 设置aar路径失败问题

如何发布带有远程依赖项 (gradle) 的 Android 库 (aar)?

选择 Android 库的构建变体的 Gradle 脚本

android studio中使用 aar 和gradle 的配置