2014-11-26 8 views
6

Ho un progetto Android che dipende da diversi moduli e ogni modulo dipende dalla revisione della libreria android support-v4In che modo gradle gestisce più moduli con diverse revisioni della libreria di supporto v4?

1) La mia app dipende anche dalla più recente libreria di supporto Android v4 (revisione 21) quindi in questo build.gralde ho messo una linea del genere:

dependencies { 
      compile 'com.android.support:support-v4:21.0.0' 
     } 

2) Facebook SDK modulo (v.3.15), che dipende anche dal supporto Android biblioteca v4, ma la revisione 13 e il suo file build.gradle dice:

dependencies { 
     compile 'com.android.support:support-v4:13.0.+' 
     compile files('../libs/bolts.jar') 
    } 

3) ed un altro modulo che, possiamo chiamare Module3 in questo caso, dipende anche dal supporto-v4 ma con una revisione diversa rispetto agli altri moduli, così:

dependencies { 
     compile 'com.android.support:support-v4:19.0.+' 
     compile files('../libs/bolts.jar') 
    } 

Domande:

1) In che modo gradle gestisce diverse revisioni di librerie support-v4?

2) Che cosa fa esattamente?

3) Che cosa significa in termini di dimensioni apk?

+0

"In che modo gradle gestisce diverse revisioni di librerie di supporto v4?" - a seconda delle impostazioni 'build.gradle'' compile', ne userà una che corrisponde a tutto, o fallirà la build. Nell'app può essere presente solo una copia di qualsiasi dipendenza, altrimenti si verificheranno collisioni sui nomi delle classi. – CommonsWare

+0

Puoi spiegarlo meglio per questo esempio, per favore? Significa che gradle usa l'ultima revisione per questo esempio? – Noodles

+0

Il mio istinto sarebbe che fallirebbe la compilazione, in quanto non esiste alcuna versione di quella libreria che è contemporaneamente tre versioni differenti. Ma, non ho giocato molto con questo scenario. Se hai già impostato, esegui un rapporto sulle dipendenze Gradle per vedere esattamente cosa utilizzerà: http://www.gradle.org/docs/current/userguide/tutorial_gradle_command_line.html (vedi "Elenco delle dipendenze del progetto") – CommonsWare

risposta

1

In questo caso Gradle fallirà la compilazione (testato sulla mia pelle e non ho trovato altre soluzioni) "Sfortunatamente" è necessario utilizzare la stessa versione di supporto su qualsiasi modulo.

Da docs.gradle.com:

Gradle offre le seguenti strategie di risoluzione dei conflitti:

  • nuovi: viene utilizzata la versione più recente della dipendenza. Questa è la strategia predefinita di Gradle ed è spesso una scelta appropriata a patto che le versioni siano compatibili con le versioni precedenti.

  • Fail: Un conflitto di versione provoca un errore di compilazione. Questa strategia richiede che tutti i conflitti di versione vengano risolti esplicitamente nello script di build. Consulta ResolutionStrategy per i dettagli su come scegliere esplicitamente una versione specifica.

Mentre le strategie introdotte sopra sono di solito abbastanza per risolvere la maggior parte dei conflitti, Gradle fornisce meccanismi più a grana fine di risolvere i conflitti di versione:

  • Configurazione di un primo livello di dipendenza forzata . Questo approccio è utile se la dipendenza dal conflitto è già una dipendenza di primo livello. Vedi esempi in DependencyHandler.

  • Configurazione di qualsiasi dipendenza (transitiva o meno) come forzata. Questo approccio è utile se la dipendenza dal conflitto è una dipendenza transitiva. Può anche essere usato per forzare le versioni delle dipendenze di primo livello.Vedi gli esempi in ResolutionStrategy

  • regole di dipendenza resolve sono una caratteristica introdotta in incubazione Gradle 1.4 che vi danno un controllo dettagliato rispetto alla versione selezionata per una particolare dipendenza.

Problemi correlati