2016-05-25 5 views
14

Ich habe eine sehr dumme Frage, aber ich sitze hier seit Stunden vor meiner App, aber ich kann nicht verstehen, was das Problem ist.Produkt Flavor: Duplicate Klasse gefunden

Ich habe eine Android-App (in Kotlin geschrieben), und ich möchte zwei Produkt Aromen machen und eine Klasse/Datei im Produktgeschmack überschreiben:

mein gradle Skript So ist das:

apply plugin: 'com.android.application' 
apply plugin: 'kotlin-android' 


android { 
    ... 
    productFlavors { 
    foo { 
     applicationId "com.foo" 
    } 
    } 
} 

Meine Dateien sind wie folgt strukturiert:

- src 
    - androidTest 
    - foo 
     - java 
     - com 
      - example 
      - Bar.kt 
    - main 
     - java 
     - com 
      - example 
      - Bar.kt 
    - test 

Also im Grunde möchte ich Bar.kt Datei in foo Produktgeschmack außer Kraft setzen möchten, aber es irgendwie funktioniert nicht: Es besagt, dass die Klasse Bar dupliziert ist.

Irgendwelche Hinweise?

+2

Sollte nicht Aroma-Quellen gibt es nur in den falvors Sie definiert haben (dnicht im Haupt)? Sie definieren also mindestens zwei Varianten und haben nur Bar.kt in den Quellsets für diese Varianten. – Michael

+0

Hm, vielleicht hast du recht ... eigentlich versuche ich ein Dolch-Modul zu übersteuern ... also ist 'Bar.kt' eigentlich ein Dolch-2-Modul – sockeqwe

+0

Mögliches Duplikat von [Android grddle buildTypes: Duplicate-Klasse] (http://stackoverflow.com/questions/18782368/android-gradle-buildtypes-duplicate-class) – miensol

Antwort

25

The documentation for variants Staaten (Hervorhebung von mir):

Hinweis: Für eine bestimmte Build-Variante, wirft Gradle einen Build Fehler, wenn es zwei oder mehr Quelle gesetzt Verzeichnisse trifft, die die gleiche Java-Klasse definiert haben. Wenn Sie beispielsweise ein Debug-APK erstellen, können Sie nicht sowohl src/debug/Utility.java als auch src/main/Utility.java definieren. Dies ist , da Gradle diese beiden Verzeichnisse während des Build-Prozesses betrachtet und einen "doppelten Klassenfehler" auslöst. Wenn Sie verschiedene Versionen von Utility.java für verschiedene Build-Typen möchten, können Sie jede Build-Typ eine eigene Version der Datei definieren und nicht in die Haupt/Quellgruppe enthalten.

Die Lösung ist also, eine eigene Version von Bar.kt pro Variante zu haben und sie vom Hauptquellensatz auszuschließen.

+3

Wenn ich sagen 4-5 Aromen, und 3 von ihnen verwenden die gleiche Klasse und den Satz verwenden spezifischen Code, muss ich es duplizieren überall oder sourceSets können es tun? Nicht in der Lage mit Quellgruppen zu tun –

+1

@AkhilDad Ich denke, Sie könnten ein separates Modul erstellen, um den Code über Aromen zu teilen. – miensol

7

Wie von miensol angegeben, können Sie Ihre Datei nicht auf main legen und spezifische Ordner würfeln und erwarten, dass Gradle genauso funktioniert wie das Android-Ressourcensystem. Aber ich habe einen Weg gefunden, dies ohne Code-Duplizierung zu tun, so dass Sie Ihre Bar.kt nicht in jeden Geschmacks-Ordner, den Sie haben, kopieren müssen.

Also lassen Sie uns sagen, Sie haben drei Aromen dev, prod und Mock. Sie möchten Ihre spezielle mokierte Bar.kt in mock aber die normale Implementierung in dev und prod Aromen. Sie setzen Ihre verspottete Datei in den mock geschmacksspezifischen Ordner mock/java/com/something/ und Sie setzen Ihre "Standard" -Implementierung in einen neuen Ordner mit einem zufälligen Namen wie non-mock/java/com/something/ benennen es so etwas wie "common" würde auch Sinn machen. Jetzt müssen Sie Gradle erklären, wo diese Aromen nach ihrer Bar.kt Klasse suchen sollten.

Setzen Sie diese in Ihrem build.gradle:

android { 
    ... 
    sourceSets { 
     prod { 
      java.srcDirs('src/non-mock/java') 
     } 
     dev { 
      java.srcDirs('src/non-mock/java') 
     } 
    } 

}