android.enableD8.desugaring = false引发问题解决

 更新时间:2023年03月31日 10:52:43   作者:kevinEegets  
这篇文章主要为大家介绍了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版本, 兴致冲冲的修改了版本,紧接着就是两天的折磨期,程序一直出现ClassNotFoundExceptionNoClassDefFoundError,而且几乎每次报的不是同一个类找不到,而是随机的。后来反编译代码,查找找不到的类,果然在编译生成的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…

以上就是android.enableD8.desugaring = false引发问题解决的详细内容,更多关于android enableD8解决的资料请关注脚本之家其它相关文章!

相关文章

  • 解决Could not find com.android.tools.build:gradle:3.0.0

    解决Could not find com.android.tools.build:gradle:3.0.0

    这篇文章主要介绍了在Android Studio升级时碰到Could not find com.android.tools.build:gradle:3.0.0问题的解决方法,需要的朋友跟随小编一起看看吧
    2021-08-08
  • Android程序报错程序包org.apache.http不存在问题的解决方法

    Android程序报错程序包org.apache.http不存在问题的解决方法

    这篇文章主要介绍了Android程序报错"程序包org.apache.http不存在——Android 6.0已经不支持HttpClient" 问题的解决方法,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Android仿QQ微信实时监测网络状态

    Android仿QQ微信实时监测网络状态

    这篇文章主要为大家详细介绍了Android仿QQ微信实时监测网络状态,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • 微信小程序 bnner滚动实例详解

    微信小程序 bnner滚动实例详解

    这篇文章主要介绍了微信小程序 bnner滚动实例详解的相关资料,需要的朋友可以参考下
    2017-01-01
  • Android使用第三方库实现日期选择器

    Android使用第三方库实现日期选择器

    这篇文章主要为大家详细介绍了Android使用第三方库实现日期选择器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • Android 编译出错版本匹配问题解决办法

    Android 编译出错版本匹配问题解决办法

    这篇文章主要介绍了Android 编译出错 app\build\intermediates\res\merged\debug\values-v23\values-v23.xml 的问题解决办法,需要的朋友可以参考下
    2017-07-07
  • Android数据加密之Rsa加密

    Android数据加密之Rsa加密

    这篇文章主要为大家详细介绍了Android数据加密之Rsa加密,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Android编程实现闹钟的方法详解

    Android编程实现闹钟的方法详解

    这篇文章主要介绍了Android编程实现闹钟的方法,结合实例形式较为详细的分析了Android闹钟的原理、布局、权限控制及相关实现技巧,需要的朋友可以参考下
    2017-02-02
  • Android 自定义来电秀实现总结

    Android 自定义来电秀实现总结

    这篇文章主要为大家介绍了Android 自定义来电秀实现总结示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Android实现文件下载进度显示功能

    Android实现文件下载进度显示功能

    这篇文章主要为大家详细介绍了Android实现文件下载进度显示功能,检测Android文件下载进度,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-02-02

最新评论