我可以在Android调试版本中启用multidex吗?

时间:2016-05-11 00:21:35

标签: android performance multidex android-multidex

逗人,       我在很多博客文章中都看到,multidex apps启动比普通应用慢。 我的应用程序使用了很多超过64k方法的库,所以我使用multidex。但是当我在发布版本中使用proguard时,最终的apk变得不到64k方法

所以我的问题是:我是否可以在Android调试版本中启用multidex,这样我就没有运行时错误?并且在发布版本中禁用multi dex,因为我不需要它?

如果是,怎么样?

如果不是,Android是否足够智能以加速启动,因为它应该认识到应用程序不超过64k,即使它是多dex应用程序?

4 个答案:

答案 0 :(得分:20)

是的,你可以。当您声明buildTypes仅包含用于debug的multidex时:

buildTypes {
    release {
        multiDexEnabled false
    }
    debug {
        multiDexEnabled true
    }
}

答案 1 :(得分:9)

除了仅为调试启用multidex,您可以将min sdk版本更改为21仅用于调试,因此gradle可以加快ART的dexing:

android {
    productFlavors {
        // Define separate dev and prod product flavors.
        dev {
            // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
            // to pre-dex each module and produce an APK that can be tested on
            // Android Lollipop without time consuming dex merging processes.
            minSdkVersion 21
        }
        prod {
            // The actual minSdkVersion for the application.
            minSdkVersion 14
        }
    }
          ...
    buildTypes {
        release {
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                                                 'proguard-rules.pro'
        }
    }
}
dependencies {
  compile 'com.android.support:multidex:1.0.0'
}

http://developer.android.com/tools/building/multidex.html

答案 2 :(得分:4)

随着android studio变得“足够聪明”,不再需要建议的方法。 实际上,当你使用minSdkVersion 21(旧方法)来加速使用dex的构建时间时,它会发出警告:

  

您不再需要开发模式来启用多重删除   开发,这可以减少API版本检查...

     

过去,我们的文档建议创建一个开发产品   具有minSdkVersion为21的flavor,以便启用多索引   在开发过程中显着加快构建速度。那个解决方法   不再需要,它有一些严重的缺点,如   打破API访问检查(因为真正的minSdkVersion是没有   更久以来。)在最新版本的IDE和Gradle插件中,   IDE自动传递连接设备的API级别   用于部署,如果该设备至少是API 21,那么   multidexing会自动打开,这意味着你会得到相同的结果   速度有益于开发产品的味道,但没有缺点。

答案 3 :(得分:0)

是的,它甚至可以与Lollipop之前的Android版本的multidex支持库一起使用,只需一点技巧。

首先在build.gradle中为调试版本指定multiDexEnabled

buildTypes {
    ...
    debug {
        ...
        multiDexEnabled true
    }
}

然后在AndroidManifest.xml下创建一个src/debug文件。

src/debug/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools">

    <application
        android:name="android.support.multidex.MultiDexApplication"
        tools:replace="android:name"/>

</manifest>

应该可以解决问题。如果您的应用程序使用自定义应用程序类,则必须创建该应用程序类的子类,并在清单中指定该子类的名称。

应用程序子类应如下所示:

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