Android Studio erkennt keine Quellordner

70

Ich verwende eine Standard-Android Studio-Verzeichnisstruktur und habe verschiedene Build-Typen erstellt:

buildTypes {
    debug {
        runProguard false
        packageNameSuffix ".debug"
        signingConfig signingConfigs.debug
    }
    preview.initWith(buildTypes.debug)
    preview {
        packageNameSuffix ".preview"
    }
    release {
        runProguard false
        signingConfig signingConfigs.release
    }
}

Alles wird gut kompiliert, aber AS erkennt nicht alle Quellordner. Nur Ordner unter mainund debugwerden als Quelle markiert, Ordner unter previewund releasewerden als normale Ordner angezeigt. Tatsächlich gibt es in diesen Ordnern keine Fehlerprüfung

Geben Sie hier die Bildbeschreibung ein

Ich habe die .iml-Datei überprüft und die sourceFolder-Tags wurden nicht hinzugefügt.

Wenn ich die Projekt-IML-Datei manuell bearbeite und die Zeilen hinzufüge:

 <sourceFolder url="file://$MODULE_DIR$/src/preview/java" isTestSource="false" />
 <sourceFolder url="file://$MODULE_DIR$/src/preview/res" type="java-resource" />

Es scheint gut zu funktionieren.

Geben Sie hier die Bildbeschreibung ein

... bis ich mit meiner Gradle-Datei synchronisiere - wodurch die obigen Zeilen entfernt werden.

Ist das ein Fehler im Gradle-Plugin oder mache ich etwas falsch?

imbryk
quelle
1
Ich hoffe, Sie verstehen, dass Sie die * .iml-Datei niemals bearbeiten sollten, da sie von Gradle generiert wird. Wird das Projekt korrekt über die Befehlszeile erstellt? Andernfalls schlägt der Import möglicherweise fehl und das Projektmodell wird nicht aktualisiert. Ich bin mir übrigens nicht sicher, ob Sie tatsächlich die Zeile 'initWith' benötigen.
Botteaap
Ich habe gerade die IML-Datei bearbeitet, um zu sehen, ob dies der Grund ist. Mein Fazit ist also, dass es nicht richtig generiert wird.
Imbryk
Das Projekt wird sowohl über die Befehlszeile als auch über Studio kompiliert - es zeigt nur die Ordner als Quellordner an - was die Arbeit wirklich schwierig macht
imbryk
OK, fair genug, werden die Build-Typen in der Liste der Build-Varianten angezeigt? Ich denke tatsächlich, dass die Antwort von Ladios unten genau das ist, wonach Sie suchen. In der IDE ist nur ein Build-Typ aktiv.
Botteaap
Wer auf der

Antworten:

132

Sie müssen es in der Liste der Build-Varianten wechseln, dann nimmt AS die entsprechenden Quellensätze auf. Varianten bauen

Ladios Jonquil
quelle
13
Trotzdem hoffe ich, dass AS in Zukunft Quellen für verschiedene Varianten sehen kann - es ist ein bisschen ärgerlich, dass ich manuell wechseln
muss
2
Einverstanden, jede Build-Variante sollte erkannt und sofort als solche angezeigt werden, das ist sehr verwirrend!
Schwarzlicht
1
Es hat bei mir auch nach all dem nicht funktioniert. Ich habe Probleme beim Importieren von Klassen in das allgemeine src-Paket, das ich in zwei benutzerdefinierten Varianten einbinde. Project kompiliert erfolgreich, es wird nur im Android Studio-Editor angezeigt, dass aufgrund von Importproblemen Fehler auftreten.
Himanshu Virmani
@Ladios Jonquil. Gott schütze dich. Und ich bin nicht religiös, also bedeutet es mehr
Nativ
3

Versuchen Sie zunächst, das Projekt erneut zu importieren. Löschen Sie alle Build-Verzeichnisse, .imlDateien und den .ideaOrdner. Importieren Sie dann das Projekt.

Wenn das nicht funktioniert, können Sie dies versuchen, um es zu "erzwingen". Kasse diese Antwort von Bernd Bergler. Beachten Sie, dass dies ein Hack ist und im Idealfall nicht erforderlich ist

Hier ist eine leicht modifizierte Version seines Codes.

task addPreview {
    def src = ['src/preview/java']
    def file = file("app.iml")

    doLast {
        try {
            def parsedXml = (new XmlParser()).parse(file)
            def node = parsedXml.component[1].content[0]
            src.each {
                def path = 'file://$MODULE_DIR$/' + "${it}"
                def set = node.find { it.@url == path }
                if (set == null) {
                    new Node(node, 'sourceFolder', ['url': 'file://$MODULE_DIR$/' + "${it}", 'isTestSource': "false"])
                    def writer = new StringWriter()
                    new XmlNodePrinter(new PrintWriter(writer)).print(parsedXml)
                    file.text = writer.toString()
                }
            }
        } catch (FileNotFoundException e) {
            // nop, iml not found
        }
    }
}

// always do the addPreview on prebuild
gradle.projectsEvaluated {
    preBuild.dependsOn(addPreview)
}

Legen Sie das einfach in Ihrer build.gradleDatei außerhalb des androidAbschnitts ab. Beschreibung aus dieser Quelle :

Android Studio generiert automatisch IML-Projektdateien aus Gradle-Build-Dateien. Diese Aufgabe bearbeitet die Android Studio-Projektdatei app.iml und fügt das Testverzeichnis hinzu. Die Änderungen gehen verloren, wenn Android Studio die Gradle-Dateien erneut scannt, aber direkt danach wird ein Build ausgeführt und die Aufgabe ist damit verbunden, sodass alles in Ordnung ist. Diese Version enthält einige Verbesserungen, z. B. das Hinzufügen der neuen Aufgabe zum normalen Erstellungszyklus etwas anders und das ordnungsgemäße Behandeln des Fehlens der IML-Datei.

Für mich hat dies bis zu einem gewissen Grad funktioniert: Die IDE erkennt es jetzt als src-Baum, möchte es aber nicht mit anderen src-Bäumen verknüpfen.

Sababado
quelle
... was im Grunde darauf hinausläuft, die * .iml-Datei zu hacken, was ein grober Hack ist.
Botteaap
1
Nicht mit dir nicht einverstanden.
Sababado
Großartig :) Jetzt drücken wir die Daumen, dies wird nicht akzeptiert oder positiv bewertet.
Botteaap
Nun, ich will nicht streiten, aber es ist eine Lösung für ein Problem, das es nicht wirklich gibt. In AS wählen Sie die Quellordner basierend auf dem Build-Typ aus. Unterschiedlicher Build-Typ / Geschmack bedeutet effektiv unterschiedlichen Code. Es ist daher nicht sinnvoll, dem IDE-Klassenpfad andere Ordner als den aktiven Build-Typ hinzuzufügen. Wenn Sie dem Erstellungspfad wirklich benutzerdefinierten Code hinzufügen müssen, führt der "richtige" Weg über die Erweiterungspunkte, die das Android Gradle-Plugin bereitstellt.
Botteaap
2
Je mehr ich diese Frage sehe, desto mehr glaube ich, dass ich diese Antwort schnell gepostet habe. Es löst vorerst ein sehr spezifisches Problem, und diese Frage unterscheidet sich geringfügig von dem, was ich beantworten wollte.
Sababado
2

In meinem Fall hat mir nur Datei -> Caches ungültig machen / Neustart geholfen. Wenn die oben genannten Lösungen für Sie nicht funktionieren, versuchen Sie dies.

Anton Ryabyh
quelle
1

Fügen Sie dies der build.gradle-Datei Ihres Moduls hinzu:

sourceSets {
    main.java.srcDirs += 'src/preview/java'
    main.java.srcDirs += 'src/release/java'
}
Makotosan
quelle
1
Ich habe dies versucht - es wurden beide zum Quellbaum hinzugefügt, nachdem ich die sourceSets-Gruppe unter der "android" -Gruppe in meiner build.gradle-Datei hinzugefügt hatte. In meinem Projekt gibt es jedoch Foo.java in beiden Build-Varianten, sodass dieser Trick letztendlich nicht funktioniert hat, da sich der Compiler über zwei Quelldateien mit demselben Namen beschwert.
Gjgjgj