Есть ли врожденная проблема с использованием операторов if для определения minSdkVersion в блоке defaultConfig?

Фон

Работа над проектом, который имеет несколько подпроектов (модулей), зависящих от некоторых библиотек в одном корневом проекте. Для некоторых функций тестирования нам нужна более высокая версия minSdkVersion (21), но эта версия minSdkVersion не требуется для нормального использования приложения, поскольку мы можем получить все, что нам нужно, из версии 14. Поэтому мы попытались включить некоторые, если логика для разделения сборки для тестирования и производства. Фрагмент, о котором идет речь, находится здесь:

android {
    compileSdkVersion 30
    defaultConfig {

        // Default version necessary for some reason.
        // minSdkVersion 14

        gradle.startParameter.taskNames.each {
            if (it.contains("AndroidTest") || it.contains("cAT")) {
                minSdkVersion 21
            } else {
                minSdkVersion 14
            }
        }
        targetSdkVersion 30

        versionCode getGitCommitCount()
        versionName getTag()

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
}

Обобщающий вопрос:

Есть ли врожденная проблема с использованием операторов if для определения minSdkVersion в блоке defaultConfig?

Дальнейшие подробности

Я могу собрать с помощью оболочки gradle через терминал, то есть .gradlew build без проблем, но в конфигурации модулей есть красный крестик, и когда я пытаюсь их запустить, я получаю:

Ошибка при выполнении действия по умолчанию не найдено.

Активность по умолчанию определенно находится в манифесте и отлично работает после очистки кеша gradle и перезапуска Android Studio. Красный X снова появляется после того, как я делаю что-либо, связанное с gradle (например, синхронизирую файлы gradle, собираю и т. д.)

Я нашел обходной путь (обратите внимание на закомментированное определение minSdkVersion 14 в приведенном выше фрагменте), поскольку это устраняет ошибку запуска, но я до сих пор не понимаю, почему это необходимо.

При более глубоком рассмотрении я получаю следующую ошибку на вкладке «Объединенный манифест» манифеста модуля:

Ошибки слияния: Ошибка: uses-sdk:minSdkVersion 1 не может быть меньше версии 14, объявленной в библиотеке ‹path_to_my_library›/src/main/AndroidManifest.xml, поскольку библиотека может использовать API, недоступные в 1. Предложение: используйте совместимую библиотеку с minSdk не более 1, или увеличьте версию minSdk этого проекта как минимум до 14, или используйте tools:overrideLibrary= для принудительного использования (может привести к сбоям во время выполнения) отладочный манифест

Вы можете увидеть намного больше деталей со скриншотами, исходным кодом и моими теориями до этого момента в этом PR, где это обсуждается более подробно, но пока без подробного объяснения. Я добавлю эти детали сюда, если обсуждение на github приведет к убедительному выводу, чтобы потом ничего не потерять из-за неработающей ссылки.


person topher217    schedule 17.09.2020    source источник