这篇文章主要介绍“android.enableD8.desugaring=false引发问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“android.enableD8.desugaring=false引发问题如何解决”文章能帮助大家解决问题。
问题:
Kotlin升级引起的类找不到情况[其实跟Kotlin版本无关]
java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/lifecycle/LifecycleRegistry; androidx.lifecycle.ProcessLifecycleOwner.<init>(ProcessLifecycleOwner.java:62) androidx.lifecycle.ProcessLifecycleOwner.<clinit>(ProcessLifecycleOwner.java:89) androidx.lifecycle.ProcessLifecycleOwner.init(ProcessLifecycleOwner.java:103) androidx.lifecycle.ProcessLifecycleOwnerInitializer.onCreate(ProcessLifecycleOwnerInitializer.java:38) android.content.ContentProvider.attachInfo(ContentProvider.java:2121) android.content.ContentProvider.attachInfo(ContentProvider.java:2094) android.app.ActivityThread.installProvider(ActivityThread.java:7900) android.app.ActivityThread.installContentProviders(ActivityThread.java:7441) android.app.ActivityThread.handleBindApplication(ActivityThread.java:7334) android.app.ActivityThread.access$2400(ActivityThread.java:308) android.app.ActivityThread$H.handleMessage(ActivityThread.java:2295) ndroid.os.Handler.dispatchMessage(Handler.java:110) android.os.Looper.loop(Looper.java:219) android.app.ActivityThread.main(ActivityThread.java:8347) java.lang.reflect.Method.invoke(Native Method) com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055) AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.lifecycle.LifecycleRegistry" on path: DexPathList[[dex file "InMemoryDexFile[cookie=[0, 3991625136]]", zip file "/data/app/com.secoo-4gTkhUPR4gWOZn_7R-7U9A==/base.apk"],nativeLibraryDirectories=[/data/app/com.secoo-4gTkhUPR4gWOZn_7R-7U9A==/lib/arm, /data/app/com.secoo-4gTkhUPR4gWOZn_7R-7U9A==/base.apk!/lib/armeabi-v7a, /system/lib, /hw_product/lib]]
最近公司项目打算升级kotlin至1.4.10版本, 兴致冲冲的修改了版本,紧接着就是两天的折磨期,程序一直出现
ClassNotFoundException或
NoClassDefFoundError,而且几乎每次报的不是同一个类找不到,而是随机的。后来反编译代码,查找找不到的类,果然在编译生成的
classs.jar中找不到对应的类,所以怀疑是分包引起的异常。
开始逛国内外各大网站,还是没找到原因。最后使用最原始的方案,注掉一段段代码试,果然在坚持下,发现了猫腻,最终找到是因为项目根目录下
gradle.properties中的
android.enableD8.desugaring = false搞的鬼。
既然找到原因了,那么就开始找扒一扒为什么看似八竿子打不着的两处修改会有关联呢?
大致的原因:
kotlin升级导致引入了大量代码,这些代码使得项目达到一个临界值【猜想】,此时又关闭了dex包的脱糖处理,导致编译会在
transforms生成
desugar目录,
desugar先进行脱糖,然后再通过D8的编译器进行编译,此时会在desugar目录中生成大量的jar文件,而如果开启了
android.enableD8.desugaring = true,那么就会省略了desugar脱糖操作,将脱糖步骤集成进D8编译器,这样会省去了desugar目录中的大量文件。
接下来我们看看开启脱糖和关闭脱糖
transforms文件下生成的文件具体信息。
关闭脱糖的操作
开启脱糖的操作
如上我们所说,当开启脱糖时,编译器生成的编译文件中没有
desugar及其下的大量文件,直接将脱糖步骤集成进了D8编译器。
另外一点:在Android Studio3.1之后版本,gradle默认是开启了脱糖操作的,也就是:
android:enableD8=true android.enableD8.desugaring = true