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混编工程终于可以混淆运行成功,哈哈哈!