26-08-2025

Flutter игнорирует minSdk? Как собрать AAB с нужным minSdk и проверить

Иногда при сборке Flutter-проекта итоговый minSdkVersion внезапно становится выше, чем задано в конфигурации (например, 24 вместо 21). Ниже — быстрый способ форсить нужное значение, проверить результат в артефакте и найти «виновника» повышения.

NJ Soft

Flutter игнорирует minSdk? Как собрать AAB с нужным minSdk и проверить

Когда и почему это происходит

  • Одна из зависимостей (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
Совет: В CI можно использовать переменную окружения: 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

  1. Соберите 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"
  2. Поиск по AAR-манифестам: иногда полезно просканировать зависимости на предмет явного <uses-sdk minSdkVersion="...">. Для отладки можно временно добавить gradle-таску и запустить её локально.
Важно: Если библиотека действительно требует API 24+, понизить 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 как временную меру.

FAQ

Чаще всего это делают зависимости: их Gradle/манифест требуют более высокий minSdk. Во время объединения манифестов итоговое значение берётся как максимум.

Безопасно, если код и библиотеки совместимы с API-уровнем. Если нет — сборка/рантайм сломаются. Всегда проверяйте AAB/APK и прогоняйте регрессионные тесты на устройствах с низким API.

В android/gradle.properties как flutter.minSdkVersion=21. В CI — через ORG_GRADLE_PROJECT_flutter.minSdkVersion. Для локальных разовых билдов — флаг -P.

Нет. Если библиотека реально использует API 24+, её нельзя запускать на API 21. Либо меняйте библиотеку, либо условно отключайте функционал на старых устройствах.

Для APK можно использовать aapt dump badging app-release.apk. Но для AAB корректнее проверить универсальный APK, собранный через bundletool.