Подписание приложения
Ключи и подписание приложения в 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=superSecretPlay 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 — локальная установка не требуется.
Все уроки этого курса
- Подготовка сборки к выпуску
- Подписание приложения
- Play Console и страница приложения
- Поэтапные выпуски и обновления