← Назад к вопросам

Как подписать APK?

1.3 Junior🔥 101 комментариев
#Android компоненты

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Подписание APK-файлов: полное руководство

Подписание APK — это обязательный криптографический процесс, который подтверждает авторство приложения и гарантирует его целостность. Без валидной подписи APK не может быть установлен на устройства Android (за исключением отладочных сборок). Подпись создает цифровую "печать", которую Android система проверяет при установке и обновлении приложения.

Ключевые понятия

  • Ключевое хранилище (Keystore): Файл (обычно JKS или Java Keystore), содержащий приватные и публичные ключи.
  • Цифровой сертификат: Содержит публичный ключ и метаданные (alias, организация, срок действия).
  • Alias: Уникальное имя ключа внутри хранилища.
  • Отпечаток (Fingerprint): SHA-1 или SHA-256 хэш сертификата, уникальный идентификатор.

Основные этапы подписания

1. Создание ключевого хранилища

keytool -genkeypair -v -keystore my-release-key.jks \
  -keyalg RSA -keysize 2048 -validity 10000 \
  -alias my-alias \
  -dname "CN=My Company, OU=Development, O=Company Ltd, L=Moscow, ST=Moscow, C=RU"

Важно:

  • Храните keystore в безопасном месте (никогда не добавляйте в VCS!)
  • Запомните или сохраните пароли (от хранилища и ключа)
  • Срок действия (validity) должен быть не менее 25 лет для долгосрочных приложений

2. Подписание через Gradle (рекомендуемый способ)

В app/build.gradle:

android {
    signingConfigs {
        release {
            storeFile file("path/to/your/keystore.jks")
            storePassword System.getenv("STORE_PASSWORD")
            keyAlias System.getenv("KEY_ALIAS")
            keyPassword System.getenv("KEY_PASSWORD")
        }
    }
    
    buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

Безопасность: Никогда не храните пароли в открытом виде! Используйте:

  • Переменные окружения (как в примере выше)
  • Файлы gradle.properties (не коммитить!)
  • Флаги командной строки
  • Secret Management системы (например, AWS Secrets Manager)

3. Ручное подписание APK

# Подписание с использованием apksigner (рекомендуется с Android 7.0+)
apksigner sign --ks my-release-key.jks --ks-key-alias my-alias --out app-release-signed.apk app-release-unsigned.apk

# Проверка подписи
apksigner verify --verbose app-release-signed.apk

4. Подписание App Bundle (AAB)

# Для Android App Bundles используем jarsigner
jarsigner -keystore my-release-key.jks -verbose my-app.aab my-alias

# Или через bundletool
bundletool build-apks --bundle=my-app.aab --output=my-app.apks --ks=my-release-key.jks --ks-key-alias=my-alias

Типы подписей

Отладочная подпись (Debug)

  • Создается автоматически Android SDK
  • Хранится в ~/.android/debug.keystore
  • Пароль по умолчанию: "android"
  • Используется только для разработки
  • Действительна 365 дней

Пользовательская подпись (Release)

  • Создается разработчиком
  • Используется для публикации в магазинах
  • Крайне важна для безопасности: при утере нет восстановления!

Best Practices и важные предупреждения

Критически важные правила:

  1. Бесспорный приоритет: Никогда не теряйте release keystore и пароли

    • Без них невозможно обновлять приложение в Google Play
    • Под каждое приложение — свой уникальный keystore
    • Регулярно делайте резервные копии в зашифрованном виде
  2. Версионирование ключей: Рассмотрите ротацию ключей для долгоживущих приложений

    • Создайте новый ключ до истечения срока старого
    • Поддерживайте оба ключа в переходный период
  3. Защита в CI/CD:

    # Пример для GitHub Actions
    - name: Sign APK
      run: |
        echo "${{ secrets.RELEASE_KEYSTORE }}" | base64 --decode > keystore.jks
        ./gradlew assembleRelease -PstorePassword="${{ secrets.STORE_PASSWORD }}" -PkeyPassword="${{ secrets.KEY_PASSWORD }}"
    
  4. Проверка перед публикацией:

    # Проверяем отпечаток сертификата
    keytool -list -v -keystore my-release-key.jks -alias my-alias
    
    # Проверяем подпись APK
    apksigner verify --print-certs app-release.apk
    

Частые проблемы и решения

  • "Срок действия истекает": Создайте новый ключ и планируйте миграцию заранее
  • "Подпись не соответствует предыдущей": Используете не тот keystore или alias
  • "V1/V2/V3/V4 подписи": Современные APK требуют схем V2+, но V1 нужна для обратной совместимости
  • "Permission denied": Убедитесь, что файл keystore доступен для чтения

V1, V2, V3, V4: эволюция схем подписания

  • V1 (JAR signing): Подписывает только отдельные файлы в APK
  • V2 (APK Signature Scheme v2): Подписывает все содержимое APK целиком (Android 7.0+)
  • V3 (APK Signature Scheme v3): Поддержка ротации ключей (Android 9.0+)
  • V4: Оптимизация для инкрементальных обновлений

Рекомендация: Используйте все схемы для максимальной совместимости:

apksigner sign --v1-signing-enabled true --v2-signing-enabled true --v3-signing-enabled true ...

Инструментарий

  • Android Studio: Встроенная поддержка через "Generate Signed Bundle/APK"
  • Gradle: Автоматизация в сборке (предпочтительно)
  • apksigner: Официальный инструмент командной строки (входит в Android SDK Build Tools)
  • jarsigner: Универсальный инструмент Java (для AAB и legacy)

Помните: подпись APK — это ваша цифровая идентичность в экосистеме Android. Правильное управление ключами подписи — не техническая формальность, а критически важный аспект жизненного цикла приложения, напрямую влияющий на возможность его поддержки и обновления на протяжении многих лет.

Как подписать APK? | PrepBro