2016-01-26 2 views
40

Was ist der APT-Abhängigkeitsbereich in android Gradle-Dateien, die ich manchmal sehe?apt Abhängigkeitsbereich in Android Gradle - wofür wird es verwendet?

Ein Beispiel sieht so aus?

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' 
} 

und in der obersten Ebene build.gradle Datei, die es diese globale Abhängigkeit hat:

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

Hinweis in den Abhängigkeiten Abschnitt ein apt Umfang ist? Ich kenne nur Kompilieren, Paket und bereitgestellten Umfang. Kompilieren enthält die Abhängigkeit zur Kompilierzeit und in Ihrem Paket, vorausgesetzt, sagt nur die Bibliothek zur Kompilierzeit enthalten und verwerfen es bei Paket Zeit, so dass es nicht im endgültigen Build enthalten ist. und Paket ist umgekehrt, es enthält die Abhängigkeit im Paket und nicht zur Kompilierzeit. Aber was ist ein Abhängigkeitsbereich, den wir offensichtlich brauchen, um die com.neenbedankt.android-apt zu arbeiten, damit ich seine android basierte kennen.

Update: warum kann ich benutze Abhängigkeit Umfang statt wie bisher apt Umfang? Wie unterscheiden sie sich?

Ich habe ein Tutorial auf dagger dependency scopes für diejenigen erstellt, die weitere Informationen benötigen.

Antwort

65

Vom android-apt project page:

Die Android-apt-Plugin hilft bei der Arbeit mit Annotation-Prozessoren in Kombination mit Android Studio. Es hat zwei Zwecke:

  • erlaubt eine Kompilierung nur Annotations-Prozessor als eine Abhängigkeit zu konfigurieren, ohne das Artefakt in der letzten APK oder Bibliothek

  • die Quellpfade einrichten, so dass Code, der ist generiert aus dem Annotationsprozessor wird von Android Studio korrekt aufgenommen.

Sie verwenden Dagger, die Annotation Verarbeitung Code zu generieren verwendet. Der Annotationsverarbeitungscode sollte nicht in der endgültigen APK enthalten sein und Sie möchten, dass der generierte Code für Android Studio sichtbar ist. android-apt aktiviert dieses Verhalten.

Dies klingt sehr ähnlich zu der provided Zielfernrohr, aber unterscheidet sich von provided in einigen wichtigen Punkten. Der erste Unterschied besteht darin, dass Code, der von einer apt-Abhängigkeit generiert wird, für die IDE verfügbar ist, während Code, der von einer provided-Abhängigkeit generiert wird, nicht verfügbar ist. Ein weiterer wichtiger Unterschied besteht darin, dass der Code in einer Bibliothek mit dem Bereich provided im IDE-Klassenpfad enthalten ist (d. H. Sie können die Klassen importieren und versuchen, sie zu verwenden), während Code in einer apt-Abhängigkeit nicht gilt. Mit provided stürzt Ihr Code zur Laufzeit ab, wenn Sie die referenzierten Abhängigkeiten nicht mit einem bereichsübergreifenden Gegenstück compile bereitstellen.

Sie können eine Diskussion über vs provided auf this android-apt issue finden.

Im Falle von Dolch sollte es keinen Grund geben, den Annotationsprozessor und den Code-Generator in irgendeinen Ihres Codes einzubinden (was der provided Umfang erlauben würde). Daher ist der Bereich apt geeigneter.

-Update für den Monat Oktober 2016: Sie wahrscheinlich apt nicht brauchen und die android-apt Plugin mehr. Version 2.2 des Android Gradle Plugins hat eine annotationProcessor Konfiguration, die Sie stattdessen verwenden sollten.

Mehr unter What's next for android-apt?

+0

und warum kann ich nicht in diesem Fall "zur Verfügung gestellt" statt apt? Ich denke, wenn Sie geantwortet haben, dass es Dinge für mich klären würde. – j2emanue

+0

Eine Erklärung zu den Unterschieden hinzugefügt. –

+0

Brilliant. Ich verwende auch 'org.glassfish: javax.annotation: 10.0-b28' in Großbuchstaben. Denkst du, es wäre besser, es zu einem geeigneten Bereich zu machen? Auf diese Weise wird keiner der Generatoren in den Code aufgenommen, richtig? – j2emanue

8

einfach hinzufügen, wie diese 2.2 in Studio ändern +

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

Fügen Sie diese in Anwendungen gradle Modul. Keine Notwendigkeit, etwas anderes zu ändern.

Happy coding :)