我正在开发一个带有 Gradle 版本7.1.1和 Android Gradle 插件版本的Android 应用程序7.0.0。当我升级到 Gradle 版本7.2和 Android Gradle Plugin 版本时7.1.1,出现以下错误。
2022-03-02 17:15:47.072 25300-25300/... E/AndroidRuntime: FATAL EXCEPTION: main
Process: ..., PID: 25300
java.lang.NoClassDefFoundError: Failed resolution of: Ljava/lang/Math8;
at j$.time.Instant.ofEpochSecond(Instant.java:328)
at j$.time.Instant.<clinit>(Instant.java:232)
at j$.time.Instant.ofEpochMilli(Instant.java:344)
...
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.ClassNotFoundException: Didn't find class "java.lang.Math8" on path: DexPathList[[zip file "/data/app/...-NbMXeOj8LumN03n4IMK5Cw==/base.apk"],nativeLibraryDirectories=[/data/app/...-NbMXeOj8LumN03n4IMK5Cw==/lib/x86, /data/app/...-NbMXeOj8LumN03n4IMK5Cw==/base.apk!/lib/x86, /system/lib, /system/product/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196) …Run Code Online (Sandbox Code Playgroud) 我正在将一个 Android 应用程序从使用 Proguard 的 desugaring 切换到 Android Gradle Build Plugin 4.0.0 中可用的新 R8 desugaring。
我已按照官方文档中详述的步骤启用 Java 8 库脱糖:
projectJavaVersion = 1.8
android.useAndroidX=true
android.enableJetifier=true
Run Code Online (Sandbox Code Playgroud)
plugins {
id 'com.android.application'
id 'kotlin-android'
}
android {
buildToolsVersion '29.0.2'
compileSdkVersion 29
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility projectJavaVersion
targetCompatibility projectJavaVersion
}
kotlinOptions {
jvmTarget = projectJavaVersion
}
defaultConfig {
multiDexEnabled true
minSdkVersion 19
targetSdkVersion 23
applicationId = 'com.example.app'
}
buildTypes {
release {
...
minifyEnabled true
}
debug {
debuggable true …Run Code Online (Sandbox Code Playgroud) android java-8 android-gradle-plugin android-r8 jdk-desugaring
我添加coreLibraryDesugaringEnabled到我们的应用程序中,它对于正常的应用程序运行来说工作得很好。
compileOptions {
coreLibraryDesugaringEnabled true
}
Run Code Online (Sandbox Code Playgroud)
和
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9'
Run Code Online (Sandbox Code Playgroud)
但是,当我运行连接测试时,它会崩溃,并且类上没有此类方法错误Stream:
16:03:56.426 11998 12041 E AndroidRuntime: FATAL EXCEPTION: com....
16:03:56.426 11998 12041 E AndroidRuntime: Process: ...
16:03:56.426 11998 12041 E AndroidRuntime: java.lang.NoSuchMethodError: No static method e([Ljava/lang/Object;)Lj$/util/stream/Stream; in class Lj$/util/n; or its super classes (declaration of 'j$.util.n' appears in /data/app/com....-qU6nwXthxze4O_9rcf1hGg==/base.apk!classes2.dex)
16:03:56.426 11998 12041 E AndroidRuntime: at j$.util.stream.Stream$-CC.of(:1000)
16:03:56.426 11998 12041 E AndroidRuntime: at ...
Run Code Online (Sandbox Code Playgroud)
我发现一些模糊的参考,这可能是因为在调用Multidex.install?之前引用了该类。我首先将该类引用为静态初始化程序,因此可以很早就访问它。不确定这是否是转移注意力,但我想我会提一下。
如果有帮助,则使用AndroidJUnit4ClassRunner.
编辑:我发现了一个模糊的参考,只有一篇文章指出仪器测试不支持这一点:
请注意,在 Android Studio 4.0 中,不支持在仪器测试中使用这些库脱糖类型。
https://medium.com/androiddevelopers/support-for-newer-java-language-apis-bca79fc8ef65
但即使是谷歌关于该功能的嵌入式视频也没有提及这一点。也不确定 …
我正在使用 minSdk 23 的项目上测试Java 8+ API 脱糖支持。
java.time例如,当我使用该库时val instant = Instant.now(),我收到以下错误:
调用需要 API 级别 26(当前最低为 23):java.time.Instant#now
该代码可以正确编译并执行。
我可以假设它适用于所有设备吗?
编辑:我尝试过 API 29(物理设备)和 API 23(模拟器)。
我使用的是 Android Studio 版本 4.1.2。我的项目运行良好。我将其更新到Android Studio 4.1.3。重新安装 AS 4.1.2 时仍然出现错误。我开始收到以下错误:
Could not resolve all files for configuration ':app:coreLibraryDesugaring'.
Cannot resolve external dependency com.android.tools:desugar_jdk_libs:1.0.9 because no repositories are defined.
Required by:
project :app
Run Code Online (Sandbox Code Playgroud)
在终端中运行以下命令时:
$ ./gradlew build --refresh-dependencies --stacktrace
Run Code Online (Sandbox Code Playgroud)
这是堆栈跟踪:
Starting a Gradle Daemon, 1 incompatible and 3 stopped Daemons could not be reused, use --status for details
> Configure project :app
WARNING: API 'BaseVariant.getApplicationIdTextResource' is obsolete and has been replaced with 'VariantProperties.applicationId'.
It will be removed in version 5.0 of …Run Code Online (Sandbox Code Playgroud) android gradle android-studio android-gradle-plugin jdk-desugaring