如何在gradle上指定android汇编库文件名 5.1
How to specify android assembled library file name on gradle 5.1
当我从 5.0 更新到 5.1 时,Gradle 改变了它的行为。
假设我们有一个 android 项目,其中包含一个名为 library 的模块。
在 Gradle 5.0(和以前的版本)上,当我执行 ./gradlew assembleRelease
或 ./gradlew assembleDebug
时,生成的输出分别为 library-release.aar
或 library-debug.aar
。
在我更新到 Gradle 5.1 之后(我也试过 5.1.1)它只为任何构建类型生成 library.aar
,输出文件名中没有任何构建类型分类器。
所以我的问题是:如何强制 Gradle 5.1 像以前一样为不同的构建类型设置正确的输出文件命名?下面是我的库模块的build.gradle.kts,但我不认为它有什么问题:
import org.jetbrains.kotlin.config.KotlinCompilerVersion
plugins {
id("com.android.library")
id("kotlin-android")
id("maven-publish")
}
val libraryVersion = "1.5.0"
android {
compileSdkVersion(28)
defaultConfig {
minSdkVersion(16)
targetSdkVersion(28)
versionCode = 1
versionName = libraryVersion
}
lintOptions {
isAbortOnError = false
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
}
}
}
dependencies {
implementation(fileTree(mapOf("include" to listOf("*.jar"), "dir" to "libs")))
implementation(kotlin("stdlib-jdk7", KotlinCompilerVersion.VERSION))
}
更新:
如果我在 build.gradle.kts 中添加以下代码:
afterEvaluate {
android.libraryVariants.forEach { libraryVariant ->
libraryVariant.outputs.forEach { output ->
println(output.outputFile.name)
}
}
}
它将打印:
library-debug.aar
library-release.aar
现在它看起来像是 gradle 5.1
中的错误
正如我们在 https://github.com/gradle/gradle/issues/8328 中看到的那样,这是一个已在 Android Gradle 插件 3.4 中修复的错误。
libraryVariants.all { variant ->
variant.outputs.all { output ->
def filePrefix = "$buildDir/outputs/aar/$archivesBaseName"
outputFileName = "${archivesBaseName}-${version}.aar"
def fileSuffix = "aar"
def originalFile = file("$filePrefix-${variant.buildType.name}.$fileSuffix")
def renamedFile = "$filePrefix-${variant.buildType.name}-$version.$fileSuffix"
tasks.named("assemble").configure {
doLast {
originalFile.renameTo(renamedFile)
}
}
}
}
其中 archivesBaseName
和 version
可以在库的默认块中定义 build.gradle
Gradle 改变了它的行为。
假设我们有一个 android 项目,其中包含一个名为 library 的模块。
在 Gradle 5.0(和以前的版本)上,当我执行 ./gradlew assembleRelease
或 ./gradlew assembleDebug
时,生成的输出分别为 library-release.aar
或 library-debug.aar
。
在我更新到 Gradle 5.1 之后(我也试过 5.1.1)它只为任何构建类型生成 library.aar
,输出文件名中没有任何构建类型分类器。
所以我的问题是:如何强制 Gradle 5.1 像以前一样为不同的构建类型设置正确的输出文件命名?下面是我的库模块的build.gradle.kts,但我不认为它有什么问题:
import org.jetbrains.kotlin.config.KotlinCompilerVersion
plugins {
id("com.android.library")
id("kotlin-android")
id("maven-publish")
}
val libraryVersion = "1.5.0"
android {
compileSdkVersion(28)
defaultConfig {
minSdkVersion(16)
targetSdkVersion(28)
versionCode = 1
versionName = libraryVersion
}
lintOptions {
isAbortOnError = false
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
}
}
}
dependencies {
implementation(fileTree(mapOf("include" to listOf("*.jar"), "dir" to "libs")))
implementation(kotlin("stdlib-jdk7", KotlinCompilerVersion.VERSION))
}
更新:
如果我在 build.gradle.kts 中添加以下代码:
afterEvaluate {
android.libraryVariants.forEach { libraryVariant ->
libraryVariant.outputs.forEach { output ->
println(output.outputFile.name)
}
}
}
它将打印:
library-debug.aar
library-release.aar
现在它看起来像是 gradle 5.1
中的错误正如我们在 https://github.com/gradle/gradle/issues/8328 中看到的那样,这是一个已在 Android Gradle 插件 3.4 中修复的错误。
libraryVariants.all { variant ->
variant.outputs.all { output ->
def filePrefix = "$buildDir/outputs/aar/$archivesBaseName"
outputFileName = "${archivesBaseName}-${version}.aar"
def fileSuffix = "aar"
def originalFile = file("$filePrefix-${variant.buildType.name}.$fileSuffix")
def renamedFile = "$filePrefix-${variant.buildType.name}-$version.$fileSuffix"
tasks.named("assemble").configure {
doLast {
originalFile.renameTo(renamedFile)
}
}
}
}
其中 archivesBaseName
和 version
可以在库的默认块中定义 build.gradle