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