2015-01-16 15 views
32

ho esportato il mio progetto da Eclipse e importati per Android Studio utilizzando le istruzioni contenute in questo link: http://developer.android.com/sdk/installing/migrate.htmlAndroid Studio: Duplicare file copiati in APK META-INF/DIPENDENZE quando compilare

Quando costruisco, ho un errore:

Duplicate files copied in APK META-INF/DEPENDENCIES 

Dopo la ricerca, ho trovato una soluzione: aggiungere

packagingOptions { 
    exclude 'META-INF/DEPENDENCIES' 
} 

in build.gradle. E funziona!

Ma non capisco perché ho avuto questo errore e perché ho dovuto applicare quella correzione. Qualcuno può spiegare?

+1

Ho appena aggiornato Android Studio 2.2 e ho ricevuto questo errore. È stato corretto cambiando "META-INF/DEPENDENCIES.txt" in "META-INF/DEPENDENCIES". –

+0

Lo stesso per me dopo Android Studio 2.2 ma invece con "META-INF/LICENCE" – aez

+0

Quando aggiungo questa linea, si blocca solo per l'eternità durante la creazione del progetto? – Dan

risposta

33

In build Android Gradle, non è consentito includere lo stesso file con lo stesso percorso più di una volta nell'output. Nella tua build, c'erano due file META-INF/DEPENDENCIES provenienti da luoghi diversi. Dal momento che non hai affatto bisogno di questo file nella tua applicazione, la cosa più semplice da fare è dire al sistema di build di ignorarlo del tutto, che è ciò che fa questa direttiva exclude.

C'è anche una direttiva pickFirst per comunicare al sistema di generazione di conservare uno delle copie; c'è una piccola quantità di dettagli su questo in Android Gradle plugin 0.7.0: "duplicate files during packaging of APK".

Le build di Android in Gradle sono piuttosto rigide riguardo ai file duplicati, che possono rendere la vita difficile. C'è un problema simile se si include la stessa classe Java più di una volta, in cui si ottiene l'errore "Definisci file multipli dex" (vedere Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat) per un esempio tipico).

Altri sistemi di costruzione sono più indulgenti. È tipico di Java che, se si include la stessa classe più di una volta in un classpath, ad esempio, la prima copia che vede è quella che viene utilizzata; i duplicati successivi vengono ignorati. Questo è in molti casi più facile da gestire, ma ha un paio di problemi. Il più grande è che ci possono essere errori sottili se più versioni differenti di un file si insinuano nella build senza che tu lo sappia - può essere difficile capire cosa sta succedendo. Quando lo capisci, di solito puoi risolverlo manipolando l'ordine in cui sono incluse le cose per assicurarti che quello che vuoi arrivi all'output finale, ma in build molto complesse, questo può essere difficile da raggiungere, e può succedere che fare cose apparentemente non correlate come includere nuove librerie nel tuo progetto possa stravolgere l'ordine e portare a molti guai.

Per questo motivo, Gradle ha la filosofia di non affidarsi all'ordinamento delle cose per determinare i "vincitori" nel gioco della risoluzione dei duplicati e costringe lo sviluppatore a rendere esplicite tutte le dipendenze. L'implementazione di Android del suo sistema di costruzione su Gradle segue quella filosofia.

+0

Grazie per il tuo aiuto.
Ma non so perché c'erano due file META-INF/DEPENDENCIES nella mia build. Il messaggio mostra che i file duplicati si trovano nella stessa posizione.
' Esecuzione non riuscita per l'attività ': packageDebug'. > I file duplicati copiati in APK META-INF/Dipendenze \t file 1: D: \ Studio \ Android \ Android Studio \ MyProject \ libs \ apache-mime4j-core-0.7.2.jar \t File 2: D: \ Studio \ Android \ AndroidStudio \ MyProject \ libs \ apache-mime4j-core-0.7.2.jar ' Android Studio lo ha generato automaticamente? – TrungNVT

+0

Questa è davvero una bella domanda - non lo so. L'ho visto prima, ma non ho mai provato a capirlo. –

58

Mentre la risposta di Scott Barta è corretta, è manca una soluzione semplice e comune: basta aggiungere

android { 
    packagingOptions { 
     exclude 'META-INF/DEPENDENCIES' 
     exclude 'META-INF/NOTICE' 
     exclude 'META-INF/LICENSE' 
     exclude 'META-INF/LICENSE.txt' 
     exclude 'META-INF/NOTICE.txt' 
    } 
} 

al tuo build.gradle di ignorare questi doppioni.

+0

Stavo riscontrando questo problema in Android Studio 2.2.2 (11/2016) e non sono riuscito a farcelo compilare. Avevo appena aggiornato a AnddroidStudio 2.2.2 e aggiungendo queste modifiche l'ho risolto e finalmente Gradle è stato costruito e sono riuscito a eseguire il mio progetto. Ho delle dipendenze su Firebase e Admobs. Grazie – raddevus

+0

grazie! ha funzionato –

+0

'pickFirst' funziona anche al posto di' exclude'. Inoltre, se hai altri errori simili, aggiungi anche quelli. Per esempio, ho dovuto aggiungere 'pickFirst'META-INF/plexus/components.xml'' – CorayThan

6

La soluzione più semplice è quello di aggiungere

packagingOptions { 
    pickFirst 'META-INF/*' 
} 

al vostro build.gradle nella sezione Android

+0

Ottimo! Suppongo che tu possa anche fare 'pickFirst 'META-INF/**'' per le sottocartelle, sebbene di solito non ci siano sottocartelle. –

0

Nel caso in cui nessuno abbia questi problemi durante il caricamento di nuovo.apk su Google Play Store, dopo aver aggiornato Android Studio;

click V1 Jar Firma non completa Apk Firma durante la generazione di nuovo con il vecchio Apk Keystore

V1 Jar Signature

enter image description here

1

Il modo più semplice che ho trovato per risolvere questo problema è quello di usa un carattere jolly, quindi non ti ritrovi a dover dichiarare manualmente ogni file in conflitto.

packagingOptions { 
    pickFirst '**' 
} 
Problemi correlati