25

当我将 multidex:true 添加到我的项目中,并创建一个从 MultiDexApplication 扩展的应用程序类时,我的项目构建时间从 20 秒到大约 90 秒。如何更快地做一些?

4

4 回答 4

27

如果你像我一样已经尝试过 Vic Vu 的解决方案,但仍然无法避免启用 multiDex,那么你可以试试这个(只要你使用的是 Android 5.0 及更高版本的设备)。

注意这只会加快您的开发构建。您的生产构建仍然会很慢。

基本上你需要介绍 2 种产品风味dev,一种用于prod.

添加multiDexEnabled true

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'
        }
        defaultConfig {
            applicationId "com.something.something"
            targetSdkVersion 23
            versionCode 1
            versionName "1.0.0"

            multiDexEnabled true
        }
    }
dependencies {
  compile 'com.android.support:multidex:1.0.1'
}

我有一个扩展的类,Application所以我不得不重写attachBaseContext()

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}

如果您不扩展,Application只需MultiDexApplicationAndroidManifest.xml application标签中使用。

确保在您的 Android Studio 中Build Variants您指向devDebug.

在此处阅读完整说明https://developer.android.com/studio/build/multidex.html#dev-build

于 2015-11-05T02:54:23.423 回答
25

提供作为答案,因为这更适合格式。

简单地回答你的问题:不,没有办法。Multidex 是一个旨在帮助减轻 65k 方法限制的负担的过程。这个过程很复杂,只会使您的构建时间更长。

您能做的最好的事情就是减少您的方法计数。

在您的 build.gradle (在此处提供)中,您正在使用:

`compile 'com.google.android.gms:play-services:8.3.0'`

但是,如果您查看最新的播放服务 api,您可以选择您实际需要的服务。

查看此页上的表 1 。

只使用你需要的那些。Google play 服务作为一个整体大约有 30k 种方法。

那应该有帮助。

于 2015-05-11T23:53:54.103 回答
2

多索引使用更多内存。当您接近 Java 中的最大堆大小时,您会发现 Java 花费在 GC 上的时间比做任何实际工作的时间都多,这会大大减慢速度。

我强烈建议在使用 multidex 时增加最大堆大小。将以下内容添加到 build.gradle 文件中的 android 闭包中,以使最大堆大小为 4GB(如果您愿意,可以将其变大/变小):

dexOptions {
    javaMaxHeapSize "4g"
}
于 2015-09-30T09:52:30.690 回答
1

这取决于。

您没有在问题中指定它,但如果您只是想加快开发构建 - 那么您可以避免额外的工作。官方文档包括有关此的整个部分

于 2015-06-05T22:02:39.990 回答