Когда Android-часть Flutter выходит в ритме двух–трёх дней, CI перестаёт быть «зелёный main» и превращается в календарь: ABI, флейворы, политики Google Play и нативные плагины делят одно и то же окно перед выкладкой. Быстрый ARM-эмулятор на Apple Silicon не отменяет класс дефектов, который проявляется только на реальной памяти, драйверах GPU и энергополитике OEM. Поэтому многие команды сочетают недорогой self-hosted Linux-агент для flutter test и статики с посуточной линией на облачном Mac для релизного bundleRelease, интеграционных прогонов и дымового теста на устройстве.
Скорость эмулятора не равна правде устройства
Современные эмуляторы отлично подходят для виджет-тестов, golden-скриншотов и быстрых итераций. Они слабее там, где важны тайминг JNI, особенности камеры, откладывание фоновых задач или кодеки конкретного вендора. В коротком цикле редко есть время бисектить «только на эмуляторе», поэтому мы относимся к эмуляторным suite как к сигналу, а перед кандидатом в магазин добавляем хотя бы один физический девайс или слот фермы. Если лабораторию не держать каждый день, облачный Mac с USB-редиректом или привязанным телефоном часто дешевле, чем откат плохой сборки в проде.
Посуточный облачный Mac с Gradle против Linux-агентов
Linux-агенты сильны в flutter test, статическом анализе и Docker-сервисах: память относительно дёшева, образы стартуют быстро. Слабее они в инструментированных прогонах Android Studio, GPU-тяжёлых интеграционных тестах или скриптах подписи с путями macOS. Линия на облачном Mac даёт Studio, закреплённый JDK и предсказуемые Gradle-демоны без контейнерных костылей под редкие нативные зависимости. При регистрации runner и сетевых токенах ориентируйтесь на чеклист: Короткий цикл CI в 2026: всплеск сборок и новый облачный Mac — регистрация Runner, сеть и минимальные токены за 30–60 минут (чеклист и FAQ).
Ключи кэша Gradle с учётом NDK (где прячется «тихий яд»)
Удалённый кэш сборок безопасен только при честном хэшировании входов. В Android-модулях Flutter с CMake или prefab обновление NDK без смены пространства имён кэша — классический способ получить зелёный CI и сломанные ночные сборки. Как минимум включайте в ключ записи версию AGP, Gradle, ревизию NDK и кортеж ABI + STL. Если SDK симлинкуется внутри образа, нормализуйте путь до хэширования, чтобы два узла не давали разные отпечатки при одном компиляторе.
# Адаптируйте под вашего поставщика remote cache android.ndkVersion=26.3.11579264 android.defaults.buildfeatures.buildconfig=true # если ещё нужен BuildConfig flutter.version=3.24.x из FVM / файла версии cmake.arguments=-DANDROID_STL=c++_shared должно совпадать во всех job матрицы
Раз в неделю запускайте «холодный» прогон с ./gradlew clean и намеренным промахом кэша: если медиана времени прыгает только на Mac, узкое место чаще в диске или зеркале m2, а не в компиляции Kotlin.
Недельная аренда против оплаты по дням (матрица)
Используйте таблицу на планировании: выберите колонку, подтвердите метрикой и двигайтесь дальше. Для рывковых дорожных карт Flutter аренда снимает риск «железо простаивает», в отличие от закупки bare metal.
| Сигнал | Сначала Linux-агент | Посуточный облачный Mac | Недельная аренда Mac |
|---|---|---|---|
| ≤2 релизных ветки в месяц, в основном Dart | Достаточно; Mac вручную | Перед загрузкой в стор | Часто переплата |
| Ежедневные хотфиксы + активный JNI | Анализ + юнит-тесты | Gradle release + дым на устройстве | Если Mac нужен >4 дней в неделю |
| Скачок NDK в середине спринта | Валидаторы кэша + cold build | Закрепить образ; пересобрать prefab | Аренда, если ночных пересборок >3 |
| Регрессии GPU / камеры | Нерепрезентативно | Studio + привязанное устройство | Дешевле аварийной фермы |
Параллельный контур подписи и коротких итераций на Mac для соседней мобильной платформы разобран в материале 2026: короткий цикл подписи iOS — Fastlane Match, шифрованный Git на посуточном cloud Mac runner, HTTPS только для чтения и конфликты сертификатов между job — те же принципы разделения секретов и посуточного runner применимы, когда в репозитории два таргета.
Запускайте Gradle там, где Android Studio уже привычна
Релизная линия Flutter под Android требует не только CPU: иногда нужен хост с GUI для отладки инструментированных тестов, предсказуемая связка JDK и Android SDK и достаточно унифицированной памяти, чтобы демоны Gradle, компиляция Kotlin и снимки эмулятора не мешали друг другу. Облачный Mac mini M4 близок к тому, что разработчики уже используют локально, поэтому скрипты и пути переживают перенос в CI без слоёв вроде WSL.
Высокая пропускная способность памяти Apple Silicon и низкое энергопотребление в простое (порядка 4 Вт) позволяют оставлять ночные prefetch-задачи без шума и перегрева «домашнего шкафа». Стабильность macOS, Gatekeeper и SIP снижают поверхность компрометации по сравнению с долгоживущими мультипользовательскими Linux jump host, где лежат токены подписи.
Если следующий спринт зависит от снижения риска отката в Google Play, VPSSpark с облачным Mac mini M4 — разумная база для «линии достоверности» — узнайте тарифы и конфигурации и выровняйте Gradle, NDK и дымовые тесты на том же классе железа, которому доверяет релиз-менеджер.