Когда и почему это происходит
- Одна из зависимостей (AAR/плагин) требует более высокий
minSdk
в своём манифесте илиbuild.gradle
. - Во время manifest merge берётся максимальное из всех требований.
- Часть шаблонов/скриптов Flutter опирается на свойство
flutter.minSdkVersion
; если оно не задано, поведение зависит от плагинов.
Быстрое решение: форсим minSdk через Gradle
Передайте свойство в Gradle напрямую — оно имеет высокий приоритет:
# AAB
flutter build appbundle --release -Pflutter.minSdkVersion=21
flutter build apk --split-per-abi -Pflutter.minSdkVersion=21
export ORG_GRADLE_PROJECT_flutter.minSdkVersion=21
flutter build appbundle --release
Приоритет: -P
(CLI) → gradle.properties
→ значения по умолчанию в плагинах.
Проверяем minSdk в готовом AAB/APK
Проверяйте то, что пойдёт в сто́р: распакуйте универсальный APK из AAB и проанализируйте манифест.
# из корня Flutter-проекта
AAB="build/app/outputs/bundle/release/app-release.aab"
[ -f "" ] || ./android/gradlew -p android :app:bundleRelease
bundletool build-apks \
--bundle="" \
--output=/tmp/app.apks \
--mode=universal \
--overwrite
unzip -p /tmp/app.apks universal.apk > /tmp/universal.apk
apkanalyzer manifest min-sdk /tmp/universal.apk
apkanalyzer manifest target-sdk /tmp/universal.apk
Где взять утилиты: apkanalyzer
— в Android SDK (cmdline-tools
), bundletool
— отдельный JAR (можно установить через пакетный менеджер или скачать с релизов).
Как найти библиотеку, которая поднимает minSdk
- Соберите merged manifest и blame-репорт:
./android/gradlew -p android :app:processReleaseMainManifest \ -Pandroid.manifestMergerReport=BLAME --rerun-tasks grep -n "<uses-sdk" \ build/app/intermediates/merged_manifest/release/processReleaseMainManifest/AndroidManifest.xml find build/app -iname "*manifest-merger*report*.txt" -o -iname "*blame*report*.txt"
- Поиск по AAR-манифестам: иногда полезно просканировать зависимости на предмет явного
<uses-sdk minSdkVersion="...">
. Для отладки можно временно добавить gradle-таску и запустить её локально.
minSdk
«вопреки» невозможно — выбирайте альтернативу или условно исключайте функциональность для низких API.Как «закрепить» minSdk в конфигурации и CI
- В
android/gradle.properties
добавьте:flutter.minSdkVersion=21
- В модуле
android/app/build.gradle
держите явный DSL (для читаемости):android { defaultConfig { minSdkVersion 21 // или minSdk 21 в новом DSL } }
- В CI экспортируйте переменную:
export ORG_GRADLE_PROJECT_flutter.minSdkVersion=21
- Для разовых сборок — используйте CLI-флаг
-Pflutter.minSdkVersion=21
(имеет приоритет).
Типичные ошибки и предупреждения
- Unknown property 'android' for root project — код с
android { ... }
попал в корневойandroid/build.gradle
. Перенесите вandroid/app/build.gradle
. - File '/tmp/app.apks' already exists — добавьте
--overwrite
к командеbundletool build-apks
. - Supplied proguard configuration does not exist — создайте пустой
proguard-rules.pro
или отключитеminifyEnabled
. - Warning: package=... в манифестах плагинов — безвредное предупреждение новых AGP; оно просит убрать
package
из библиотечных манифестов (исправляется обновлением плагинов). - Kotlin KGP скоро не поддерживается — обновите Kotlin до ≥ 2.1.0 или используйте флаг Flutter
--android-skip-build-dependency-validation
как временную меру.