Qigsaw icon indicating copy to clipboard operation
Qigsaw copied to clipboard

Lambda 表达式导致的NoClassDefFoundError 错误

Open JarvisBuop opened this issue 3 years ago • 6 comments

在使用qigsaw 插件化项目的时候,遇到了split中使用lambda表达式在打release包混淆时,打包可以成功,但在运行lambda表达式处会crash,其中R8和Proguard混淆都会报NoClassDefFoundError错误,请问这可能是什么原因导致的,应该怎么解决呢?

我尝试了以下方法都无效:

  1. 添加 lambda表达式 的混淆;
  2. android.enableR8=false 关闭R8,使用Proguard也会crash;

JarvisBuop avatar Jun 22 '21 12:06 JarvisBuop

demo复现步骤: @kissonchan

  1. :java 模块 先添加 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }
  2. JavaSampleActivity类布局添加id,onCreate中添加 findViewById(R.id.text).setOnClickListener(v -> { Log.e(TAG,"doError"); });
  3. clear 后使用R8或者proguard 运行 qigsawAssembleRelease
  4. 打完包后进入app,点击text文字会出现NoClassDefFoundError

JarvisBuop avatar Jun 23 '21 04:06 JarvisBuop

因为Lambda表达式desurge生成的class被留在的host中 这是dynamic feature dex split的坑,解决方案是自己改R8,让lambda class正确的放在split中

Hackforid avatar Jul 15 '21 12:07 Hackforid

因为Lambda表达式desurge生成的class被留在的host中 这是dynamic feature dex split的坑,解决方案是自己改R8,让lambda class正确的放在split中

活捉

Xiaojuanmao avatar Jul 21 '21 13:07 Xiaojuanmao

apply plugin: 'com.iqiyi.qigsaw.dynamicfeature' 用了这个 plugin 还会出现吗?这个 plugin 改了 Scope 的范围,我这边验证是不会有问题

wille-89 avatar Jul 30 '21 05:07 wille-89

因为Lambda表达式desurge生成的class被留在的host中 这是dynamic feature dex split的坑,解决方案是自己改R8,让lambda class正确的放在split中

官方有对应的issue:https://issuetracker.google.com/issues/181185126 我测试过,AGP7.0可以解决这个问题。但Qigsaw还没适配7.0,大佬有计划适配吗?

xiangtailiang avatar Sep 06 '21 03:09 xiangtailiang

多classloader下混淆的lambda表达式位于host的问题 后续:

  1. 单独升级R8,个人尝试R8 3.0.62版本已经解决这个问题了; (ps:对应agp7.0, qigsaw未支持agp7.0) 2.使用单Classloader模式;

JarvisBuop avatar Nov 26 '21 06:11 JarvisBuop