Подтвердить что ты не робот

Студия Android не распознает исходные папки

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

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

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

enter image description here

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

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

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

Кажется, что все нормально.

enter image description here

... пока не синхронизируюсь с моим файлом gradle, который удаляет указанные выше строки.

Является ли это ошибкой в ​​плагине gradle, или я делаю что-то неправильно?

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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 { [email protected] == 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)
}

Просто отбросьте это в своем build.gradle файле вне раздела android. Описание из этого источника:

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

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

Ответ 3

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

Ответ 4

Добавьте это в свой файл сборки build.gradle:

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