Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以只在Android调试版本中启用multidex吗?_Android_Performance_Android Multidex - Fatal编程技术网

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

我可以只在Android调试版本中启用multidex吗?,android,performance,android-multidex,Android,Performance,Android Multidex,亲爱的, 我在许多博客文章中读到,multidex应用程序的启动速度比普通应用程序慢。 我的应用程序使用了很多超过64k方法的库,所以我使用了multidex。但是,当我在发布版本中使用proguard时,最终的apk将小于64k方法 所以我的问题是:我能否在Android调试构建中启用multidex,这样就不会出现运行时错误?在发布版本中禁用multi-dex,因为我不需要它 如果是,如何进行 如果不是,Android是否足够聪明,能够加快启动速度,因为它应该认识到即使是multi-dex应

亲爱的, 我在许多博客文章中读到,multidex应用程序的启动速度比普通应用程序慢。 我的应用程序使用了很多超过64k方法的库,所以我使用了multidex。但是,当我在发布版本中使用proguard时,最终的apk将小于64k方法

所以我的问题是:我能否在Android调试构建中启用multidex,这样就不会出现运行时错误?在发布版本中禁用multi-dex,因为我不需要它

如果是,如何进行


如果不是,Android是否足够聪明,能够加快启动速度,因为它应该认识到即使是multi-dex应用程序,应用程序也没有超过64k?

是的,你可以。当您声明BuildType仅包含用于调试的multidex时:

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

您可以将min sdk版本更改为21 only for debug,而不是仅为调试启用multidex,这样gradle就可以使用ART加快索引速度:

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'
}

随着android studio变得“足够聪明”,建议的方法不再需要了。 事实上,当您使用minsdkversion21(旧方法)使用dex加快构建时间时,它现在会给您一个警告:

您不再需要dev模式来在运行期间启用多索引 开发,这可以打破API版本检查更少

在过去,我们的文档建议创建一个dev产品 flavor with的minsdk版本为21,以便启用多重索引 在开发过程中显著加快构建速度。解决办法 现在已经没有必要了,而且它还有一些严重的缺点,比如 中断API访问检查(因为真实版本不是 在最新版本的IDE和Gradle插件中, IDE自动传递所连接设备的API级别 用于部署,如果该设备至少为API 21,则 多重索引将自动启用,这意味着您将获得相同的结果 与开发产品风格一样,速度有好处,但没有缺点


是的,它甚至可以在棒棒糖之前的Android版本的multidex支持库中使用,不过需要一些技巧

首先为debug-build-in-build.gradle指定
multiDexEnabled

buildTypes {
    ...
    debug {
        ...
        multiDexEnabled true
    }
}
然后在
src/debug
下创建一个
AndroidManifest.xml
文件

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>

但是你仍然必须(有条件地,基于
BuildConfig.DEBUG
的值)在代码中调用
MultiDex.install(this)
,对吗?@KonradMorawski对于Android 5及以上版本不是必需的,我相信你可以省略
multiDexEnabled false
对于
release
@Mygod,是的,你不必为release指定,默认值为false。嗨!你在哪里找到这句话的?谢谢大家!@orospakr我认为这是Android Studio在构建文件中发出的警告消息,这就是我从中得到它的原因我认为在调试构建中仅使用multidex的目的是,当应用程序超过65k方法限制时,只有调试构建会受到影响(除非应用程序非常庞大)因为混淆和收缩发生在发布版本中。这不再需要了。最新版本的工具检测连接的设备/仿真器的API级别,并执行必要的多索引。您可以通过消除其他特性来进一步简化此解决方案。相反,您可以直接在
debug
块中更改
minSdkVersion
设置,就像完成一样。
public class MyDebugApplication extends MyApplication {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}