web-dev-qa-db-fra.com

gradle - Android Studio build application multidex trop lente

Lorsque j'ajoute à mon projet le multidex: true et que je crée une classe Application qui s'étend de MultiDexApplication, le temps de construction de mon projet est passé de 20 secondes à environ 90 secondes. Comment faire plus rapidement?

Si vous êtes comme moi qui a déjà essayé la solution de Vic Vu mais ne pouvez toujours pas éviter d'activer multiDex, vous pouvez essayer ceci (tant que vous utilisez un appareil qui a Android 5.0 et supérieur).

Remarque Cela ne fera qu'accélérer votre build de développement. Votre production sera toujours lente.

Fondamentalement, vous devez introduire 2 versions de produit, une pour dev et une pour prod.

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

Et j'ai une classe qui étend Application donc j'ai dû remplacer attachBaseContext()

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

Si vous n'étendez pas Application utilisez simplement MultiDexApplication dans votre balise AndroidManifest.xmlapplication.

Assurez-vous que dans votre Android Studio Build Variants Vous pointez sur devDebug.

Lisez les instructions complètes ici https://developer.Android.com/studio/build/multidex.html#dev-build

26
Mark Pazon

Fournir comme réponse car cela correspond mieux à la mise en forme.

Pour répondre simplement à votre question: Non, il n'y a aucun moyen. Multidex est un processus destiné à aider à lever la charge de la limite de la méthode 65k. Ce processus est compliqué et rendra simplement vos temps de construction plus longs.

Le mieux que vous puissiez faire est de réduire le nombre de méthodes.

Dans votre build.gradle ( fourni ici ) vous utilisez:

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

Mais si vous regardez l'api des services de jeu les plus récents, vous pouvez choisir les services dont vous avez réellement besoin.

Regardez le tableau 1 sur cette page .

N'utilisez que ceux dont vous avez besoin. Les services Google Play dans leur ensemble se situent autour de 30 000 méthodes.

Cela devrait aider.

25
VicVu

Le multidexing utilise plus de mémoire. Au fur et à mesure que vous vous rapprochez de la taille maximale de votre tas dans Java, vous trouverez Java passe plus de temps à faire du GC qu'à faire du vrai travail, cela peut ralentir beaucoup de choses.

Je recommande fortement d'augmenter la taille maximale du tas lors de l'utilisation de multidex. Ajoutez ce qui suit à la fermeture Android de votre fichier build.gradle pour rendre la taille de segment de mémoire maximale de 4 Go (agrandissez-la si vous le souhaitez):

dexOptions {
    javaMaxHeapSize "4g"
}
2
Will Calderwood

Ça dépend.

Vous ne l'avez pas spécifié dans votre question, mais si vous voulez simplement accélérer vos développements builds - alors vous pouvez éviter le travail supplémentaire. La documentation officielle comprend un section entière à ce sujet.

1
Alex Lipov