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

问题描述 投票:15回答:4

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

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

如果有,怎么样?

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

android performance multidex android-multidex
4个回答
20
投票

是的你可以。当您声明buildTypes仅包含针对debug的multidex时:

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

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


3
投票

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

您不再需要开发模式来在开发期间启用多dexing,这可以减少API版本检查...

在过去,我们的文档建议创建一个dev产品风格,其minSdkVersion为21,以便在开发过程中实现多索引以显着加快构建。不再需要这种解决方法,并且它有一些严重的缺点,例如打破API访问检查(因为不再知道真正的minSdkVersion。)在最新版本的IDE和Gradle插件中,IDE自动传递API级别用于部署的连接设备,如果该设备至少是API 21,则会自动打开多索引,这意味着您可以获得与开发产品风格相同的速度优势,但没有缺点。


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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.