升级Android Studio Gradle插件导致旧API版本脱糖失效
解决AGP升级后API24设备java.time.Instant找不到的问题
问题背景
将Android Studio Gradle插件(AGP)从7.0.4升级至7.3.1,同时Gradle发行版从7.0.2升级至7.4后,未修改其他代码,应用在Android API24设备上崩溃,报错java.lang.NoClassDefFoundError: java.time.Instant。已开启coreLibraryDesugaringEnabled,脱糖库版本为com.android.tools:desugar_jdk_libs:1.1.5,升级该库后问题仍未解决。
升级的配置信息
- AGP配置变更:
classpath 'com.android.tools.build:gradle:7.0.4' -> classpath 'com.android.tools.build:gradle:7.3.1'
- Gradle发行版配置变更:
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip -> distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
当前脱糖配置
compileOptions { coreLibraryDesugaringEnabled true sourceCompatibility = javaVersion targetCompatibility = javaVersion }
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
报错堆栈
uncaughtException java.lang.NoClassDefFoundError: java.time.Instant at libcore.reflect.InternalNames.getClass(InternalNames.java:55) at java.lang.Class.getDexCacheType(Class.java:2551) at java.lang.reflect.Method.getReturnType(Method.java:150) at java.lang.Class.getDeclaredMethods(Class.java:1811) at java.io.ObjectStreamClass.computeDefaultSUID(ObjectStreamClass.java:1684) at java.io.ObjectStreamClass.-wrap8(ObjectStreamClass.java) at java.io.ObjectStreamClass$1.run(ObjectStreamClass.java:239) at java.io.ObjectStreamClass$1.run(ObjectStreamClass.java:238) at java.security.AccessController.doPrivileged(AccessController.java:41) at java.io.ObjectStreamClass.getSerialVersionUID(ObjectStreamClass.java:236) at java.io.ObjectStreamClass.writeNonProxy(ObjectStreamClass.java:711) at java.io.ObjectOutputStream.writeClassDescriptor(ObjectOutputStream.java:680) at java.io.ObjectOutputStream.writeNonProxyDesc(ObjectOutputStream.java:1322) at java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1271) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1467) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1218) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1584) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1549) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1472) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1218) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1584) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1549) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1472) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1218) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1584) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1549) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1472) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1218) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346) at android.os.Parcel.writeSerializable(Parcel.java:1521) at android.os.Parcel.writeValue(Parcel.java:1474) at android.os.Parcel.writeArrayMapInternal(Parcel.java:723) at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1408) at android.os.Bundle.writeToParcel(Bundle.java:1133) at android.os.Parcel.writeBundle(Parcel.java:763) at android.content.Intent.writeToParcel(Intent.java:8655) at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3052) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1518) at android.app.Activity.startActivityForResult(Activity.java:4224) at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:2) at androidx.core.app.a.i(ActivityCompat.java:1) at androidx.activity.ComponentActivity$b.f(ComponentActivity.java:166) at androidx.activity.result.ActivityResultRegistry$a.b(ActivityResultRegistry.java:35) at androidx.activity.result.ActivityResultLauncher.a(ActivityResultLauncher.java:2)
可行解决办法
1. 匹配AGP版本升级脱糖库
AGP版本与脱糖库版本存在兼容性要求,AGP7.3.x需要搭配更高版本的脱糖库。将脱糖库升级至com.android.tools:desugar_jdk_libs:2.0.4或对应兼容版本:
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
2. 防止R8混淆移除脱糖类
R8混淆可能会误删脱糖后的java.time相关类,在proguard-rules.pro中添加以下规则:
-keep class java.time.** { *; } -keep interface java.time.** { *; }
3. 明确指定Java版本
确保compileOptions中明确设置Java 8版本,避免javaVersion变量可能带来的不确定:
compileOptions { coreLibraryDesugaringEnabled true sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }
4. 清理缓存并重新构建
执行Gradle清理命令,清除旧构建缓存后重新编译:
./gradlew clean assembleDebug
5. 检查第三方库依赖
排查项目中是否有第三方库直接依赖未脱糖的java.time类,若存在,需确保该库也参与脱糖,或替换为兼容Android API24的替代库。
内容的提问来源于stack exchange,提问作者Cian
相关产品推荐
相关产品推荐

