VM 有 multidex 支持,MultiDex 支持库被禁用。问题

Posted

技术标签:

【中文标题】VM 有 multidex 支持,MultiDex 支持库被禁用。问题【英文标题】:VM has multidex support, MultiDex support library is disabled. issue 【发布时间】:2018-04-21 13:28:32 【问题描述】:

我已经尝试了互联网上的所有解决方案,但其中任何一个都有效,这是我的 gradle:

android 
    compileSdkVersion 25
    buildToolsVersion '25.0.0'

defaultConfig 
    applicationId "com.rocketjourney"
    minSdkVersion 21
    targetSdkVersion 24
    versionCode 68
    versionName "4.41"
    multiDexEnabled true
    vectorDrawables.useSupportLibrary = true
    testInstrumentationRunner "com.rocketjourney.helpers.CustomTestRunner"


configurations.all 
    resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
    resolutionStrategy.force 'com.squareup.okio:okio:1.13.0'
    resolutionStrategy.force 'com.squareup.okhttp3:okhttp:3.8.0'


dexOptions 
    javaMaxHeapSize "4g"
    jumboMode = true
`

repositories 
    mavenCentral()
    maven  url 'http://oss.jfrog.org/artifactory/oss-snapshot-local' 
    maven  url "https://jitpack.io" 
    flatDir  dirs 'libs' 
    flatDir  dirs '../aars' 
    maven  url 'https://maven.fabric.io/public' 


dependencies 
    compile('com.crashlytics.sdk.android:crashlytics:2.7.1@aar')  transitive = true; 
    etc...
`

我的清单如下所示:

<application
    android:name="com.rocketjourney.RJApplication"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"

在我的RJApplication.class 我有这个代码:

public class RJApplication extends Application 

  @Override
  protected void attachBaseContext(Context base) 
    super.attachBaseContext(base);
  

但我现在的错误是:

11-08 11:54:36.494 5743-5743/? E/AndroidRuntime: 致命异常: main 进程:com.rocketjourney,PID:5743 java.lang.NoClassDefFoundError:解析失败:Lio/fabric/sdk/android/services/common/FirebaseInfo; 在 com.crashlytics.android.CrashlyticsInitProvider.onCreate(CrashlyticsInitProvider.java:22) 在 android.content.ContentProvider.attachInfo(ContentProvider.java:1696) 在 android.content.ContentProvider.attachInfo(ContentProvider.java:1671) 在 android.app.ActivityThread.installProvider(ActivityThread.java:4999) 在 android.app.ActivityThread.installContentProviders(ActivityThread.java:4594) 在 android.app.ActivityThread.handleBindApplication(ActivityThread.java:4534) 在 android.app.ActivityThread.access$1500(ActivityThread.java:151) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5254) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 引起:java.lang.ClassNotFoundException:在路径上找不到类“io.fabric.sdk.android.services.common.FirebaseInfo”:DexPathList [[zip file“/data/app/com.rocketjourney-2/base .apk"],nativeLibraryDirectories=[/data/app/com.rocketjourney-2/lib/x86, /vendor/lib, /system/lib]] 在 dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:511) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:469) 在 com.crashlytics.android.CrashlyticsInitProvider.onCreate(CrashlyticsInitProvider.java:22) 在 android.content.ContentProvider.attachInfo(ContentProvider.java:1696) 在 android.content.ContentProvider.attachInfo(ContentProvider.java:1671) 在 android.app.ActivityThread.installProvider(ActivityThread.java:4999) 在 android.app.ActivityThread.installContentProviders(ActivityThread.java:4594) 在 android.app.ActivityThread.handleBindApplication(ActivityThread.java:4534) 在 android.app.ActivityThread.access$1500(ActivityThread.java:151) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5254) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 抑制:java.lang.ClassNotFoundException:io.fabric.sdk.android.services.common.FirebaseInfo 在 java.lang.Class.classForName(本机方法) 在 java.lang.BootClassLoader.findClass(ClassLoader.java:781) 在 java.lang.BootClassLoader.loadClass(ClassLoader.java:841) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:504) ... 16 更多 原因:java.lang.NoClassDefFoundError: Class not found using the boot class loader;没有可用的堆栈

希望你们能帮助我,我将非常感激!

【问题讨论】:

你收到什么 gradle 错误? 【参考方案1】:

如果您的 minSdkVersion 为 21,则无需添加 multidex 支持。

来自documentation:

对 Android 5.0 及更高版本的 Multidex 支持

Android 5.0(API 级别 21)及更高版本使用名为 ART 的运行时,它本机支持从 APK 文件加载多个 DEX 文件。 ART 在应用程序安装时执行预编译,扫描 classesN.dex 文件并将它们编译成单个 .oat 文件以供 Android 设备执行。因此,如果您的 minSdkVersion 为 21 或更高,则不需要 multidex 支持库。

因此,您需要从 build.gradle 中删除 compile 'com.android.support:multidex:1.0.1'。然后您需要使用Application 扩展您的RJApplication。还要从您的attachBaseContext() 中删除MultiDex.install(this);

您需要做的就是通过添加multiDexEnabled true 将multiDexEnabled 设置为true。请参考Configure your app for multidex

【讨论】:

我怎么有这个:Error:Execution failed for task ':app:transformClassesWithDexForDevDebug'. &gt; com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: field ID not in [0, 0xffff]: 65536 糟糕...抱歉,您只需在 build.gradle 中添加 multiDexEnabled true。我会更新答案。 这可能是另一个问题。尝试将 crashlytic 更改为此 compile('com.crashlytics.sdk.android:crashlytics:2.7.1@aar') transitive = true exclude group: 'com.android.support', module: 'support-annotations' 我已经尝试添加那行代码但仍然是同样的错误

以上是关于VM 有 multidex 支持,MultiDex 支持库被禁用。问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用新的 Android Multidex 支持库启用多索引

如何使用新的 Android Multidex 支持库启用多索引

android MultiDex multidex原理下超出方法数的限制问题

android MultiDex multidex原理原理下遇见的N个深坑

Android分包MultiDex原理详解

重复类 MultiDex$V14.class