Ich habe eine Frage, aber ich sitze seit Stunden hier vor meiner App, aber ich kann nicht verstehen, was das Problem ist.
Ich habe eine Android-App (in Kotlin geschrieben) und möchte zwei Produktvarianten erstellen und eine Klasse / Datei in der Produktvariante überschreiben:
- src
- androidTest
- foo
- java
- com
- example
- Bar.kt
- main
- java
- com
- example
- Bar.kt
- test
Also im Grunde würde ich gerne überschreiben Bar.kt Datei in foo Produktgeschmack, aber irgendwie funktioniert es nicht: Es sagt, dass die Klasse Bar dupliziert wird.
Irgendein Hinweis?
Sollten geschmacksspezifische Quellen nicht nur in den von Ihnen definierten Geschmacksrichtungen existieren (dh nicht in der Hauptsache)? Sie würden also mindestens zwei Flavors definieren und nur Bar.kt in den Quellsets für diese Flavors haben.
– Michael
25. Mai 2016 um 14:23 Uhr
Hm, vielleicht hast du recht … eigentlich versuche ich, ein Dolchmodul zu überschreiben … also Bar.kt ist eigentlich ein Dagger 2-Modul
– sockeqwe
25. Mai 2016 um 14:29 Uhr
Mögliches Duplikat von Android Gradle buildTypes: Duplicate class
– Miensol
25. Mai 2016 um 14:51 Uhr
Sie können meine Antwort überprüfen: stackoverflow.com/questions/28563632/…
– matdev
12. Februar 2021 um 10:52 Uhr
Dafür gibt es einige Anwendungsfälle. Ich möchte immer noch, dass die Klasse im Flavor-Modul priorisiert und die Hauptklasse ignoriert wird.
Hinweis: Für eine bestimmte Build-Variante gibt Gradle einen Build-Fehler aus, wenn es auf zwei oder mehr Quellsatzverzeichnisse stößt, die dieselbe 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 liegt daran, dass Gradle diese beiden Verzeichnisse während des Build-Prozesses betrachtet und auslöst ein ‘Doppelte Klasse’-Fehler. Wenn Sie verschiedene Versionen von Utility.java für verschiedene Build-Typen wünschen, können Sie für jeden Build-Typ eine eigene Version der Datei definieren und nicht in den Haupt-/Quellensatz aufnehmen.
Die Lösung besteht also darin, eine eigene Version von zu haben Bar.kt pro Variante und schließen Sie sie aus dem Hauptquellsatz aus.
Wenn ich beispielsweise 4-5 Varianten habe und 3 davon dieselbe Klasse verwenden und das Set einen bestimmten Code verwendet, muss ich es überall duplizieren oder kann sourceSets dies tun? Nicht in der Lage, mit Quellsätzen zu tun
– Akhil Papa
9. Januar 2017 um 9:05 Uhr
@AkhilDad Ich denke, Sie könnten ein separates Modul erstellen, um den Code geschmacksübergreifend zu teilen.
– Miensol
28. Januar 2017 um 9:59 Uhr
Oder fügen Sie dafür eine weitere Geschmacksdimension hinzu.
– Plaisthos
27. Mai 2020 um 11:31 Uhr
Wie von miensol angegeben, können Sie Ihre Datei nicht ablegen main und Flavor-spezifische Ordner und erwarten, dass Gradle genauso funktioniert wie das Android-Ressourcensystem. Aber ich habe einen Weg gefunden, dies ohne Codeduplizierung zu tun, damit Sie Ihren nicht kopieren müssen Bar.kt zu jedem Geschmacksordner, den Sie haben.
Nehmen wir also an, Sie haben drei Geschmacksrichtungen Entwickler, Prod und spotten. Du willst, dass dein Special verspottet wird Bar.kt in spotten aber die normale Implementierung in Entwickler und Prod Aromen. Sie legen Ihre verspottete Datei in die spotten geschmacksspezifischer Ordner mock/java/com/something/ und Sie legen Ihre “Standard” -Implementierung in einen neuen Ordner mit einem zufälligen Namen wie non-mock/java/com/something/ Es würde auch Sinn machen, es so etwas wie “gemeinsam” zu nennen. Jetzt müssen Sie Gradle sagen, wo diese Geschmacksrichtungen suchen sollen Bar.kt Klasse.
Wenn Sie mehrere Geschmacksrichtungen haben, wie A, B und C
und Ihr Hauptcode enthält alle Aktivitäten, und für A- und C-Variante möchten Sie einige Funktionen einiger Aktivitäten ändern, z. B. ShoppingCartActivity
dann müssen Sie einige Änderungen wie unten vornehmen, ShoppingCartActivity in alle drei Geschmacksrichtungen (einschließlich B auch) einfügen und aus Haupt entfernen und deklarieren Sie die Datei in allen Manifestdateien außer dem Hauptmanifest
- A
- java
- com
- example
- ShoppingCartActivity.kt(some changes)
- B
- java
- com
- example
- ShoppingCartActivity.kt
- C
- java
- com
- example
- ShoppingCartActivity.kt(new changes added)
- main
- java
- com
- example
**(remove from here)**
Gibt es eine Möglichkeit, eine Basis von ShoppingCartActivity auf main zu verwenden, und falls ich eine andere in einer anderen Geschmacksrichtung habe, verwende ich stattdessen die Geschmacksrichtung?
Sollten geschmacksspezifische Quellen nicht nur in den von Ihnen definierten Geschmacksrichtungen existieren (dh nicht in der Hauptsache)? Sie würden also mindestens zwei Flavors definieren und nur Bar.kt in den Quellsets für diese Flavors haben.
– Michael
25. Mai 2016 um 14:23 Uhr
Hm, vielleicht hast du recht … eigentlich versuche ich, ein Dolchmodul zu überschreiben … also
Bar.kt
ist eigentlich ein Dagger 2-Modul– sockeqwe
25. Mai 2016 um 14:29 Uhr
Mögliches Duplikat von Android Gradle buildTypes: Duplicate class
– Miensol
25. Mai 2016 um 14:51 Uhr
Sie können meine Antwort überprüfen: stackoverflow.com/questions/28563632/…
– matdev
12. Februar 2021 um 10:52 Uhr
Dafür gibt es einige Anwendungsfälle. Ich möchte immer noch, dass die Klasse im Flavor-Modul priorisiert und die Hauptklasse ignoriert wird.
– Chitgoks
9. Februar um 13:27 Uhr