Guava minSdk 不是问题,除非我影子库

问题描述 投票:0回答:1

我正在开发一个公共库,我需要隐藏一些依赖项,以便库的使用者不会发生冲突。我正在努力将番石榴添加到其中。当我直接添加 Guava 时,我没有遇到任何问题,但是当我跟踪它时,我收到一个 D8 错误,抱怨 minSdk 版本。

主要构建.gradle.kts:

plugins {
    id("com.android.library")
}

android {
    namespace = "my.namespace"
    compileSdk = 34
    defaultConfig {
        minSdk = 16
    }
}

dependencies {
    implementation(project(path = ":Shadow-Module", configuration = "shadow"))
}

Shadow-Module 的 build.gradle.kts:

import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar

plugins {
    id("java")
    id("com.github.johnrengelman.shadow") version "8.1.1"
}

val shadowJar = tasks.named<ShadowJar>("shadowJar") {
    isEnableRelocation = true
    relocationPrefix = "my.namespace.shadow"
}

dependencies {
    implementation("com.google.guava:guava:33.1.0-android")
}

我得到的错误:

AGPBI: {"kind":"error","text":"MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O (--min-api 26): Lmy/namespace/shadow/com/google/common/hash/Hashing$Crc32cMethodHandles;newCrc32c()Ljava/util/zip/Checksum;","sources":[{"file":"~/.gradle/caches/transforms-4/ddfd1a8942a2e6d1a88e6eb87139afdd/transformed/jetified-Shadow-Module-all.jar"}],"tool":"D8"}

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':My-SDK:mergeDexAppDebugAndroidTest'.
> Could not resolve all files for configuration ':My-SDK:appDebugAndroidTestRuntimeClasspath'.
   > Failed to transform Shadow-Modules-all.jar (project :Shadow-Modules) to match attributes {artifactType=android-dex, dexing-component-attributes=ComponentSpecificParameters(minSdkVersion=16, debuggable=true, enableCoreLibraryDesugaring=false, enableGlobalSynthetics=false, enableApiModeling=false, dependenciesClassesAreInstrumented=false, asmTransformComponent=null, useJacocoTransformInstrumentation=false, enableDesugaring=true, needsClasspath=true, useFullClasspath=false, componentIfUsingFullClasspath=null), org.gradle.libraryelements=jar, org.gradle.usage=java-runtime}.
      > Execution failed for DexingWithClasspathTransform: ~/.gradle/caches/transforms-4/ddfd1a8942a2e6d1a88e6eb87139afdd/transformed/jetified-Shadow-Module-all.jar.
         > Error while dexing.
           Increase the minSdkVersion to 26 or above.

增加 minSdkVersion 不是一个选择。

那么为什么 D8 在 Guava 的影子版本上失败,而在非影子版本上却失败呢?我该如何解决这个问题?

android guava shadowjar
1个回答
0
投票

我认为这里的问题并不是我们(Guava)添加了

MethodHandle
的用法,而是更多的是(你的用法?)Shadow插件请求Guava的JRE风格而不是Android味道。 (它的请求会覆盖您对
33.1.0-android
的明确请求。)如果没有该请求,您会没事的,因为我们仅将
MethodHandle
的用法添加到了 JRE 风格

我对 Gradle 的了解还不够,无法在我尝试的 15 分钟内找到合适的解决方案。我希望 Shadow 插件使用某种配置,您可以使用它来告诉它面向 Android 而不是 Java。 (但也许 shadow#605 表明它可能不会?请参阅 shadow#908。)如果失败,您可以使用您自己的环境属性或解析策略规范来覆盖 Shadow 插件的请求,使用一个我们的 32.1.0 发行说明中给出的策略。

抱歉给您带来麻烦。自动使用 Guava 的 JRE 风格对于为其设置的构建来说很好,但事实证明对于更复杂的构建来说这是一个问题:(

(感谢您在适当的时候注意给番石榴遮荫!)

© www.soinside.com 2019 - 2024. All rights reserved.