2016-07-05 86 views
5

Ogni volta che costruisco per progetto e preparo per il lancio sul mio dispositivo, continuo a ricevere questo errore:Gradle generazione non riuscita: file Dex non possono superare i 64 k

Error:The number of method references in a .dex file cannot exceed 64K. Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html

Inoltre, ottengo questo errore:

Error:Execution failed for task ':app:transformClassesWithDexForDebug'. com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_91\bin\java.exe'' finished with non-zero exit value 2

E dice accumulo Gradle riuscito con due errori

Così ho alcune domande:

  • Cosa sono i file dex
  • Non li sto usando direttamente, quindi perché ottengo gli errori sopra?
  • Cosa sono nei file DEX?
  • Questi file hanno qualcosa da dire per le dimensioni del file .APK?

Questi errori hanno ripreso a comparire dopo che ho smesso di usare proguard per i build di debug, come StackTrace non mostrava e appena prima di attivare Proguard ho avuto l'errore.

Ho avuto questo errore una volta prima e ho eliminato la cartella dex e lo ha risolto ma ora non è più abbastanza improvvisamente.

mio file Gradle:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.3" 

    defaultConfig { 
     applicationId "com.example.myproject" 
     minSdkVersion 15 
     targetSdkVersion 23 

    } 

    buildTypes { 
     release { 
      minifyEnabled true 
      shrinkResources true 

      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 

    } 
} 

dependencies { 

    compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha1' 
    compile 'com.android.support:support-v4:23.3.0' 
    compile 'com.google.android.gms:play-services:9.2.0' 
    compile 'com.google.android.gms:play-services-ads:9.2.0' 
} 
+1

Dovresti ** non usare mai ** la piena dipendenza 'play-services'. Utilizza solo [selezionare Play Services APIs di cui hai bisogno] (https://developers.google.com/android/guides/setup#split). Includere l'intera cosa è 45k + del limite del metodo 64k. – ianhanniballake

risposta

4

Più dipendenze si aggiunge - più alto è il valore del metodo. Cambia la tua Gradle per riflettere questo:

defaultConfig { 
    ... 
    minSdkVersion 15 
    targetSdkVersion 23 
    ... 

    // Enabling multidex support. 
    multiDexEnabled true 
} 

Questa è una correzione dritto in avanti, e funziona solo se si minSdkVerison è di 14 o superiore. aggiungere anche i seguenti dipendenze:

dependencies { 
    compile 'com.android.support:multidex:1.0.0' 
} 

A volte, le dipendenze che si leva sarà (singolarmente) Riferimento le stesse librerie - si possono avere molti metodi che sono raddoppiati, triplicati, quadruple, ecc ... Check out this SO risposta per risolvere questo e ridurre sempre la dimensione dell'APK. gradle - library duplicates in dependencies

+0

Influisce sulla dimensione dell'APK? – Zoe

+0

Leggi l'articolo nel messaggio di errore per intero - è tutto molto intuitivo! Per rispondere a questo commento però: https://developer.android.com/studio/build/multidex.html#dev-build – apelsoczi

+0

Funziona ora! Grazie – Zoe

1

Da Google documentazione:

Android application (APK) files contain executable bytecode files in the form of Dalvik Executable (DEX) files, which contain the compiled code used to run your app. The Dalvik Executable specification limits the total number of methods that can be referenced within a single DEX file to 65,536—including Android framework methods, library methods, and methods in your own code.

Per risolvere questo problema è necessario apportare modifiche a seguito nel codice:

build.gradle

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.0" 

    defaultConfig { 
     ... 
     minSdkVersion 14 
     targetSdkVersion 21 
     ... 

     // Enabling multidex support. 
     multiDexEnabled true 
    } 
    ... 
} 

dependencies { 
    compile 'com.android.support:multidex:1.0.0' 
} 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.android.multidex.myapplication"> 
    <application 
     ... 
     android:name="android.support.multidex.MultiDexApplication"> 
     ... 
    </application> 
</manifest> 

When these configuration settings are added to an app, the Android build tools construct a primary dex (classes.dex) and supporting (classes2.dex, classes3.dex) as needed. The build system will then package them into an APK file for distribution.

Si prega di notare: Se si dispone già di classe nel codice che si estende dalla classe Application poi basta cambiare per estendersi da MultidexApplication.

0

I servizi di riproduzione lib è abbastanza grande. Anche una piccola app può soffrire di questo problema.Dopo aver utilizzato Proguard, il problema scompare a causa delle ottimizzazioni che rimuovono le cose inutilizzate. Per lo sviluppo (build di debug) - limitare le librerie solo a ciò che si sta realmente utilizzando di solito aiuta. Puoi provare a restringere la libreria o/e usare il filtro 'exclude' nell'istruzione gradle compile().

Per esempio, quando ne avevo bisogno per i servizi di localizzazione, ho usato:

compile 'com.google.android.gms:play-services:10.2.0' 

in un primo momento e ci hanno dato quel messaggio. Sostituito con il

compile 'com.google.android.gms:play-services-location:10.2.0' 

e ottenuto risolto con grazia.