Produktgeschmack: Doppelte Klasse gefunden

Lesezeit: 4 Minuten

Benutzer-Avatar
sockeqwe

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:

Mein Gradle-Skript lautet also:

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


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

Meine Dateien sind wie folgt aufgebaut:

 - 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.

    – Chitgoks

    9. Februar um 13:27 Uhr

Die Dokumentation für Varianten Staaten (Hervorhebung von mir):

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.

Legen Sie dies in Ihre ein build.gradle:

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

}

  • Funktioniert perfekt, mit AS 3.4.2. Vielen Dank!

    – 3c71

    3. September 2019 um 11:34 Uhr

Benutzer-Avatar
Vivek Hande

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

für weitere Details überprüfen Erstellen Sie mit Quellgruppen

- 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?

    – Igor Romcy

    9. Oktober 2020 um 16:57 Uhr


1138170cookie-checkProduktgeschmack: Doppelte Klasse gefunden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy