Multidex无法找到类

4

由于我已经达到了64K方法的限制,因此我在我的应用中启用了Multidex。

我在两个不同的设备上进行测试:

  • Samsung Galaxy S7(API 24)
  • Alps A733(API 19,Google服务未更新)

第一个设备上一切正常,但在第二个设备上,我遇到了以下错误,并且整个应用程序会冻结(而不是崩溃)。

错误

E/dalvikvm: Could not find class 'android.app.job.JobScheduler', referenced from method com.google.android.gms.internal.zzcfr.zzazv
E/dalvikvm: Could not find class 'android.app.job.JobScheduler', referenced from method com.google.android.gms.internal.zzcfr.zzs
E/dalvikvm: Could not find class 'android.graphics.drawable.RippleDrawable', referenced from method android.support.v7.widget.AppCompatImageHelper.hasOverlappingRendering

我遵循文档的步骤:

在我的gradle文件中,我添加了以下内容:

  • multiDexEnabled true
  • compile 'com.android.support:multidex:1.0.1',因为我将minSDKVersion设置为API 16

在我的自定义Application类中:

  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }

为了解决这个问题,我创建了一个名为 multidex-config.txt 的文件,并将其放在与引用它的 build.gradle 相同的文件夹中。 multidex-config.txt(已编辑)
android/app/job/JobScheduler.class
android/support/v4/widget/DrawerLayout.class
android/graphics/drawable/RippleDrawable.class

然后在gradle中:

buildTypes {

    debug {
        multiDexKeepFile file('multidex-config.txt')
        //...
    }

    debugStaging {
        initWith(buildTypes.debug)
        //...
    }

    release {
        multiDexKeepFile file('multidex-config.txt')
        minifyEnabled false
        //...
    }
}

我觉得我漏掉了什么,有线索吗?
编辑
Gradle文件
android {
    compileSdkVersion 26

    defaultConfig {
        //...
        minSdkVersion 16
        targetSdkVersion 25
        multiDexEnabled true
        versionCode 10
        //...
    }

    buildTypes {
        //...
        debug {
            //...
            multiDexKeepFile file('multidex-config.txt')
        }

        debugStaging {
            initWith(buildTypes.debug)
            //...
        }

        release {
            //...
            multiDexKeepFile file('multidex-config.txt')
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            //...
        }
    }

    dexOptions {
        maxProcessCount 6
        javaMaxHeapSize "2g"
        jumboMode true
    }
    //...
}

ext {
    //...
}

dependencies {
    //...
    implementation 'com.android.support:multidex:1.0.2'
   //...
}

// Required by Firebase
apply plugin: 'com.google.gms.google-services'

1
你能分享一下你的Gradle文件吗?multiDexEnabled在哪里写的? - Arnab Kar
@Radhey 如我所述,我的最小SDK为16。有三种方法可以为应用程序添加Multidex:通过清单、通过扩展MultiDexApplication类或通过添加MultiDex.install(this);。我选择了最后一种选项。 - Eselfar
将其设置为14并告诉我。 - Radhey
@Radhey 我不能这样做,因为我的应用程序使用的功能在 API 16 以下版本中不可用。 - Eselfar
据我所知,如果您想启用multidex,则最小SDK应为14。 - Radhey
显示剩余7条评论
1个回答

1

multidex-config.txt的格式似乎与Android文档中描述的不同。

看起来-keep不应该在这里。它是multiDexKeepProguard而不是multiDexKeepFile的一部分。

格式应该是:

com/example/MyClass.class
com/example/MyOtherClass.class

由于Alps A733具有API 19(任何API级别低于20的应用程序),您的应用程序会崩溃,并显示错误java.lang.NoClassDefFoundError。


是的,你说得对。我混淆了multiDexKeepFile和multiDexKeepProguard的格式。所以我已经更改了它,但仍然出现错误(我将使用新实现更新我的问题)。 - Eselfar
保留库中的类和保留自己的类格式相同吗? - Eselfar
1
是的,它完全相同。 - Arnab Kar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接