R8与Android Studio Flamingo中密封类的兼容性

7

当我想要发布我的应用程序时,出现了以下错误:com.android.tools.r8.internal.jb: 生成类文件时不支持密封类作为程序类

  • Android Studio:Flamingo 2022.2.1(我也尝试过2022.3.1 Giraffe)
  • Gradle 版本:8.0(我也尝试过8.1和8.0.2)
  • Gradle 插件版本:8.0.0
  • JDK:17.0.6(Android Studio Flamingo 嵌入式)

在 build.gradle 中,由于 Android Studio 的最小 Gradle 版本限制,我无法编辑编译版本。

compileOptions {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
  }
  kotlinOptions {
    jvmTarget = "17"
  }

我在我的模块中使用的封闭类是
sealed class Resource<out T> {
  object Loading : Resource<Nothing>()
  data class Success<out T : Any>(val data: T?) : Resource<T>()
  data class Error(val exception: Exception) : Resource<Nothing>()
}

fun <T> Resource<T>.onSuccess(callback: (T?) -> Unit): Resource<T> {
  if (this is Resource.Success) {
    callback.invoke(this.data)
  }
  return this
}

fun <T> Resource<T>.onError(callback: (Exception) -> Unit): Resource<T> {
  if (this is Resource.Error) {
    callback.invoke(exception)
  }
  return this
}

fun <T> Resource<T>.onLoading(callback: () -> Unit): Resource<T> {
  if (this is Resource.Loading) {
    callback.invoke()
  }
  return this
}


fun <T> Resource<T>.isSuccess(): Boolean = this is Resource.Success
fun <T> Resource<T>.isError(): Boolean = this is Resource.Error
fun <T> Resource<T>?.dataOrNull(): T? = if (this is Resource.Success) data else null

inline fun <T> Resource<T>.withResult(
  onLoading: () -> Unit = {},
  onSuccess: (T?) -> Unit = {},
  onError: (Exception) -> Unit = {}
) {
  when (this) {
    Resource.Loading -> onLoading()
    is Resource.Success -> {
      onSuccess(data)
    }

    is Resource.Error -> {
      onError(exception)
    }
  }
}


我已经发布了一个答案,但还有一些额外的问题。1. 您是否直接在代码中使用密封类,还是由于javac现在将枚举生成为密封类而受到影响?2. 您是否正在使用具有密封类的库?3. 由于这仅适用于类文件输出,您是否正在构建一个要外部提供的库?4. 您计划使用JDK-17的哪些新功能? - sgjesse
我在我的库中使用了密封类,同时一些由Compose目的地生成的密封类也在我的库中。由于使用Flamingo或Giraffe版本的Android Studio需要Java 17,因此我必须使用AGP 8.0。 - Ghasem
对于Flamingo的稳定版本,您仍然可以使用AGP 7.4,即使使用AGP 8.0,您仍然可以在build.gradle文件中将JVM设置为11,以避免在类文件中生成封闭类。 - sgjesse
https://developer.android.com/build/releases/gradle-plugin#updating-gradle - Ghasem
https://developer.android.com/studio/releases#android_gradle_plugin_and_android_studio_compatibility - Ghasem
https://developer.android.com/studio/releases#jdk-17 - Ghasem
1个回答

10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接