Як налаштувати підпис Android: Keystore, Gradle, CI/CD

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Як налаштувати підпис Android: Keystore, Gradle, CI/CD
Середній
від 1 дня до 3 днів
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1160
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    562

Втрата keystore-файлу — незворотна. Якщо приватний ключ втрачено, оновлення існуючого застосунку в Google Play стає неможливим. Доведеться публікувати новий застосунок з новим package name, втрачаючи всі відгуки, історію завантажень та позиції в пошуку. За нашими даними, такі інциденти обходяться розробникам у багатомісячні простої та втрату доходу до 5000 грн на місяць. Щоб цього не сталося, ми налаштовуємо підпис Android-застосунків під ключ: від генерації keystore до CI/CD та Play App Signing. Наші інженери сертифіковані Google, мають 10+ років досвіду та виконали 50+ успішних проєктів. Гарантія безпеки ключів — 100%. Зв'яжіться з нами — оцінимо ваш проєкт безкоштовно та запропонуємо оптимальне рішення. Вартість налаштування для одного флейвора — від 4000 грн.

У цьому керівництві розберемо покроково: 1. Створення keystore. 2. Налаштування Signing Config в Gradle без зберігання паролів у коді. 3. Підключення Play App Signing. 4. Автоматизація підпису на CI. Дотримуючись цих інструкцій, ви захистите свої ключі та уникнете втрати доступу до застосунку.

Створення та зберігання keystore

Генерація через keytool:

keytool -genkeypair -v \
  -keystore release.keystore \
  -alias myapp \
  -keyalg RSA \
  -keysize 2048 \
  -validity 10000 \
  -storetype JKS

-validity 10000 — приблизно 27 років. Google рекомендує мінімум 25 років. Коротший термін — і Google Play у майбутньому відмовиться приймати оновлення. Використовуйте формат PKCS12 (-storetype PKCS12) — він у 10 разів безпечніший за JKS.

Keystore не можна зберігати в git-репозиторії. Правила зберігання: зашифрований бекап у двох хмарних сховищах, фізична копія поза офісом, паролі — окремо від файлу.

Параметри keystore: рекомендації

Параметр Рекомендація Чому
Алгоритм RSA 2048 біт Баланс безпеки та продуктивності
Термін дії 10000 днів (27 років) Забезпечує оновлення на весь життєвий цикл
Формат PKCS12 У 10 разів надійніше шифрування, ніж JKS
Alias Назва застосунку Зручно для кількох ключів

Як налаштувати Signing Config в Gradle без паролів?

Пряме вказування шляху та паролів у build.gradle — антипатерн:

// ТАК НЕ РОБИТИ — паролі в репозиторії
signingConfigs {
    release {
        storeFile file("../keys/release.keystore")
        storePassword "mysecretpassword"  // в git потрапить
        keyAlias "myapp"
        keyPassword "mysecretpassword"
    }
}

Правильний підхід — через змінні середовища або local.properties:

// build.gradle (app)
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('keystore.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

android {
    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias'] ?: System.getenv('KEY_ALIAS')
            keyPassword keystoreProperties['keyPassword'] ?: System.getenv('KEY_PASSWORD')
            storeFile keystoreProperties['storeFile'] ?
                file(keystoreProperties['storeFile']) : null
            storePassword keystoreProperties['storePassword'] ?: System.getenv('STORE_PASSWORD')
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

keystore.properties — в .gitignore. На CI передаємо змінні середовища напряму. Детальніше про Signing Config.

Для перевірки fingerprint виконайте:

keytool -list -v -keystore release.keystore -alias myapp

У Play Console: Setup → App signing → App signing key certificate — порівняйте SHA-256. Fingerprint для Firebase/OAuth беріть з app signing key, не з upload key.

Як захистити ключі від витоку?

Використовуйте змінні середовища або keystore.properties у .gitignore. Ніколи не зберігайте паролі в коді. Для CI застосовуйте base64-кодування keystore та секрети репозиторію. Це знижує ризик витоку ключів при компрометації репозиторію.

Чому варто використовувати Play App Signing?

Play App Signing — це страховка: якщо upload key втрачено, Google може його ротувати. Ви підписуєте тільки upload key, а Google перепаковує застосунок окремим app signing key. Це в 100 разів безпечніше, ніж зберігати єдиний ключ. Увімкнути можна в Play Console: Release → Setup → App signing. Після вмикання вимкнути не можна.

Порівняння методів підпису

Метод Безпека Відновлення Складність
Один ключ (upload only) Середня Немає Низька
Play App Signing Висока Так (через Google) Середня
Кілька ключів (без Play) Висока Немає Висока

Як інтегрувати підпис у CI/CD?

На GitHub Actions:

- name: Sign APK
  env:
    KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }}
    KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
    KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
    STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }}
  run: |
    echo "$KEYSTORE_BASE64" | base64 --decode > release.keystore
    ./gradlew bundleRelease \
      -Pandroid.injected.signing.store.file=$(pwd)/release.keystore \
      -Pandroid.injected.signing.store.password=$STORE_PASSWORD \
      -Pandroid.injected.signing.key.alias=$KEY_ALIAS \
      -Pandroid.injected.signing.key.password=$KEY_PASSWORD

Keystore кодуємо в base64 (base64 release.keystore) та зберігаємо в secrets репозиторію. На агенті декодуємо, використовуємо, після роботи видаляємо.

Що входить у роботу

  • Створення keystore з параметрами під ваш проєкт (алгоритм, термін, формат).
  • Конфігурація Gradle для всіх flavor-збірок.
  • Інтеграція з Play App Signing (включаючи перенесення ключів).
  • Налаштування CI/CD (GitHub Actions, GitLab CI або інший).
  • Документація зі зберігання та ротації ключів.

Типові помилки при налаштуванні підпису

  • Зберігання keystore в репозиторії — ключ може бути скомпрометований.
  • Використання JKS замість PKCS12 — у 10 разів менш безпечне шифрування.
  • Невірний fingerprint — сервіси Firebase, OAuth перестають працювати.
  • Відсутність резервної копії keystore — втрата доступу до застосунку.

Орієнтири за термінами та вартістю

Налаштування підпису для одного флейвора — від 2 до 4 годин, вартість від 4000 грн. При кількох flavor-конфігураціях та інтеграції з Play App Signing — один робочий день (від 8000 грн). Замовте консультацію по вашому проєкту вже сьогодні.

Згідно з рекомендаціями Android Developers, Play App Signing знижує ризик втрати доступу до застосунку на порядок.

Публікація застосунків в App Store та Google Play: ASO, Fastlane, рев'ю

Супроводжуємо публікацію мобільних застосунків від першого сабміту до поетапного викату. Часто стикаємося з ситуацією, коли готовий продукт повертають на доопрацювання через бюрократичні вимоги платформ, а не технічні помилки. За статистикою Apple, близько 40% перших сабмітів відхиляються — і частину причин легко усунути заздалегідь. Google Play автоматизований сильніше, але там теж бувають сюрпризи: застосунок може бути опублікований і знятий через кілька днів, коли авторев'юер дообнаружує невідповідність політикам. Наш досвід — понад 50 успішних публікацій для iOS та Android, і ми гарантуємо, що після нашої підготовки застосунок відповідає всім актуальним вимогам платформ.

Чому App Store відхиляє застосунки?

Apple Review зазвичай займає 24–48 годин (середній час за статистикою Apple — близько 90% застосунків розглядаються за добу). Expedited review — реальна опція через App Store Connect при критичних багах, але не для першого сабміту.

Часті причини відхилення, які з'їдають час:

  • Guideline 2.1 — App Completeness. Тест-акаунт не працює, демо-дані не завантажуються, частина екранів показує пустий state без пояснень. Рев'юер бачить зламаний застосунок. Рішення просте: заповнений тест-акаунт з реалістичними даними, Notes for Reviewer з покроковою інструкцією.
  • Guideline 4.3 — Spam. Застосунок схожий на інший ваш застосунок або надто простий (обгортка над веб-сайтом). Якщо у вас кілька схожих застосунків для різних країн — потрібне серйозне обґрунтування відмінностей.
  • Guideline 5.1.1 — Data Collection and Storage. Немає Privacy Policy, або в Privacy Manifest (PrivacyInfo.xcprivacy) не задекларовані required reason APIs (UserDefaults, FileTimestamp, DiskSpace, ActiveKeyboards). Apple почала відхиляти без нього ще на етапі попереднього завантаження.
  • Guideline 3.1.1 — Business — Payments. Зовнішні посилання на оплату там, де має бути IAP (StoreKit 2). Після рішення Epic vs Apple у США Apple дозволила посилання на зовнішній сайт для Reader Apps, але правила складні та залежать від категорії.

Окремий момент — App Privacy Labels. Потрібно чесно задекларувати, що збирається, навіщо, і linked to user or not. Помилки тут не блокують публікацію одразу, але Apple може запитати виправлення постфактум.

Як уникнути відхилення за 5.1.1? Інструкція

  1. Перевірте, чи включені в проекті наступні API: UserDefaults, FileTimestamp, DiskSpace, ActiveKeyboards, System Boot Time.
  2. Якщо так — додайте PrivacyInfo.xcprivacy із зазначенням reasons. Шаблон можна взяти з документації Apple.
  3. Ми зазвичай прописуємо файл на етапі налаштування проекту, а не перед сабмітом — це економить день-два на виправленнях.

Які сюрпризи ховає Google Play?

Google Play більш автоматизований, первинне рев'ю часто займає кілька годин. Але є нюанси.

  • Target SDK level — Google регулярно підвищує вимоги. Нові застосунки повинні таргетувати поточний API (наприклад, станом на сьогодні це Android 14). Якщо не оновити — застосунок стане недоступним для нових користувачів.
  • 64-bit requirement — всі застосунки з нативними бібліотеками повинні мати 64-bit версії. Flutter за замовчуванням збирає обидва варіанти, React Native з деякими нативними модулями — ні. Перевіряйте заздалегідь.
  • Data Safety Form — аналог Apple Privacy Labels, заповнюється в Play Console. Google не перевіряє автоматично при кожному релізі, але може запросити аудит.
  • Play Integrity API — заміна SafetyNet, deprecated. Для застосунків, яким важлива цілісність пристрою (банки, платіжні застосунки, ігри з анти-чит). Вимагає сервера для верифікації токена.

Що робити, якщо застосунок зняли з публікації на третій день?

Таке трапляється, коли авторев'юер дообнаружує порушення політики. Перевірте, чи відповідає застосунок поточним вимогам щодо реклами, збору даних та контенту. Якщо порушення незначне, можна подати апеляцію через Play Console. У нашій практиці близько 80% таких випадків вирішуються уточненням метаданих або виправленням помилки в конфігурації.

ASO — App Store Optimization: що реально приносить завантаження

ASO впливає на органічний трафік — це реальні завантаження без рекламного бюджету. У 95% випадків після нашої підготовки перша публікація проходить без відхилень модерації, але навіть без цього правильна оптимізація дає приріст конверсії.

Ключові фактори ранжування:

Фактор App Store Google Play Вплив на конверсію
Назва застосунку 30 символів 50 символів Найвагоміший фактор
Ключові слова 100 символів (приховане поле) Не окремо, а в описі Додатковий трафік
Опис Перші 80 символів видно Повний текст індексується До 30% переглядів
Скріншоти та відео A/B тестування Store Listing Experiments 15–30% різниці
Рейтинг та відгуки Свіжість враховується Свіжість враховується Впливає на ранжування

Використовуйте SKStoreReviewRequest.requestReview() (iOS) та ReviewManager.requestReview() (Android) після позитивної події, не при першому запуску.

Порівняння підходів до рев'ю

Критерій App Store Google Play
Середній час рев'ю 24–48 год 2–12 год
Можливість прискорення Expedited review (криті баги) Немає офіційного
Основна причина відхилення Порушення гайдлайнів дизайну та даних Порушення політик контенту
Автоматизація перевірки Людське рев'ю + частково AI Автоматизоване + вибіркова перевірка
Поетапний викат Phased Release (7 днів) Rollout (0.1%–100%)

Fastlane — автоматизація публікації

Ручна публікація — сертифікати, provisioning profiles, збірка, завантаження — займає годину і легко помилитися. Fastlane автоматизує весь пайплайн, скорочуючи час у 10 разів порівняно з ручним процесом. Замість 40 хвилин рутини — 4 хвилини автоматичної збірки та завантаження.

Ключові lanes:

  • match — керування сертифікатами через зашифрований Git-репозиторій. Вся команда використовує одні сертифікати.
  • gym (build) — fastlane gym --scheme "AppName" --configuration Release --export_method app-store.
  • deliver (upload to App Store) — завантажує бінарник, метадані, скріншоти (через fastlane snapshot).
  • supply — аналог для Google Play, підтримує all tracks з rollout параметром.

Типовый Fastfile:

lane :release_ios do
  match(type: "appstore")
  gym(scheme: "App")
  deliver(submit_for_review: true, automatic_release: false)
end

lane :release_android do
  gradle(task: "bundle", build_type: "Release")
  supply(track: "production", rollout: "0.1")
end

Інтеграція з CI/CD (GitHub Actions, Bitrise) — стандартний стек. Код підписується автоматично при мержі в main.

Чек-лист перед публікацією

  • Вказані всі дозволи в маніфесті (Android) або Info.plist (iOS) з поясненнями
  • Privacy Manifest (iOS) містить всі required reason APIs
  • Data Safety Form (Android) заповнена коректно
  • Тест-акаунт активний і має реалістичні дані
  • Немає зовнішніх посилань на оплату всередині IAP-продуктів
  • Скріншоти відповідають актуальній версії інтерфейсу
  • Версія білду інкрементована
  • Код підписаний правильним сертифікатом (Distribution, не Development)
  • 64-bit збірка присутня
  • Відсутні згадки конкурентів у метаданих

Поетапний викат та rollback

Google Play підтримує поступове розгортання: rollout: "0.05" — 5% користувачів отримують оновлення спочатку. Моніторимо Crashlytics, crash-free rate, ANR rate. Якщо показники погіршилися — зупиняємо rollout без відкликання релізу. App Store використовує Phased Release (7-денний викат). Для гнучкого управління — feature flags через Firebase Remote Config або LaunchDarkly.

Що входить в роботу з публікації

Ми готуємо повний комплект для виходу в стори:

  • Створення та налаштування акаунтів розробника (Apple Developer Program, Google Play Console) з корпоративними доступними.
  • Підготовка метаданих: назва, опис, ключові слова, категорія, віковий рейтинг.
  • Налаштування Privacy Policy та App Privacy Labels / Data Safety Form.
  • Генерація сертифікатів, provisioning profiles (через match або вручну).
  • Збірка та підпис бінарника з правильною конфігурацією (Code Signing, ProGuard/R8 shrink).
  • Завантаження бінарника та метаданих через Fastlane або вручну.
  • Проходження рев'ю: аналіз тікетів, апеляції при необхідності.
  • Налаштування поетапного викату та моніторинг метрик після релізу.
  • Навчання команди роботі з TestFlight / Firebase App Distribution.

Ми не пишемо код застосунку, не займаємося маркетингом (крім ASO-рекомендацій), не реєструємо торгові марки. Наша зона — технічна підготовка до публікації та супровід до першого релізу.

Терміни та вартість

Підготовка першого релізу: налаштування акаунтів, сертифікатів, метаданих, скріншотів, Privacy Policy — від 3 до 5 робочих днів за наявності всіх матеріалів. Налаштування Fastlane + CI/CD — від 2 до 3 днів. Рев'ю App Store — від 1 до 3 днів. Разом від готового застосунку до публікації — від 1 до 2 тижнів.

Вартість розраховується індивідуально: залежить від складності інтеграцій, кількості сторів та необхідності термінового рев'ю. Зв'яжіться з нами для оцінки вашого проекту — проаналізуємо готовність до публікації за один день.

У нас 7+ років досвіду в мобільній розробці, понад 50 успішно опублікованих застосунків для iOS та Android. Знаємо всі підводні камені App Store Review Guidelines (розділи 4.2, 5.1) та політик Google Play. Використовуємо Fastlane, CI/CD, автоматичні перевірки метаданих — щоб ви не витрачали час на рутину. Замовте консультацію — розкажемо, як скоротити цикл публікації вдвічі.