Android Developer Console API

Android Developer Console API – это RESTful-сервис, который позволяет подтвержденным разработчикам автоматизировать рабочие процессы, связанные с проверкой разработчиков Android, в Android Developer Console. В частности, с помощью этого API можно получать информацию об аккаунтах разработчиков, проверять соответствие ключевым требованиям, регистрировать названия пакетов Android и ключи подписи приложений, а также подтверждать право собственности на ключи.

Обзор, примеры использования и контекст реализации

Основные примеры использования и функции

  • Автоматическая регистрация названий пакетов CI/CD. Вы можете программно зарегистрировать десятки или сотни названий пакетов Android (CreateAndroidPackage).
  • Предварительная проверка ключей. Программная проверка того, встречалось ли название пакета в экосистеме Google и требуется ли подтверждение права собственности на ключ для регистрации определенного сертификата подписи (GetAndroidPackageRegistrationPolicy).
  • Автоматическая регистрация ключа подписи приложения и подтверждение права собственности. Регистрируйте цифровые отпечатки SHA-256 общедоступных сертификатов подписи (CreateAndroidPackageKey), получайте уникальные токены подтверждения (verificationToken) и автоматически подтверждайте владение закрытым ключом, загружая подписанные APK-файлы с помощью одного запроса или возобновляемой загрузки (VerifyAndroidPackageKeyOwnership).
  • Автоматическая отправка обоснований. Отправьте обоснования права собственности (JustifyAndroidPackageKeyRegistration).
  • Отслеживание статуса. Отслеживайте статус регистрации в аккаунтах разработчиков, названиях пакетов и ключах подписи приложений (GetDeveloperAccount, ListDeveloperAccounts, GetAndroidPackage, ListAndroidPackages, GetAndroidPackageKey, ListAndroidPackageKeys).

Полный рабочий процесс реализации

  1. Подтвердите личность разработчика в интерфейсе. Подтвердите личность разработчика (INDIVIDUAL или ORGANIZATION) в Android Developer Console, чтобы значение verificationState изменилось на VERIFIED.
  2. Включите API и выполните аутентификацию. Включите androiddeveloperconsole.googleapis.com в облачном проекте Google Cloud и получите токен доступа Bearer OAuth 2.0, делегированный пользователем, с областью действия https://www.googleapis.com/auth/androiddeveloperconsole.
  3. Узнайте название ресурса аккаунта разработчика. Вызовите GET /v1/developerAccounts (ListDeveloperAccounts), чтобы получить developerAccounts/{developer_account} и убедиться, что verificationState – это VERIFIED.
  4. Проверьте правила регистрации для названия пакета. Вызовите GET /v1/developerAccounts/{id}/androidPackages/{pkg}/registrationPolicy (GetAndroidPackageRegistrationPolicy), чтобы проверить keySelectionStrategy (SELECT_KEY_FROM_LIST или USE_ANY_KEY) и все известные ключи подписи (knownKeys).
  5. Создайте ресурс пакета Android. Вызовите POST /v1/developerAccounts/{id}/androidPackages?androidPackageId={pkg} (CreateAndroidPackage) с телом {"name": ""} (создает ресурс в состоянии DRAFT).
  6. Зарегистрируйте цифровой отпечаток ключа подписи приложения. Вызовите POST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys (CreateAndroidPackageKey) с телом JSON {"certificateFingerprintSha256": "..."}. Проверьте возвращенное состояние:
    • DRAFT – требуется подтверждение права собственности на закрытый ключ. Ответ включает уникальный параметр verificationToken для шага 7.
    • IN_REVIEW – подтверждение права собственности и обоснование пропускаются автоматически (например, при регистрации нового названия пакета, которое никогда не использовалось в Android, или если вы уже подтвердили право собственности на этот ключ подписи для другого названия пакета в том же DeveloperAccount). Пропустите шаг 7 и вызов обоснования на шаге 8 и перейдите непосредственно к опросу GetAndroidPackage и GetAndroidPackageKey.
  7. Создайте и загрузите APK-файл для подтверждения (если статус – DRAFT). Встройте возвращенную строку verificationToken в assets/adi-registration.properties в минимальном APK-файле, соответствующем packageName, подпишите его закрытым ключом подписи приложения и загрузите с помощью POST /upload/v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:verify (VerifyAndroidPackageKeyOwnership).
  8. Отправьте обоснование (если требуется) и проверьте статус регистрации. Если ключ находится в состоянии OWNERSHIP_VERIFIED, а registrationJustificationRequired имеет значение true, вызовите POST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:justifyAndroidPackageKeyRegistration (JustifyAndroidPackageKeyRegistration). Проверяйте GetAndroidPackage и GetAndroidPackageKey, пока state не достигнет REGISTERED.

Локальные команды CLI для подготовки цифровых отпечатков ключей и APK для проверки

  • Извлеките цифровой отпечаток сертификата SHA-256 из хранилища ключей (keytool):

    keytool -list -v -keystore release-key.jks -alias my-key-alias
  • Проверьте дайджест сертификата подписи SHA-256 в созданном APK-файле (apksigner):

    apksigner verify --print-certs app-release.apk
  • Проверьте название пакета APK и встроенный файл токена перед загрузкой (aapt2 и unzip):

    aapt2 dump badging app-release.apk | head -n 1
    unzip -p app-release.apk assets/adi-registration.properties

Возможности интерфейса и API Android Developer Console

Задача Веб-интерфейс Android Developer Console (android.google.com/developerconsole) Android Developer Console API
Подтверждение личности разработчика (KYC/KYB) и оплата взноса Поддерживается (требуется однократная предварительная настройка) Не поддерживается при использовании API (проверка статуса только для чтения с помощью GetDeveloperAccount и ListDeveloperAccounts)
Как посмотреть связанные аккаунты разработчиков Меню выбора аккаунтов в заголовке консоли GET /v1/developerAccounts (ListDeveloperAccounts)
Как проверить историю ключей подписи и правила для названия пакета Показывается в мастере "Зарегистрировать название пакета" GET /v1/.../registrationPolicy (GetAndroidPackageRegistrationPolicy)
Как зарегистрировать новое название пакета Android Названия пакетов > Зарегистрировать название пакета. POST /v1/{parent}/androidPackages?androidPackageId=... (CreateAndroidPackage)
Просмотр зарегистрированных и черновиков названий пакетов Таблица Названия пакетов на панели управления GET /v1/{name} (GetAndroidPackage), GET /v1/{parent}/androidPackages (ListAndroidPackages)
Добавьте ключ подписи приложения и сгенерируйте токен запроса "Сведения о пакете" > Добавить ключ подписи. POST /v1/{parent}/keys (CreateAndroidPackageKey)
Подтвердите право собственности на закрытый ключ (adi-registration.properties) Загрузите подписанный APK-файл фрагмента в интерфейсе консоли. POST /upload/v1/{name}:verify (VerifyAndroidPackageKeyOwnership)
Отправка обоснования, когда ключ требует проверки вручную Текстовая подсказка во время регистрации ключа POST /v1/{name}:justifyAndroidPackageKeyRegistration (JustifyAndroidPackageKeyRegistration)

Настройка сервиса и аутентификация

Все запросы к API должны использовать HTTPS и включать заголовок Authorization: Bearer ACCESS_TOKEN, полученный с помощью OAuth 2.0 Web Server flow для аккаунта Google, который прошел подтверждение личности разработчика в Android Developer Console.

Свойство Значение
Базовая конечная точка REST https://androiddeveloperconsole.googleapis.com
Конечная точка для загрузки медиаконтента https://androiddeveloperconsole.googleapis.com/upload
Версия API v1
Обязательная область действия OAuth 2.0 https://www.googleapis.com/auth/androiddeveloperconsole
Размер квоты по умолчанию 2,000 запросов в день на облачный проект Google Cloud на метод

Ресурсы и конечные точки API

В Android Developer Console API ресурсы организованы в следующую иерархию:

  • DeveloperAccount (developerAccounts/{developer_account})
    • AndroidPackage (developerAccounts/{developer_account}/androidPackages/{android_package})
      • AndroidPackageRegistrationPolicy (developerAccounts/{developer_account}/androidPackages/{android_package}/registrationPolicy)
      • AndroidPackageKey (developerAccounts/{developer_account}/androidPackages/{android_package}/keys/{key})

Ресурс: DeveloperAccount

Представляет аккаунт в Android Developer Console, связанный с идентификационными данными разработчика.

Поле Тип Описание
name string Идентификатор. Название ресурса в формате developerAccounts/{developer_account}.
displayName string Только для вывода. Человекочитаемое название, связанное с аккаунтом разработчика (имя физического лица или название организации).
verificationState enum (VerificationState) Только для вывода. Текущий статус подтверждения личности разработчика.

Enum: DeveloperAccount.VerificationState

Значение Описание
VERIFIED Подтверждение личности разработчика завершено. В аккаунте можно регистрировать названия пакетов и ключи подписи приложений.
NOT_VERIFIED Подтверждение личности разработчика не завершено в Android Developer Console.

Методы: DeveloperAccount

Метод HTTP-запрос Описание
GetDeveloperAccount GET /v1/{name=developerAccounts/*} Получает метаданные и статус подтверждения для одного объекта DeveloperAccount.
ListDeveloperAccounts GET /v1/developerAccounts Возвращает список всех объектов DeveloperAccount, доступных для аутентифицированного аккаунта Google (без разбивки на страницы).

Ресурс: AndroidPackage

Представляет название пакета Android, зарегистрированное или регистрируемое в DeveloperAccount.

Поле Тип Описание
name string Идентификатор. Название ресурса в формате developerAccounts/{developer_account}/androidPackages/{android_package}, где {android_package} – название пакета Android (например, com.example.myapp).
packageName string Только для вывода. Название пакета Android (например, com.example.myapp).
state enum (AndroidPackage.State) Только для вывода. Текущий статус жизненного цикла регистрации названия пакета.
registeredAppStore boolean Только для вывода. Указывает, активно ли сейчас название пакета как зарегистрированный магазин приложений.

Перечисление: AndroidPackage.State

Значение Описание
DRAFT Ресурс с названием пакета создан, а регистрация ключа подписи приложения или подтверждение права собственности ещё выполняется.
IN_REVIEW Регистрация названия пакета и обоснование необходимости ключа отправлены и находятся на рассмотрении в Google. Пакет переходит из статуса DRAFT в статус IN_REVIEW сразу после CreateAndroidPackageKey (если проверка права собственности на ключ пропущена, в том числе если ключ уже был подтвержден для другого названия пакета в том же DeveloperAccount) или после завершения VerifyAndroidPackageKeyOwnership и, если требуется, JustifyAndroidPackageKeyRegistration.
REGISTERED Название пакета зарегистрировано в этом аккаунте разработчика для проверки разработчиков Android.
PENDING_TRANSFER Название пакета ожидает завершения передачи права собственности другому аккаунту разработчика.

Ресурс: AndroidPackageRegistrationPolicy

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

Поле Тип Описание
name string Идентификатор. Название ресурса в формате developerAccounts/{developer_account}/androidPackages/{android_package}/registrationPolicy.
knownKeys[] object (KnownKey) Список ключей подписи приложения, которые ранее использовались для распространения приложений с этим названием пакета. Ключи отсортированы в лексикографическом порядке по certificateFingerprintSha256.
knownKeys[].certificateFingerprintSha256 string Только для вывода. Нормализованный 64-символьный шестнадцатеричный цифровой отпечаток SHA-256 в нижнем регистре для старого сертификата подписи (без двоеточий).
knownKeys[].justificationRequirement enum (JustificationRequirement) Только для вывода. Указывает, требуется ли для регистрации этого ключа вызов JustifyAndroidPackageKeyRegistration (REQUIRED или NOT_REQUIRED). Если ключ подписи ранее был подтвержден для другого названия пакета в том же DeveloperAccount, то VerifyAndroidPackageKeyOwnership и JustifyAndroidPackageKeyRegistration пропускаются, даже если justificationRequirement имеет значение REQUIRED.
keySelectionStrategy enum (KeySelectionStrategy) Только для вывода. Правила выбора ключа для регистрации этого названия пакета: SELECT_KEY_FROM_LIST (необходимо зарегистрировать ключ из knownKeys) или USE_ANY_KEY (можно зарегистрировать любой действительный ключ подписи приложения, принадлежащий разработчику).

Enum: KnownKey.JustificationRequirement

Значение Описание
REQUIRED Чтобы зарегистрировать этот известный ключ, после выполнения шага VerifyAndroidPackageKeyOwnership необходимо отправить письменное обоснование, выполнив шаг JustifyAndroidPackageKeyRegistration. Если ключ ранее был подтвержден для другого названия пакета в том же аккаунте DeveloperAccount, шаги VerifyAndroidPackageKeyOwnership и JustifyAndroidPackageKeyRegistration пропускаются.
NOT_REQUIRED Для регистрации этого известного ключа не требуется обоснование. Ключ переходит непосредственно к IN_REVIEW после VerifyAndroidPackageKeyOwnership (или сразу после CreateAndroidPackageKey, если ключ ранее был подтвержден в другом пакете с тем же DeveloperAccount).

Enum: AndroidPackageRegistrationPolicy.KeySelectionStrategy

Значение Описание
SELECT_KEY_FROM_LIST Вызывающий абонент должен зарегистрировать один из ключей, перечисленных в knownKeys.
USE_ANY_KEY Помимо ключей в knownKeys, вызывающий абонент может зарегистрировать любой действительный ключ подписи приложения, который ранее не использовался в экосистеме Android.

Методы: AndroidPackage

Метод HTTP-запрос Описание
GetAndroidPackageRegistrationPolicy GET /v1/{name=developerAccounts/*/androidPackages/*/registrationPolicy} Получает стратегию выбора ключа и известные ключи подписи, использовавшиеся ранее для пакета с указанным названием.
CreateAndroidPackage POST /v1/{parent=developerAccounts/*}/androidPackages?androidPackageId={package_name} Создает новый ресурс AndroidPackage в состоянии DRAFT, чтобы начать регистрацию названия пакета.
GetAndroidPackage GET /v1/{name=developerAccounts/*/androidPackages/*} Возвращает сведения и текущий статус регистрации для существующего AndroidPackage.
ListAndroidPackages GET /v1/{parent=developerAccounts/*}/androidPackages Возвращает список объектов AndroidPackage, относящихся к DeveloperAccount (pageSize, максимум 1000, pageToken).

Ресурс: AndroidPackageKey

Представляет цифровой отпечаток сертификата подписи приложения, связанный с AndroidPackage, и отслеживает статус подтверждения права собственности и проверки регистрации.

Поле Тип Описание
name string Идентификатор. Назначенное сервером название ресурса в формате developerAccounts/{developer_account}/androidPackages/{android_package}/keys/{key}, где {key} – это нормализованный 64-символьный шестнадцатеричный цифровой отпечаток SHA-256 в нижнем регистре без двоеточий. При вызове CreateAndroidPackageKey должно быть опущено или оставлено пустым.
certificateFingerprintSha256 string Обязательно. Неизменяемый объект. Хеш SHA-256 сертификата подписи приложения. В поле CreateAndroidPackageKey можно ввести 64-значный шестнадцатеричный код (60e860e8...) или шестнадцатеричный код, разделенный двоеточиями (60:E8:60:E8:...). На выходе всегда получается 64-значный шестнадцатеричный код в нижнем регистре без двоеточий.
state enum (AndroidPackageKey.State) Только для вывода. Текущее состояние жизненного цикла проверки и регистрации ключа.
verificationToken string Только для вывода. Уникальный токен запроса, сгенерированный Google. Используется, только если статус – DRAFT (можно игнорировать, если CreateAndroidPackageKey переводит ключ напрямую в IN_REVIEW). Если статус – DRAFT, встройте эту строку в assets/adi-registration.properties в подписанном APK, чтобы завершить VerifyAndroidPackageKeyOwnership.
registrationJustificationRequired boolean Только для вывода. Если true и ключ находится в состоянии OWNERSHIP_VERIFIED, вы должны отправить письменное обоснование, используя JustifyAndroidPackageKeyRegistration, прежде чем регистрация перейдет в состояние IN_REVIEW. Если CreateAndroidPackageKey переводит ключ напрямую в IN_REVIEW (поскольку ключ ранее был подтвержден для другого названия пакета в том же DeveloperAccount), обоснование пропускается.

Перечисление: AndroidPackageKey.State

Значение Описание
DRAFT Ресурс ключа создан, но по-прежнему требуется подтвердить владение закрытым ключом, загрузив подписанный APK-файл (VerifyAndroidPackageKeyOwnership), поскольку право собственности на этот ключ ещё не подтверждено ни для одного названия пакета в этом DeveloperAccount.
OWNERSHIP_VERIFIED Право собственности на закрытый ключ подтверждено с помощью загрузки подписанного APK-файла. Если registrationJustificationRequired – true, обоснование все равно требуется до начала проверки.
IN_REVIEW Регистрация ключа находится на рассмотрении Google. Ключ переходит в это состояние сразу после CreateAndroidPackageKey, если подтверждение права собственности не требуется (например, для нового названия пакета, которое ещё не использовалось в Android, или если ключ уже был подтвержден для другого названия пакета в том же DeveloperAccount, что также позволяет пропустить JustifyAndroidPackageKeyRegistration), сразу после VerifyAndroidPackageKeyOwnership (если registrationJustificationRequired – false) или после JustifyAndroidPackageKeyRegistration (если registrationJustificationRequired – true).
REGISTERED Ключ подписи приложения зарегистрирован для этого названия пакета в рамках проверки разработчиков Android.
PENDING_TRANSFER Регистрация ключа подписи приложения ожидает завершения переноса.

Методы: AndroidPackageKey

Метод HTTP-запрос Описание
CreateAndroidPackageKey POST /v1/{parent=developerAccounts/*/androidPackages/*}/keys Регистрирует новый цифровой отпечаток сертификата подписи приложения SHA-256 в AndroidPackage. Возвращает ключ в состоянии DRAFT (когда требуется подтверждение права собственности с помощью VerifyAndroidPackageKeyOwnership) или напрямую в состоянии IN_REVIEW (когда подтверждение права собственности пропускается, например для нового названия пакета, которое ещё не использовалось в Android, или ключа, уже подтвержденного для другого названия пакета в том же DeveloperAccount).
GetAndroidPackageKey GET /v1/{name=developerAccounts/*/androidPackages/*/keys/*} Получает статус, цифровой отпечаток и метаданные подтверждения для определенного объекта AndroidPackageKey.
ListAndroidPackageKeys GET /v1/{parent=developerAccounts/*/androidPackages/*}/keys Возвращает список всех объектов AndroidPackageKey, зарегистрированных в AndroidPackage (pageSize, максимум 1000, pageToken).
VerifyAndroidPackageKeyOwnership POST /upload/v1/{name=developerAccounts/*/androidPackages/*/keys/*}:verify Загрузите подписанный минимальный APK-файл, содержащий verificationToken в assets/adi-registration.properties, чтобы подтвердить право собственности на закрытый ключ и отправить готовые ключи на проверку.
JustifyAndroidPackageKeyRegistration POST /v1/{name=developerAccounts/*/androidPackages/*/keys/*}:justifyAndroidPackageKeyRegistration Отправляет дополнительное обоснование, если registrationJustificationRequired – true, и отправляет подтвержденные ключи на проверку.

Обработка ошибок

Если запрос к API не удается выполнить, Android Developer Console API возвращает код статуса HTTP 4xx или 5xx и стандартный текст ошибки JSON google.rpc.Status:

{
  "error": {
    "code": 400,
    "message": "Invalid certificate fingerprint SHA256 format.",
    "status": "INVALID_ARGUMENT",
    "details": []
  }
}

Коды статуса HTTP и способы устранения неполадок

Код HTTP Статус gRPC Основные причины Разрешение
400 Bad Request INVALID_ARGUMENT Отсутствует или недействителен androidPackageId в стиле Java; недействительный формат certificateFingerprintSha256; непустое поле name в CreateAndroidPackage или CreateAndroidPackageKey; загруженный APK-файл не подписан, поврежден, не содержит assets/adi-registration.properties, не содержит соответствующий verificationToken или подписан несоответствующим сертификатом. Проверяйте форматы запросов на соответствие схемам ресурсов, опускайте или оставляйте пустым поле name в вызовах создания, а также проверяйте подпись APK и встроенный токен с помощью apksigner verify --print-certs и unzip -p app-release.apk assets/adi-registration.properties перед загрузкой.
400 Bad Request FAILED_PRECONDITION DeveloperAccount имеет verificationState: NOT_VERIFIED; выбор ключа нарушает AndroidPackageRegistrationPolicy (SELECT_KEY_FROM_LIST); вызов VerifyAndroidPackageKeyOwnership или JustifyAndroidPackageKeyRegistration в недопустимом состоянии. Подтвердите личность разработчика в Android Developer Console, сначала проверьте GetAndroidPackageRegistrationPolicy, а затем изучите текущий state ресурса.
401 Unauthorized UNAUTHENTICATED Токен доступа OAuth 2.0 Bearer отсутствует, недействителен или срок его действия истек, или была предпринята попытка аутентификации с помощью ключа API или сервисного аккаунта. Получите новый токен доступа OAuth 2.0 Bearer, делегированный пользователем, с областью действия https://www.googleapis.com/auth/androiddeveloperconsole.
403 Forbidden PERMISSION_DENIED У аутентифицированного пользователя нет разрешения на целевой объект DeveloperAccount или AndroidPackage, или в облачном проекте Google Cloud не включен Android Developer Console API. Проверьте членство аккаунта с помощью ListDeveloperAccounts и убедитесь, что androiddeveloperconsole.googleapis.com включен в консоли Google Cloud.
404 Not Found NOT_FOUND Указанный путь к ресурсу DeveloperAccount, AndroidPackage или AndroidPackageKey не существует. Подтвердите пути к ресурсам с помощью ListDeveloperAccounts, ListAndroidPackages или ListAndroidPackageKeys. Убедитесь, что в идентификаторах {key} используются строчные шестнадцатеричные символы без двоеточий.
409 Conflict ALREADY_EXISTS Название пакета или цифровой отпечаток сертификата SHA-256 уже зарегистрированы в этом или другом аккаунте разработчика. Проверьте существующие регистрации с помощью GetAndroidPackage или GetAndroidPackageKey или проверьте историю владения с помощью GetAndroidPackageRegistrationPolicy.
429 Too Many Requests RESOURCE_EXHAUSTED Превышена квота на количество запросов в день для каждого метода в облачном проекте Google Cloud (2,000). Используйте экспоненциальную выдержку с джиттером и избегайте высокочастотных циклов опроса.
500/503 INTERNAL/UNAVAILABLE Временная ошибка сервера или недоступность сервиса. Повторите идемпотентные запросы с усеченной экспоненциальной выдержкой.

Примеры HTTP-запросов и ответов

Замените значения-плейсхолдеры, такие как ACCESS_TOKEN, 1234567890, com.example.myapp и 60e860e8..., собственными значениями.

1. GetDeveloperAccount

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890"

Ответ.

{
  "name": "developerAccounts/1234567890",
  "displayName": "Example Developer",
  "verificationState": "VERIFIED"
}

2. ListDeveloperAccounts

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts"

Ответ.

{
  "developerAccounts": [
    {
      "name": "developerAccounts/1234567890",
      "displayName": "Example Developer",
      "verificationState": "VERIFIED"
    }
  ]
}

3. GetAndroidPackageRegistrationPolicy

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/registrationPolicy"

Ответ.

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/registrationPolicy",
  "knownKeys": [
    {
      "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
      "justificationRequirement": "NOT_REQUIRED"
    }
  ],
  "keySelectionStrategy": "SELECT_KEY_FROM_LIST"
}

4. CreateAndroidPackage

curl -X POST \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json; charset=utf-8" \
  -d '{"name": ""}' \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages?androidPackageId=com.example.myapp"

Ответ.

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp",
  "packageName": "com.example.myapp",
  "state": "DRAFT",
  "registeredAppStore": false
}

5. GetAndroidPackage

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages/com.example.myapp"

Ответ.

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp",
  "packageName": "com.example.myapp",
  "state": "REGISTERED",
  "registeredAppStore": false
}

6. ListAndroidPackages

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages?pageSize=100"

Ответ.

{
  "androidPackages": [
    {
      "name": "developerAccounts/1234567890/androidPackages/com.example.myapp",
      "packageName": "com.example.myapp",
      "state": "REGISTERED",
      "registeredAppStore": false
    }
  ],
  "nextPageToken": ""
}

7. CreateAndroidPackageKey

curl -X POST \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json; charset=utf-8" \
  -d '{
    "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123"
  }' \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/keys"

Ответ.

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "state": "DRAFT",
  "verificationToken": "token_xyz987654321"
}

8. GetAndroidPackageKey

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123"

Ответ.

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "state": "REGISTERED"
}

9. ListAndroidPackageKeys

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/keys?pageSize=100"

Ответ.

{
  "androidPackageKeys": [
    {
      "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
      "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
      "state": "REGISTERED"
    }
  ],
  "nextPageToken": ""
}

10. VerifyAndroidPackageKeyOwnership

Вариант А. Загрузка медиафайлов с помощью одного запроса

curl -X POST \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/octet-stream" \
  --data-binary @app-release.apk \
  "https://androiddeveloperconsole.googleapis.com/upload/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123:verify?uploadType=media"

Вариант Б. Протокол возобновляемой загрузки (рекомендуется для больших APK-файлов или CI/CD)

Шаг 1. Начните сеанс возобновляемой загрузки и извлеките возвращенный заголовок X-Goog-Upload-URL.

curl -i -X POST \
  "https://androiddeveloperconsole.googleapis.com/upload/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123:verify" \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "X-Goog-Upload-Protocol: resumable" \
  -H "X-Goog-Upload-Command: start" \
  -H "X-Goog-Upload-Header-Content-Length: FILE_SIZE_IN_BYTES" \
  -H "X-Goog-Upload-Header-Content-Type: application/vnd.android.package-archive" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123"
  }'

Шаг 2. Загрузите подписанный двоичный APK-файл в UPLOAD_SESSION_URI и завершите сеанс.

curl -X PUT \
  "UPLOAD_SESSION_URI" \
  -H "Content-Length: FILE_SIZE_IN_BYTES" \
  -H "X-Goog-Upload-Offset: 0" \
  -H "X-Goog-Upload-Command: upload, finalize" \
  --data-binary "@app-release.apk"

Ответ.

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "state": "IN_REVIEW"
}

11. JustifyAndroidPackageKeyRegistration

curl -X POST \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json; charset=utf-8" \
  -d '{
    "justification": "We previously distributed com.example.myapp directly from https://downloads.example.com and are migrating to our rotated production key."
  }' \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123:justifyAndroidPackageKeyRegistration"

Ответ.

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "state": "IN_REVIEW",
  "registrationJustificationRequired": true
}

Дополнительные ресурсы