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

我有一个项目,其中有几个模块,其中一个是一个名为(糟糕)为sdk 的 Android 库。当我构建项目时,它会输出一个名为 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
}

【问题讨论】:

    标签: android gradle android-library


    【解决方案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)
            }
        }
    }
    

    【讨论】:

    【解决方案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")
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多