Android Multidex支持库已停用

时间:2017-04-05 10:11:40

标签: android multidex

我在我的应用程序中遇到了一些multidex支持问题,实际上应用程序正常安装,但通过这个过程,一些活动崩溃了,应用程序重新启动了主要活动。在logcat中我发现了这个:

I/MultiDex: install
I/MultiDex: VM has multidex support, MultiDex support library is disabled.

但我遵循建议启用Multidex支持:

Gradle:

compileSdkVersion 25
buildToolsVersion '25.0.2'

defaultConfig {
    applicationId "com..company.package"
    minSdkVersion 15
    targetSdkVersion 25
    multiDexEnabled true
    versionCode 21
    versionName "2.1.3"

}

dexOptions {
    javaMaxHeapSize "4g"
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
//compile project(':rangebar')
compile('com.github.afollestad.material-dialogs:core:0.8.5.3@aar') { transitive = true }
compile('com.weiwangcn.betterspinner:library-material:1.1.0') {
    exclude group: 'com.android.support', module: 'appcompat-v7'
}
compile files('libs/itextpdf-5.5.9.jar')
compile 'com.android.support:multidex:1.0.1'
...

Application class扩展了Multidex:

public class MyApplication extends MultiDexApplication {
@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}
}

我不知道我究竟缺少什么来摆脱这件事

提前致谢。

2 个答案:

答案 0 :(得分:4)

  

I / MultiDex:安装I / MultiDex:VM具有multidex支持,MultiDex   支持库已禁用。

你应该设置

PrepareContainerForItemOverride

<强>清单

public class CustomListViewCrash : ListView
{
    protected override DependencyObject GetContainerForItemOverride()
    {
        var canvas = new Canvas
        {
            Width = 100,
            Height = 50
        };
        canvas.Children.Add(new Button());
        var listViewItem = new ListViewItem();
        listViewItem.Content = canvas;
        return listViewItem;
    }

    protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
    {
        var listViewItem = (ListViewItem)element;
        var canvas = (Canvas)listViewItem.Content;
        var button = (Button)canvas.Children[0];
        button.Content = item;
    }
}

然后清理 - 重建 - 运行

答案 1 :(得分:1)

但也要在顶部添加答案^

在Android文档中,如果你有minSdkVersion是21或更高,你不需要multidex支持库。所以,我明白为什么你这样做https://developer.android.com/studio/build/multidex.html#mdex-on-l

您拥有的选项如下: https://developer.android.com/studio/build/multidex.html#mdex-gradle

不要忘记在build.gradle(app)中添加

android {
    defaultConfig {
        ...
        minSdkVersion 21 
        targetSdkVersion 28
        multiDexEnabled true
   }
    ...
}

选项1)如果不覆盖Application类,请编辑清单文件以在标记中设置android:name,如下所示: 这将是您的条目:android.support.multidex.MultiDexApplication

<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
            android:name="android.support.multidex.MultiDexApplication" >
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme">
            <activity
                    android:name=".MainActivity"
                    android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
            </activity>
    </application>
</manifest>

选项2)如果您覆盖Application类,请将其更改为扩展MultiDexApplication(如果可能),如下所示:

public class MyApplication extends MultiDexApplication { ... }

选项3)或者如果你覆盖了Application类但是无法更改基类,那么你可以覆盖attachBaseContext()方法并调用MultiDex.install(this)来启用multidex:您添加以下代码而不扩展 MultiDexApplication

public class MyApplication extends **SomeOtherApplication** {

  //You add the code below without extending **MultiDexApplication**
  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
}

警告:在MultiDex.install()完成之前,不要通过反射或JNI执行MultiDex.install()或任何其他代码。 Multidex跟踪不会跟随这些调用,导致ClassNotFoundException或验证由于DEX文件之间的类分区错误而导致的错误。