Android studio не распознает исходные папки


Я использую стандартную структуру каталогов Android Studio, и я создал различные типы сборки:

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

все компилируется нормально, но как не распознает все исходные папки. Только папки под main и debug помечены как исходные, папки под preview и release отображаются как обычные папки В действительности нет никакой проверки ошибок в этих папках

Я проверил .IML-файл и теги sourceFolder не были добавлен.

если я редактирую файл IML проекта вручную, добавляя строки:

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

это, кажется, работает нормально.

...пока я синхронизации с Gradle в файл, который удаляет строки.

это ошибка в плагине gradle, или я делаю что-то не так?

4 61

4 ответа:

вы должны переключить его в списке вариантов сборки, а затем, как будет подобрать соответствующие исходные наборы. build variants

во-первых, попробуйте повторно импортировать проект. Удалите все ваши каталоги сборки,.iml файлы и . Затем импортируйте проект.

если это не сработает, то вы можете попробовать это, чтобы "заставить его". проверьте этот ответ от Бернда Берглера.обратите внимание, что это хак, и в идеале не нужно

вот немного измененная версия его кода.

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)
}

просто бросьте это в свой за пределами элемент . описание из этого источника:

в Android Studio автоматически генерирует .iml файлы проекта из gradle создавайте файлы. Эта задача изменяет приложение файл проекта Android Studio.iml и добавляет тестовый каталог. Изменения теряются всякий раз, когда Android Студия повторно сканирует файлы gradle, но сразу после этого она запускает сборку и задача зацепилась за это, так что все хорошо. Эта версия имеет несколько настроек, таких как добавление нового задача в обычную сборку цикл немного по-другому, и изящно обрабатывать отсутствие .iml-файл.

это сработало в некоторой степени для меня: IDE теперь распознает его как дерево src, но не хочет связывать его с другими деревьями src.

только в моем случае File - > Invalidate Caches / Restart помогли мне, так что если решения выше не работает для вас - попробуйте это.

добавьте это в сборку вашего модуля.файл gradle:

sourceSets {
    main.java.srcDirs += 'src/preview/java'
    main.java.srcDirs += 'src/release/java'
}