android.enableD8.desugaring = false引发问题解决
作者:kevinEegets 发布时间:2023-11-03 16:06:15
问题:
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
参考自:
https://www.jb51.net/article/143221.htm
stackoverflow.com/questions/4…
来源:https://juejin.cn/post/7216213764777181241


猜你喜欢
- 这篇文章主要介绍了Java并发CopyOnWrite容器原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 1.取整运算符取整从字面意思理解就是被除数到底包含几个除数,也就是能被整除多少次,那么它有哪些需要注意的地方呢?先看下面的两端代码: &nb
- app的启动方式: 1.)冷启动 当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启
- 在文本框中输入一个数字,点击开始累加按钮,程序计算从1开始累计到该数字的结果。因为该累加过程比较耗时,如果直接在UI线程中进行,那么当前窗口
- 一、问题描述今天做了一个C++的类组合的作业,由于是基础小白,编写之后一直出现Id returned 1exit status的情况:网上查
- Android Studio生成的APP默认图标是经典的机器人图标。可以通过Android Studio实现APP图标和名称的修改。1 修改
- 在Update函数中执行:if (turnAround) { playerCamera.RotateA
- 1.在java代码中(SplashActivity继承AppCompatActivity时无效)2.在manifest.xml中改Theme
- 一、开发环境:1、windows 7 企业版2、IDEA 143、JDK 1.84、Maven 3.5.25、MariaDB6、SQLYog
- 上篇文章给大家介绍了,喜欢的朋友点击查看下。SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUILo
- yml与properties其实yml和properties文件是一样的原理,且一个项目上要么yml或者properties,二选一的存在。
- Netty设置为Https访问SSLContextFactorypublic class SSLContextFactory {
- Wrapper条件构造器updateForSet更新官方文档:https://baomidou.gitee.io/mybatis-plus-
- tomcat中文乱码问题这几天测试的兄弟发现了项目中存在乱码问题 经过排查发现是tomcat中的问题 于是在server.xml中添加了如下
- 依赖的jar包:spring相关jar包版本:4.3.1.RELEASE<dependency> &l
- tokentoken的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳
- 前言MyBatis-Plus 是基于 MyBatis 进行封装的一套优秀的持久层框架,它提供了丰富的便捷操作方法和强大的代码生成器,大大简化
- 本文实例讲述了Android检查手机网络状态及网络类型的方法。分享给大家供大家参考。具体分析如下://judge network statu
- 本文实例讲述了C#简单读写txt文件的方法。分享给大家供大家参考,具体如下://write txtStringBuilder builder
- 思路如下:创建一个类,通过extends使其继承窗体类JFrame;创建一个JFrame对象,使用JFrame类的setVisible()方