android之R8混淆引起Java与Kotlin混编异常Didn‘t find class on path: DexPathList

1. Java与Kotlin混编配置

  • app 目录build.gradle
#可不写kotlin-android-extensions
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-android'
  • 配置工程目录下的build.gradle  
buildscript{
   ext.kotlin_version = '1.5.30'
   dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
   }
}

2. 同步工程代码 - 运行APP

同步工程代码,运行代码一切顺利,测试完APP功能,打正式包测试,APP始终运行崩溃,报错如下:

Didn't find class "com.xxx.xxx" on path: DexPathList[[zip file "/data/app/com.xxx.xxx-yP_PO0w_37dzygJsDfgv8w==/base.apk"],nativeLibraryDirectories=[/data/app/com.xxx.xxx-yP_PO0w_37dzygJsDfgv8w==/lib/arm64, /data/app/com.xxx.xxx-yP_PO0w_37dzygJsDfgv8w==/base.apk!/lib/arm64-v8a, /system/lib64, /system/product/lib64]]

 这种错误一看就是编译问题,我就知道要折腾很久了,呜呜呜!继续分析问题,以我的经验,debug与realse包最大的区别就是realse包开启了代码混淆,再结合上述代码报错,那问题差不多就是跟混淆有关了。

3. 对比编译日志 - 这个折腾了很久

Java工程transform日志

ProGuard, version 6.0.3

.......

> Task :app:transformClassesAndResourcesWithProguardForDebug

.......

AGPBI: {"kind":"warning","text":"Interface `org.apache.http.client.RedirectHandler` not found. It\u0027s needed to make sure desugaring of `com.sina.weibo.sdk.net.HttpManager$1` is correct. Desugaring will assume that this interface has no default method.","sources":[{"file":"/Users/androiddeveloper/xxx/app/build/intermediates/transforms/proguard/debug/0.jar"}],"tool":"D8"}

Kotlin工程transform日志 

> Task :app:minifyDebugWithR8
AGPBI: {"kind":"warning","text":"Expected stack map table for method with non-linear control flow. In later version of R8, the method may be assumed not reachable.","sources":[{"file":"/Users/xxx/app/build/intermediates/transforms/com.alibaba.arouter/debug/0.jar"}],"tool":"R8"}

我去,我发现了端倪,java工程编译混淆是Proguard,kotlin与java混编则变成了R8

Task :app:transformClassesAndResourcesWithProguardForDebug 

Task :app:minifyDebugWithR8

这个R8是什么?我们根本没设置过啊?

4. R8问题跟踪

Android Gradle插件升级至3.4.0版本之后,带来一个新一代混淆工具R8,做为D8的升级版替代Proguard,在应用压缩、应用优化方面提供更极致的体验,并不再使用ProGuard执行优化而是R8。因为升级到最新的kotlin版本,项目Gradle也升级到了4.2.0。

 classpath 'com.android.tools.build:gradle:4.2.0'

那怎么弄呢,可以降级用ProGuard混淆代码吗,我想这是可以的,继续查找资料,发现了在gradle.properties文件中加上如下配置就可以不使用R8.

android.enableR8=false

经过一天的折腾, Java与Kotlin混编工程终于可以混淆运行成功,哈哈哈!

你可能感兴趣的:(Java,android,kotlin,android,java)