Налаштування автоматичної збірки Android-додатку (Build Automation)
Ми часто бачимо, як розробники скаржаться на довгу збірку в CI: проект з 15+ модулями, Gradle працює на одному потоці, холодна збірка 4–7 хвилин, інкрементальна — 90 секунд. У команді з 10 осіб це перетворюється на чергу білдів, що блокує рев'ю. Наш досвід показує, що правильна автоматизація збірки — не панацея, а системна робота з конфігами Gradle, CI-пайплайном та кешуванням. Налаштовуємо все так, щоб білд проходив на будь-якій машині стабільно та без ручних кроків.
Основні точки болю при Android Build Automation
Як безпечно підписувати APK/AAB у CI?
Найчастіша проблема. Розробники зберігають keystore у репозиторії (погано) або передають через аргументи командного рядка відкритим текстом (ще гірше). Правильна схема: keystore кодується у Base64, кладеться у змінну оточення CI, перед збіркою декодується у тимчасовий файл, після збірки — видаляється. У build.gradle.kts це конфігурується через змінні оточення:
android { signingConfigs { create("release") { storeFile = file(System.getenv("KEYSTORE_PATH") ?: "debug.keystore") storePassword = System.getenv("KEYSTORE_PASSWORD") ?: "android" keyAlias = System.getenv("KEY_ALIAS") ?: "androiddebugkey" keyPassword = System.getenv("KEY_PASSWORD") ?: "android" } } buildTypes { release { signingConfig = signingConfigs.getByName("release") isMinifyEnabled = true proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } } } Конфігурація збірки за гілками
Другий больовий вузол. main → release AAB для Play Store, develop → debug APK з тестовими ендпоінтами, release/* → staging APK для QA. Реалізується через комбінацію buildFlavors + умови у CI-скрипті. Не потрібно плодити окремі build.gradle файли — достатньо однієї конфігурації з flavorDimensions.
Чому важливе кешування Gradle?
Без кешу CI завантажує 200–400 МБ залежностей при кожному запуску. З правильним кешуванням ~/.gradle/caches та ~/.gradle/wrapper перша збірка після зміни build.gradle займає повний час, решта — інкрементально. В середньому економія ~60% часу збірки після першого білда. Ми використовуємо remote build cache (через S3) для розподілених команд.
Як налаштовуємо
Базовий стек: Gradle 8.x + AGP 8.x + GitHub Actions / GitLab CI / Bitrise. Fastlane використовуємо для задач, які Gradle не вміє з коробки: завантаження у Google Play через supply, відправка сповіщень, керування треками (internal → alpha → production).
Структура типового CI-пайплайна (GitHub Actions):
# .github/workflows/android-release.yml jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' - name: Cache Gradle uses: actions/cache@v4 with: path: | ~/.gradle/caches ~/.gradle/wrapper key: gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - name: Decode Keystore run: echo "$KEYSTORE_BASE64" | base64 -d > app/release.keystore env: KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }} - name: Build Release AAB run: ./gradlew bundleRelease env: KEYSTORE_PATH: release.keystore KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} KEY_ALIAS: ${{ secrets.KEY_ALIAS }} KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} - name: Upload Artifact uses: actions/upload-artifact@v4 with: name: release-aab path: app/build/outputs/bundle/release/app-release.aab Окремо налаштовуємо gradle.properties під CI: org.gradle.daemon=false (демон у CI не потрібен), org.gradle.parallel=true, org.gradle.configureondemand=true. На проектах з кількома модулями це скорочує час конфігурації на 30–40%.
Паралельні задачі та оптимізація
Якщо проект монолітний, паралелізація майже не дає ефекту. Але при модульній архітектурі (:core, :feature-auth, :feature-feed, :app) Gradle будує граф залежностей та збирає незалежні модулі паралельно. ./gradlew assembleDebug --parallel на 8-ядерному агенті дає виграш у 2–3 рази порівняно з послідовною збіркою.
Для великих команд підключаємо Gradle Build Cache — або через Gradle Enterprise (платно), або через відкрите рішення з S3 бекендом.
| Тип збірки | Без оптимізації | З оптимізацією (кеш + паралель) |
|---|---|---|
| Холодна (всі модулі) | 5–7 хв | 2–3 хв |
| Інкрементальна | 90 сек | 20–30 сек |
Gradle User Manual рекомендує комбінувати обидва підходи.
Порівняння CI-платформ для Android
| CI Платформа | Особливості налаштування | Середній час збірки після кешу |
|---|---|---|
| GitHub Actions | Проста інтеграція, велика екосистема | ~2 хв |
| GitLab CI | Вбудований Docker, відмінний кеш | ~1.5 хв |
| Bitrise | Оптимізована для мобільних, багато готових кроків | ~2.5 хв |
Часті помилки при налаштуванні CI
- Неправильне кодування keystore (Base64 з переносом рядків) призводить до помилки декодування.
- Відсутність кешу між запусками: якщо не використовувати
actions/cacheз правильним ключем, кожен білд завантажує залежності заново. - Використання debug-підпису у релізному AAB — Google Play відхилить такий файл.
- Забувають вимикати Gradle Daemon у CI, що веде до нестабільності.
Що входить у роботу
- Аудит поточного
build.gradle(Groovy → Kotlin DSL, версії плагінів, неоптимальні конфіги) - Налаштування signing config через змінні оточення CI
- CI-пайплайн під вашу платформу (GitHub Actions, GitLab CI, Bitrise)
- Кешування Gradle (локальне та remote)
- Конфігурація за гілками за допомогою build flavors
- Документація для команди та навчання розробників
- Гарантія стабільності — після здачі все працює без ручних доналаштувань
Процес роботи
- Первинна консультація та аналіз поточної збірки.
- Перехід на сучасний Gradle + Kotlin DSL (якщо необхідно).
- Налаштування signing config через секрети CI.
- Створення CI-конфігурації з кешуванням та паралельністю.
- Тестування на кількох гілках (main, develop, release/).
- Документування та передача команді.
Вартість розраховується індивідуально після аналізу вимог. Строк: 2–3 дні для одномодульного проекту, до 5 днів для багатомодульного. Зв'яжіться з нами для оцінки вашого проекту — допоможемо впровадити build automation під ключ. Замовте консультацію, щоб дізнатися точні строки для вашого проекту.
Ми маємо більше 10 років досвіду в Android-розробці та налаштували пайплайни для 40+ проектів — від стартапів до enterprise-додатків. Наші інженери слідкують за актуальними версіями Gradle та AGP, тому ви отримуєте сучасну конфігурацію без застарілих практик.







