0Pricing
Android Academy · Урок

Подписание приложения

Ключи и подписание приложения в Play

«Подписание приложения» — бесплатный урок Android Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 4 уроков всего.

Зачем приложения нужно подписывать

Android не установит приложение, если оно не подписано цифровой подписью. Подпись подтверждает два факта: кто опубликовал приложение и что с момента публикации APK не был изменён.

Особенно важно, что подпись связывает обновления с исходным приложением. Обновление принимается только в том случае, если оно подписано тем же ключом, что и установленная версия. Если вы потеряете этот ключ, обновлять приложение больше не сможете — никогда.

В этом уроке рассматриваются хранилища ключей, конфигурация подписи и более безопасный современный подход Google: Play App Signing.

Хранилища ключей и ключи

Идентификатор, используемый для подписи, хранится в файле хранилища ключей (.jks или .keystore). Одно хранилище может содержать несколько ключей; у каждого ключа есть псевдоним и собственный пароль.

  • Пароль хранилища ключей — открывает файл.
  • Псевдоним ключа — обозначает ключ внутри хранилища.
  • Пароль ключа — открывает именно этот ключ.

Отладочные сборки, которые вы запускаете каждый день, автоматически подписываются временным отладочным хранилищем ключей. Для выпуска понадобится собственное хранилище.

Создание хранилища ключей

Создать хранилище ключей можно в диалоговом окне Android Studio или с помощью команды keytool, которая поставляется вместе с JDK.

Укажите длительный срок действия (25 лет и более): если срок действия ключа истечёт, вы не сможете публиковать обновления. RSA 2048 — стандартный вариант.

keytool -genkeypair \
  -v \
  -keystore release.jks \
  -alias upload \
  -keyalg RSA \
  -keysize 2048 \
  -validity 10000

Блок signingConfigs

Чтобы автоматически подписывать приложение во время сборки Gradle, объявите элемент signingConfigs и подключите его к типу сборки release.

Это работает, но обратите внимание: пароли находятся прямо в файле сборки. Далее мы исправим это.

android {
    signingConfigs {
        create("release") {
            storeFile = file("release.jks")
            storePassword = "superSecret"
            keyAlias = "upload"
            keyPassword = "superSecret"
        }
    }
    buildTypes {
        release {
            signingConfig = signingConfigs.getByName("release")
            isMinifyEnabled = true
        }
    }
}

Не храните секреты в Git

Никогда не добавляйте пароли или хранилище ключей в систему контроля версий. Вместо этого считывайте их из локального файла keystore.properties, исключённого из Git.

Добавьте keystore.properties и *.jks в .gitignore.

// top of app/build.gradle.kts
val keystoreProps = Properties().apply {
    val f = rootProject.file("keystore.properties")
    if (f.exists()) load(f.inputStream())
}

android {
    signingConfigs {
        create("release") {
            storeFile = file(keystoreProps["storeFile"] as String)
            storePassword = keystoreProps["storePassword"] as String
            keyAlias = keystoreProps["keyAlias"] as String
            keyPassword = keystoreProps["keyPassword"] as String
        }
    }
}

Файл keystore.properties

Соответствующий файл свойств представляет собой обычный список пар «ключ=значение». Его не добавляют в Git и хранят в безопасном месте (например, в менеджере паролей или хранилище секретов CI).

На сервере CI их следует передавать как секреты, получаемые из переменных окружения, а не в виде файла, добавленного в репозиторий.

# keystore.properties  (git-ignored!)
storeFile=release.jks
storePassword=superSecret
keyAlias=upload
keyPassword=superSecret

Play App Signing

Современный Play использует Play App Signing. В этом случае Google хранит настоящий ключ подписи приложения в защищённой инфраструктуре и использует его для подписи APK, доставляемых пользователям.

Вы управляете только ключом загрузки: подписываете им пакет и загружаете его. Play проверяет ключ загрузки, удаляет его подпись и повторно подписывает пакет ключом подписи приложения.

Главное преимущество: если вы потеряете ключ загрузки, можно запросить его сброс, а ключ подписи приложения — тот, которому доверяют пользователи, — останется в безопасности у Google.

Ключ загрузки и ключ подписи приложения

Два ключа, две задачи — не путайте их:

  • Ключ загрузки — ваш ключ. Им подписывается загружаемый AAB. При потере его можно сбросить.
  • Ключ подписи приложения — ключ Google или ключ, который вы однажды загрузили. Им подписываются итоговые APK, устанавливаемые пользователями. Он постоянный.

При регистрации нового приложения проще всего позволить Google создать ключ подписи приложения, а загрузки подписывать собственным ключом загрузки.

Проверка подписи

Чтобы определить, как подписан артефакт, используйте apksigner из инструментов сборки Android SDK. Он показывает сертификат подписи и имеющиеся схемы подписи (v1/v2/v3).

Сравнение отпечатка сертификата SHA-256 также используется для регистрации приложения в таких сервисах, как Firebase или Google Sign-In.

# Verify and print signer certificates of an APK
apksigner verify --print-certs app-release.apk

# Show the SHA-256 fingerprint of a keystore key
keytool -list -v -keystore release.jks -alias upload

Защита ключей

Ключ загрузки сложно заменить, а ключ подписи приложения (если вы управляете им самостоятельно) заменить невозможно. Относитесь к ним как к величайшей ценности:

  • Создавайте резервные копии хранилища ключей как минимум в двух безопасных местах.
  • Храните пароли в менеджере паролей, а не в исходном коде.
  • Используйте Play App Signing, чтобы потерянный ключ загрузки можно было восстановить.
  • Ограничьте круг участников команды, имеющих доступ к хранилищу ключей.

Многие опубликованные приложения были заброшены только потому, что разработчик потерял ключ и больше не мог выпускать обновления.

Объединяем всё вместе

Полный процесс подписи выпуска выглядит так:

  • Создайте хранилище ключа загрузки с помощью keytool.
  • Подключите его через signingConfigs, считывая секреты из keystore.properties.
  • Соберите подписанный .aab с помощью ./gradlew bundleRelease.
  • Загрузите пакет в Play: перед доставкой пользователям сервис повторно подпишет его ключом подписи приложения.

С этого момента каждое обновление должно быть подписано тем же ключом загрузки.

Быстрая проверка

Если включён Play App Signing, каким ключом вы подписываете загружаемый пакет и что произойдёт, если вы его потеряете?

Итоги: подпись приложения

Именно подпись делает приложение Android устанавливаемым и обновляемым:

  • Хранилище ключей содержит ключи; у каждого ключа есть псевдоним и пароли.
  • Создайте ключ с длительным сроком действия с помощью keytool и подключите его через signingConfigs.
  • Храните пароли за пределами Git с помощью keystore.properties и .gitignore.
  • Play App Signing разделяет ключи на ваш сбрасываемый ключ загрузки и постоянный ключ подписи приложения Google.
  • Тщательно создавайте резервные копии ключей: потеря ключа может положить конец существованию приложения.

Далее: настройка Play Console и страницы приложения в магазине.

Часто задаваемые вопросы

Урок «Подписание приложения» бесплатный?

Да — полный текст урока «Подписание приложения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 4 уроков всего.

Чему я научусь в уроке «Подписание приложения»?

Ключи и подписание приложения в Play Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Android Academy?

Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Подписание приложения»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Android Academy?

Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Подготовка сборки к выпуску
  2. Подписание приложения
  3. Play Console и страница приложения
  4. Поэтапные выпуски и обновления
← Назад к Android Academy