首页 > 解决方案 > MultiDex 在 Android 4.4 中导致 java.lang.NoClassDefFoundError

问题描述

我想将 Mina sshd 导入我的 android 应用程序。

implementation group: 'org.apache.sshd', name: 'sshd-core', version: '2.1.0'

但是,在运行时,这条线

public static final Factory<SshServer> DEFAULT_SSH_SERVER_FACTORY = SshServer::new;

抛出异常

> java.lang.NoClassDefFoundError: 
org.apache.sshd.server.-$$Lambda$xH0wWyo4NWY-u4MuNlGAr_IPDQc
        at org.apache.sshd.server.SshServer.<clinit>(SshServer.java:88)
        at com.ymz.myapplication.MainActivity$startSshd$1.run(MainActivity.kt:25)
        at java.lang.Thread.run(Thread.java:841)

首先,我检查class.dex 在此处输入图像描述

没有定义的类是存在的。</p>

我的毕业

    apply plugin: 'com.android.application'

    apply plugin: 'kotlin-android'

    apply plugin: 'kotlin-android-extensions'

    android {
        compileSdkVersion 28
        defaultConfig {
            applicationId "com.ymz.myapplication"
            minSdkVersion 19
            targetSdkVersion 28
            multiDexEnabled true
            versionCode 1
            versionName "1.0"
            multiDexKeepProguard file('multidex-config.pro')
    //        multiDexKeepFile file('multidex-config.txt')
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }

        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
                                ....
    }

已经添加文件multidex-config.pro

-keep class org.apache.sshd.** { *; }

标签: javaandroidandroid-multidex

解决方案


尝试在您的 proguard 文件中添加以下规则:-

SSHd 需要 mina,而 mina 使用反射,因此某些类会被删除

    -keep class org.apache.mina.** {*;}
    -keep class org.apache.sshd.** {*;}

   -dontwarn org.apache.sshd.**
   -dontwarn org.apache.mina.**

还要检查您的 gradle 文件是否有这两个依赖项:-

implementation 'org.apache.sshd:sshd-core:0.14.0'
implementation 'org.apache.mina:mina-core:2.0.19' 

推荐阅读