2015-05-11 4 views
24

Quando aggiungo al mio progetto il multidex: true, e faccio una classe Application che si estende da MultiDexApplication, il mio tempo di costruzione del progetto è passato da 20 secondi a circa 90 sec.Come fare un po 'più veloce?gradle - Android Studio build un'applicazione multidex troppo lenta

+0

per quanto ne so, non c'è modo per renderlo più veloce. L'unica soluzione è ridurre il numero di metodi nella tua app e sbarazzarti di 'MultiDex'. Anche la documentazione ufficiale dice * Ciò significa che le build di routine eseguite come parte del processo di sviluppo con Multidex richiedono più tempo e possono potenzialmente rallentare il processo di sviluppo. * –

+0

Sei sicuro che tutte le librerie importate siano davvero necessarie per la tua app? Se no puoi rimuovere qualcosa ed evitare multidex – aorlando

+0

Ho bisogno di fare questo, quando aggiungi alle dipendenze tutte le librerie per google calendar api. In questo tema descrivo il suo problema: http://stackoverflow.com/questions/30104925/multidex-issue-execution-failed-for-task-appdexdebug. Forse tu ora come intorno al multidex? Penso che questo possa essere evitato, ma ora non ho altri metodi. Grazie) –

risposta

26

Se siete come me che hanno già provato la soluzione di Vic Vu ma non puoi ancora evitare l'abilitazione di multiDex, quindi puoi provare questo (a condizione che tu stia utilizzando un dispositivo con Android 5.0 e versioni successive).

Nota Ciò accelera solo la generazione di sviluppo. La tua produzione sarà ancora lenta.

Fondamentalmente è necessario introdurre 2 sapori prodotto uno per dev e uno per prod.

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

E ho una classe che estende Application così ho dovuto ignorare attachBaseContext()

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

Se non si sta estendendo Application semplicemente utilizzare MultiDexApplication nel tag AndroidManifest.xmlapplication.

Verificare che nel proprio Studio Android Build Variants si punta a devDebug.

Leggere le istruzioni complete qui https://developer.android.com/studio/build/multidex.html#dev-build

+0

dove si inserisce l'estensione Application di ClassClass? perché non so dove mettere – delive

+0

Creare una classe preferibilmente nel pacchetto radice (ad esempio 'com.something.something.MyApplication'). Lasciate classe '' MyApplication' estendere Application' (es. 'MyApplication public class estende Application {...}' . Dichiarare Questa classe nel vostro AndroidManifest nel 'application' tag. (Es.' ..... ' –

+0

Non riesco a vedere, mi dispiace, puoi postare qualsiasi tutorial? ora corro senza questa classe che si estende da Aplication (e sembra funziona), e io non so se mettere in root -/java/here o java/package/here .è meglio qualsiasi guida grazie – delive

24

Fornire come risposta perché questo si adatta meglio alla formattazione.

Per rispondere semplicemente alla tua domanda: No, non c'è modo. Multidex è un processo pensato per contribuire a sollevare il carico del limite del metodo 65k. Questo processo è complicato e renderà semplicemente i tuoi tempi di costruzione più lunghi.

Il meglio che si può fare è ridurre il numero di metodi.

Nella tua build.gradle (supplied here) che si sta utilizzando:

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

Ma se si guarda al servizi di gioco più recente api si può scegliere quali servizi è effettivamente necessario.

Vedere tabella 1 on this page.

Utilizzare solo quelli necessari. I servizi di Google Play nel loro complesso sono da qualche parte intorno ai metodi 30k.

Questo dovrebbe aiutare.

+0

Grazie, il suo lavoro. –

+3

Grazie, mi hai salvato dalla morte di noioso. Aggiungendo solo il portafoglio, i servizi di accesso lo mantengono sotto i 30 k metodi. – vktr

+0

Come accennato da Mark Pazon in un'altra risposta, la soluzione è spiegata qui http://developer.android.com/tools/building/multidex.html in "Ottimizzazione delle configurazioni di sviluppo Multidex" – agirardello

1

Dipende.

Non è stato specificato nella domanda, ma se si desidera solo velocizzare le build dello sviluppo , è possibile evitare il lavoro extra. La documentazione ufficiale include uno whole section.

2

Il multidexing utilizza più memoria. Man mano che ci si avvicina alla dimensione massima dell'heap in Java, Java impiegherà più tempo a fare GC di quanto non faccia un vero lavoro, questo può rallentare molto le cose.

Consiglio vivamente di aumentare la dimensione massima dell'heap quando si utilizza Multidex. Aggiungere il seguente alla chiusura Android nel file build.gradle per rendere la dimensione massima heap 4GB (renderlo più grande/piccolo se lo si desidera):

dexOptions { 
    javaMaxHeapSize "4g" 
}