美文网首页
一次android.enableD8.desugaring =

一次android.enableD8.desugaring =

作者: kevinsEegets | 来源:发表于2020-11-05 16:24 被阅读0次

问题: 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文件下生成的文件具体信息。

  • 关闭脱糖的操作


    WeChat Image_20201105150309.png
  • 开启脱糖的操作


    WeChat Image_20201105150618.png

如上我们所说,当开启脱糖时,编译器生成的编译文件中没有desugar及其下的大量文件,直接将脱糖步骤集成进了D8编译器。

另外一点:在Android Studio3.1之后版本,gradle默认是开启了脱糖操作的,也就是:

android:enableD8=true
android.enableD8.desugaring = true

参考自:
https://www.jianshu.com/p/bb6fb79dab17
https://stackoverflow.com/questions/49536959/difference-between-android-enabled8-desugaring-in-android-studio-3-1-and-android

相关文章

  • 一次android.enableD8.desugaring =

    问题: Kotlin升级引起的类找不到情况[其实跟Kotlin版本无关] 最近公司项目打算升级kotlin至最新版...

  • 一次和十一次

    如果有人跟你说生命中有一件事是真的: 有一天我们会走向死亡;但有一件事是假的: 人只能活一次。你听了会有什么想法?...

  • 一次一次

    去搜索他 但是我是不会去找他的 看着他主页上显示的上次上线的时间 我觉得好像就知道他在了 但我绝不会再去靠近了 让...

  • 一次一次

    人一定要找到自己的节奏,走稳自己的步伐,世界和时间什么的,其实不用管。只需自顾自地去生活,像一场雨的落下,像季节更...

  • 一次一次

    人一定要找到自己的节奏,走稳自己的步伐,世界和时间什么的,其实不用管。只需自顾自地去生活,像一场雨的落下,像季节更...

  • 一次一次回家,一次一次出发

    2.6 凌晨四点半,外面的风有些冷,缩进羽绒服里,去开车。回家750公里,快的话,今天下午能到家。 抬起头,看见了...

  • 一次自信,一次努力,一次成功;一次自信,一次努力,一次成功。

    一次自信,一次努力,一次成功;一次自信,一次努力,一次成功。 1。只要是勤劳的蜜蜂,他们就能在广阔的生活领域里到处...

  • 《一次讲课一次历练 一次历练一次成长》

    一次讲课 一次历练 一次历练 一次成长 叶县第一小学 王蓓蓓 在...

  • 一次犯错,一次学习,一次改变,一次成长

    最近这一周,我有寒假班,带着孩子去上课,有朋友纷纷伸出援助之手,在我上课的时候帮我带着孩子。孩子呢?有“乖...

  • 一次复一次

    在辅导唐唐作业的时候,心情和思绪犹如过山车一般跌宕起伏。 一会兴高采烈,终于做对了;一会怒气冲天,这都做不会;一会...

网友评论

      本文标题:一次android.enableD8.desugaring =

      本文链接:https://www.haomeiwen.com/subject/kascvktx.html