2016-06-20 2 views
1

Ich versuche, ein Gradle-Plugin zu erstellen, das Quellcode für bestimmte Varianten generiert. Das Ausgabeverzeichnis dieser Generierungstasks muss der Quellengruppe der entsprechenden Variante hinzugefügt werden.Hinzufügen zu Build-Variante Source-Set innerhalb von AfterEvaluate

Zur Zeit bin ich dies innerhalb eines afterEvaluate Block tun (in der build.gradle der Einfachheit App enthalten):

android { 
    ... 
    productFlavors { 
    foo {} 
    bar {} 
    } 
} 

afterEvaluate { 
    android.sourceSets.each { sourceSet -> 
    sourceSet.java.srcDirs += new File(project.buildDir, "generated/source/mygeneratedsource/${sourceSet.name}") 
    } 
} 

Und meine Verzeichnisstruktur endet wie folgt auf (Standard-Paket der Kürze halber verwendet wird):

app 
\--build 
    \--generated 
     \--source 
      \--mygeneratedsource 
       \--foo 
        \--GeneratedClass.java 
       \--bar 
        \--GeneratedClass.java 
\--src 
    \--main 
     \--java 
      \--MyApp.java 

Es scheint, dass Android Studio die neuen Verzeichnisse als gültige variantenspezifische Quellverzeichnisse übernimmt (ich kann GeneratedClass von innerhalb von MyApp referenzieren), aber wenn ich versuche zu kompilieren, bekomme ich:

error: cannot find symbol GeneratedClass 

Weiß jemand, warum AS das Symbol lösen kann, aber während der Kompilierung schlägt es fehl?

Antwort

0

Mein Verständnis ist, dass die Quellen im Compiler während der Auswertung gesetzt werden, so dass das mutieren der sourceSets nach der Auswertung die Kompilierung nicht beeinflusst. Zum Glück, für generierte Quellen, bietet das Android-Build-System eine Reihe von Komfort-Methoden, registerJavaGeneratingTask und es ist Ressource-Variante (RegisterResGeneratingTask). Sie können diese verwenden, um die generierten Klassenordner zu registrieren, und das Plugin fügt diese dann in den Kompilierpfad ein.

Wenn diese Quellen nicht als Ergebnis der Aufgabe generiert werden, können Sie einfach eine Dummy-Aufgabe erstellen, z. project.task("register${variant.name.capitalize()}GeneratedSources") und registrieren Sie diese Aufgabe als eine Java-Generierung Aufgabe mit den entsprechenden Quellen und es sollte immer noch funktionieren.

Verwandte Themen