2016-01-26 5 views
40

Qual è l'ambito di dipendenza apt nei file gradle di Android che vedo a volte?ambito di dipendenza apt in gradle Android: a cosa serve?

Un esempio è simile a questo?

apply plugin: 'com.android.application' 
apply plugin: 'com.neenbedankt.android-apt' 
android { 
    compileSdkVersion 20 
    buildToolsVersion '20.0.0' 
    defaultConfig { 
     applicationId "org.ligboy.test.card.module1" 
     minSdkVersion 14 
     targetSdkVersion 20 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      runProguard false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

final DAGGER_VERSION = '2.0.2' 

dependencies { 
    compile "com.google.dagger:dagger:${DAGGER_VERSION}" 
    apt "com.google.dagger:dagger-compiler:${DAGGER_VERSION}"//what is this scope 
    provided 'org.glassfish:javax.annotation:10.0-b28' 
} 

e nel build.gradle livello superiore di file ha questa dipendenza globale:

buildscript { 
dependencies { 
     classpath 'com.android.tools.build:gradle:1.3.0' 
     classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' 
    } 
} 

avviso nella sezione dipendenze v'è un campo di applicazione apt? Conosco solo la compilazione, il pacchetto e l'ambito fornito. compila include la dipendenza in fase di compilazione e nel tuo pacchetto, a condizione che solo includa la libreria in fase di compilazione e la scartini al tempo di pacchetto quindi non inclusa nella compilazione finale. e Package è il contrario, include la dipendenza nel pacchetto e non al momento della compilazione. Ma qual è l'ambito di dipendenza apt che ovviamente abbiamo bisogno di com.neenbedankt.android-apt affinchè funzioni, quindi so che è basato su Android.

aggiornamento: perché sopraelevazione io uso fornito portata dipendenza anziché apt portata? Come si differenziano?

ho creato un tutorial su dagger dependency scopes per coloro che hanno bisogno di maggiori informazioni.

risposta

65

Dal android-apt project page:

l'androide-apt assist di plugin a lavorare con i processori di annotazione in combinazione con Android Studio. Ha due scopi:

  • accettano per configurare un momento della compilazione unico processore annotazione come una dipendenza, senza contare l'artefatto nel APK finale o biblioteca

  • impostare i percorsi di origine in modo che il codice che è generato dal processore di annotazione viene correttamente rilevato da Android Studio.

Si utilizza Dagger, che utilizza l'elaborazione di annotazione per generare il codice. Il codice di elaborazione delle annotazioni non deve essere incluso nell'APK finale e desideri che il codice generato sia visibile su Android Studio. android-apt attiva questo comportamento.

Questo suona molto simile all'ambito provided, ma apt differisce da provided in alcuni modi chiave. La prima differenza è che il codice generato da una dipendenza apt è disponibile per l'IDE, mentre il codice generato da una dipendenza provided non lo è.

Un'altra importante differenza è che il codice in una libreria utilizzando il campo di applicazione provided è sul classpath IDE (cioè è possibile importare le classi e tentare di usarli), mentre il codice in un apt dipendenza non è. Con provided, il codice si arresta in modo anomalo in fase di runtime se non si forniscono effettivamente le dipendenze di riferimento con una controparte con ambito compile.

È possibile trovare una discussione su apt vs provided su this android-apt issue.

Nel caso di Dagger, non vi è alcun motivo per includere il processore di annotazione e il generatore di codice in uno qualsiasi dei codici (consentito dall'ambito provided). Pertanto lo scope apt è più appropriato.

Aggiornamento per ottobre 2016: Probabilmente non hanno bisogno apt e il plugin android-apt più. La versione 2.2 del plugin Gradle per Android ha una configurazione annotationProcessor che dovresti usare al suo posto.

saperne di più visita What's next for android-apt?

+0

e perché non posso usare "fornito" in questo caso anziché apt? Penso che se tu rispondessi, questo mi avrebbe chiarito le cose. – j2emanue

+0

Aggiunta una spiegazione sulle differenze. –

+0

Brillante. Uso anche "org.glassfish: javax.annotation: 10.0-b28" nel gradle. pensi che sarebbe meglio renderlo un ambito adatto? in questo modo nessuno dei generatori viene incluso nel codice, giusto? – j2emanue

8

Giusto per aggiungere come cambiare questo in Studio 2,2 +

dependencies { 
    compile 'com.google.dagger:dagger:2.4' 
    annotationProcessor "com.google.dagger:dagger-compiler:2.4" 
} 

Aggiungere questo app modulo Gradle. Non c'è bisogno di cambiare nessuna altra cosa.

Felice codifica :)