2015-02-12 12 views
39

Mentre si aggiungono nuove dipendenze al progetto Android, specialmente in Android Studio in Dependencies ci sono tre opzioni di ambito Compile/Fornito/APK.Compile, fornito, APK - ambito di dipendenza Android

Quali sono gli effetti della scelta di ciascuno, quando dovremmo usarli? Oltre a ciò che dice il nome.

EDIT:

"Gestire correttamente 'fornito' e ambiti di 'pacchetto' di fare quello che dovrebbero fare 'fornito' e 'pacchetto' non può essere utilizzato con Android Biblioteche, e genererà un errore" .. questo è da http://tools.android.com/tech-docs/new-build-system

+0

di chiarire la mia taglia attualmente aperto, se si utilizza la finestra di dialogo Struttura del progetto in Android Studio per lavorare con le dipendenze, c'è un menu a tendina "Ambito". La maggior parte degli elementi in questo menu a discesa ha senso. Uno che non è "APK". Se lo scegli, finisci con qualcosa come 'dependencies {apk 'de.greenrobot: eventbus: 2.4.0'}' in 'build.gradle'. Tuttavia, non è chiaro cosa significhi effettivamente questo ambito, in termini di ciò che verrà fatto con la dipendenza. – CommonsWare

risposta

41
  • provided - a tempo di compilazione solo dipendenza
  • package - unico pacchetto tempo dipendenza
  • compile - di compilazione dipendenza dal tempo e dal pacchetto

provided viene comunemente utilizzato per le librerie basate sull'elaborazione delle annotazioni. Solitamente queste librerie sono separate in due artefatti: "annotazione" e "compilatore". "compiler" è la dipendenza provided perché non è necessario utilizzarlo nell'applicazione, solo per la compilazione; e "annotation" è la dipendenza compile - viene utilizzata nel codice dell'applicazione e quindi compila. O il codice generato può richiedere dipendenze aggiuntive mentre l'applicazione non può. Per esempio. Configurazione dipendenze pugnale:

compile 'com.squareup.dagger:dagger:1.2.2' 
provided 'com.squareup.dagger:dagger-compiler:1.2.2' 
+0

Quindi in Android dobbiamo dichiarare questo per far funzionare il pugnale: fornito 'org.glassfish: javax.annotation: 10.0-b28' quindi vuol dire che il dispositivo non avrà questo codice, è solo per il tempo di compilazione dei metodi/classi non sono più inclusi nel dispositivo? – j2emanue

+0

puoi spiegare un po 'quale dipendenza del tempo del pacchetto è solo? Sei sicuro che sia ancora usato? – j2emanue

+0

@ j2emanue sì solo per il tempo del pacchetto. Questa particolare dipendenza è necessaria per il processore di annotazioni per generare le classi di risultati per quanto mi ricordo. Non sarà pacchettizzato nell'apk di output. –

16

Xavier parla here sulla ambito APK.

nel plug-in Android, L'equivalente (sorta di) di runtime è chiamato apk. Si può fare

dipendenze { file APK ('libs/foo.jar') }

e otterrà l'imballo, ma non sarà sul classpath compilazione.

+0

Sembra che sia così. Sono un po 'confuso perché qualcuno lo vorrebbe, ma forse non sono abbastanza creativo. Grazie molto! – CommonsWare

+0

Solo indovinando qui, ma potresti volere un vaso diverso per ciascuno dei tuoi gusti (ad esempio, per diverse architetture)? – aows

+1

Userai 'flavor1Compile',' flavor2Compile', ecc. Per quelli (dove 'flavor1' e' flavor2' sono i tuoi gusti). – CommonsWare

32

Queste proprietà provengono da maven scopes.

Indicano semplicemente come trattare particolari dipendenze durante ogni fase del processo di generazione.

  1. compile - un approccio di default, significa semplicemente che tutte le dipendenze dovrebbero essere disponibili a tempo di compilazione. Le dipendenze di compilazione sono disponibili in tutti i percorsi di classe di un progetto. Inoltre, tali dipendenze vengono propagate a progetti dipendenti. Generalmente è richiesta una dipendenza in fase di compilazione in fase di runtime.

  2. package - dichiara la configurazione aggiuntiva per la creazione di un'applicazione. È possibile elencare plug-in che aggiungono funzionalità aggiuntive al processo di compilazione.

  3. provided - significa che l'ambiente di runtime include queste dipendenze. Ad esempio, quando guardi all'interno della libreria android.jar, vedrai java.lang.RuntimeException: Stub! in ogni corpo del metodo.

    che ha alcune conseguenze:

    • È possibile sviluppare applicazioni Android a livello locale, senza dover ambiente Android completa.
    • Il tuo APK è necessario eseguirlo su un dispositivo Android o un emulatore perché fornire l'implementazione di questi metodi.
    • Le app che fanno riferimento alle classi SDK verranno create correttamente, poiché il jar fornisce i metadati della classe.
    • Se non si utilizza una libreria che fornisce artefatti (ad esempio Robolectric), è necessario eseguire test sul proprio emulatore/dispositivo.

provided e package non può essere utilizzato con Android Biblioteche, e genererà un errore.

Ecco come sourceSet assomiglia:

enter image description here

Maggiori informazioni su sistema di compilazione: https://www.youtube.com/watch?v=LCJAgPkpmR0

Un articolo impressionante su Gradle: http://www.sinking.in/blog/provided-scope-in-gradle/

Problemi correlati