A API Android Developer Console é um serviço RESTful que permite que desenvolvedores verificados automatizem os fluxos de trabalho de verificação de desenvolvedor Android no Android Developer Console, incluindo a recuperação de contas de desenvolvedor, a verificação dos principais requisitos de qualificação, o registro de nomes de pacotes do Android, o registro de chaves de assinatura de apps e a verificação da propriedade de chaves.
Visão geral, casos de uso e contexto de implementação
Principais casos de uso e recursos
- Registro automatizado de nomes de pacotes de CI/CD:registre dezenas ou centenas
de nomes de pacotes Android de forma programática (
CreateAndroidPackage). - Inspeção prévia da política de chaves históricas:inspecione de forma programática
se o Google já observou um nome de pacote no ecossistema e
se o registro de um certificado de assinatura específico requer a verificação de propriedade
da chave (
GetAndroidPackageRegistrationPolicy). - Registro automatizado de chaves de assinatura de apps e verificação de propriedade:registre impressões digitais SHA-256 de certificados de assinatura pública
(
CreateAndroidPackageKey), recupere tokens de desafio de verificação exclusivos (verificationToken) e automatize a comprovação de posse de chaves privadas usando uploads de APKs assinados de solicitação única ou retomáveis (VerifyAndroidPackageKeyOwnership). - Envio de justificativa programática:envie justificativas de propriedade
(
JustifyAndroidPackageKeyRegistration). - Monitoramento de status:monitore o status de registro em contas de desenvolvedor, nomes de pacotes e chaves de assinatura de apps (
GetDeveloperAccount,ListDeveloperAccounts,GetAndroidPackage,ListAndroidPackages,GetAndroidPackageKey,ListAndroidPackageKeys).
Fluxo de trabalho de implementação de ponta a ponta
- Verificar a identidade do desenvolvedor uma vez na interface:conclua a verificação de identidade do desenvolvedor (
INDIVIDUALouORGANIZATION) no Android Developer Console para queverificationStatesejaVERIFIED. - Ative a API e faça a autenticação:ative
androiddeveloperconsole.googleapis.comno projeto na nuvem do Google Cloud e receba um token de acesso do portador do OAuth 2.0 delegado pelo usuário com o escopohttps://www.googleapis.com/auth/androiddeveloperconsole. - Descubra o nome do recurso da sua conta de desenvolvedor:chame
GET /v1/developerAccounts(ListDeveloperAccounts) para recuperardeveloperAccounts/{developer_account}e verifique severificationStateéVERIFIED. - Verifique a política de registro do nome do pacote:chame
GET /v1/developerAccounts/{id}/androidPackages/{pkg}/registrationPolicy(GetAndroidPackageRegistrationPolicy) para inspecionarkeySelectionStrategy(SELECT_KEY_FROM_LISTouUSE_ANY_KEY) e todas as chaves de assinatura históricas conhecidas (knownKeys). - Criar o recurso de pacote do Android:chame
POST /v1/developerAccounts/{id}/androidPackages?androidPackageId={pkg}(CreateAndroidPackage) com o corpo{"name": ""}(cria o recurso no estadoDRAFT). - Registre a impressão digital da chave de assinatura do app:chame
POST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys(CreateAndroidPackageKey) com o corpo JSON{"certificateFingerprintSha256": "..."}. Inspecione o estado retornado:DRAFT: é necessário comprovar a propriedade da chave privada, e a resposta inclui umverificationTokenexclusivo para a Etapa 7.IN_REVIEW: a prova de propriedade e a justificativa são ignoradas automaticamente (por exemplo, ao registrar um novo nome de pacote que nunca foi visto no Android ou quando você já tiver verificado a propriedade dessa chave de assinatura para outro nome de pacote no mesmoDeveloperAccount). Pule a etapa 7 e a chamada de justificativa na etapa 8 e prossiga diretamente para a sondagem deGetAndroidPackageeGetAndroidPackageKey.
- Crie e faça upload do APK de verificação (se o estado for
DRAFT): incorpore a stringverificationTokenretornada emassets/adi-registration.propertiesdentro de um APK mínimo que corresponda apackageName, assine-o com sua chave de assinatura do app privada e faça upload dele usandoPOST /upload/v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:verify(VerifyAndroidPackageKeyOwnership). - Envie a justificativa (se necessário) e o status do registro de pesquisa:se a
chave estiver no estado
OWNERSHIP_VERIFIEDeregistrationJustificationRequiredfortrue, chamePOST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:justifyAndroidPackageKeyRegistration(JustifyAndroidPackageKeyRegistration). PesquiseGetAndroidPackageeGetAndroidPackageKeyaté questatealcanceREGISTERED.
Comandos da CLI local para preparar impressões digitais de chaves e APKs de verificação
Extraia a impressão digital do certificado SHA-256 de um keystore (
keytool):keytool -list -v -keystore release-key.jks -alias my-key-aliasVerificar o resumo do certificado de assinatura SHA-256 em um APK criado (
apksigner):apksigner verify --print-certs app-release.apkInspecione o nome do pacote do APK e o arquivo de token incorporado antes do upload (
aapt2eunzip):aapt2 dump badging app-release.apk | head -n 1 unzip -p app-release.apk assets/adi-registration.properties
Recursos de interface e API do Android Developer Console
| Tarefa | Interface da Web do Android Developer Console (android.google.com/developerconsole) |
API Android Developer Console |
|---|---|---|
| Confirmação de identidade do desenvolvedor (KYC/KYB) e pagamento de taxas | Compatível (pré-requisito único obrigatório) | Não há suporte para o uso da API (verificação de status somente leitura usando GetDeveloperAccount e ListDeveloperAccounts) |
| Ver contas de desenvolvedor vinculadas | Seletor de contas no cabeçalho do console | GET /v1/developerAccounts (ListDeveloperAccounts) |
| Inspecionar chaves de assinatura históricas e a política de um nome de pacote | Exibido durante o assistente "Registrar nome do pacote" | GET /v1/.../registrationPolicy (GetAndroidPackageRegistrationPolicy) |
| Registrar um novo nome de pacote Android | Nomes de pacote > Registrar nome do pacote | POST /v1/{parent}/androidPackages?androidPackageId=... (CreateAndroidPackage) |
| Ver ou listar nomes de pacotes registrados e em rascunho | Tabela do painel Nomes de pacotes | GET /v1/{name} (GetAndroidPackage), GET /v1/{parent}/androidPackages (ListAndroidPackages) |
| Adicionar uma chave de assinatura do app e gerar um token de desafio | Detalhes do pacote > Adicionar chave de assinatura | POST /v1/{parent}/keys (CreateAndroidPackageKey) |
Comprovar a propriedade da chave privada (adi-registration.properties) |
Fazer upload do APK de snippet assinado na interface do console | POST /upload/v1/{name}:verify (VerifyAndroidPackageKeyOwnership) |
| Enviar justificativa quando a chave exigir revisão manual | Comando de texto durante o fluxo de trabalho de registro de chave | POST /v1/{name}:justifyAndroidPackageKeyRegistration (JustifyAndroidPackageKeyRegistration) |
Configurações de serviço e autenticação
Todas as solicitações de API precisam usar HTTPS e incluir um cabeçalho Authorization: Bearer
ACCESS_TOKEN recebido pelo fluxo do servidor da Web OAuth 2.0 para uma Conta do Google que tenha concluído a confirmação de identidade do desenvolvedor no Android Developer Console.
| Propriedade | Valor |
|---|---|
| Endpoint REST base | https://androiddeveloperconsole.googleapis.com |
| Endpoint de upload de mídia | https://androiddeveloperconsole.googleapis.com/upload |
| Versão da API | v1 |
| Escopo do OAuth 2.0 obrigatório | https://www.googleapis.com/auth/androiddeveloperconsole |
| Limite de cota padrão | 2,000 solicitações por dia por projeto do Google Cloud por método |
Recursos e endpoints de API
A API Android Developer Console organiza os recursos na seguinte hierarquia:
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})
Recurso: DeveloperAccount
Representa uma conta no Android Developer Console associada a uma identidade de desenvolvedor.
| Campo | Tipo | Descrição |
|---|---|---|
name |
string |
Identificador. Nome do recurso no formato developerAccounts/{developer_account}. |
displayName |
string |
Apenas saída. Nome legível por humanos associado à conta de desenvolvedor (nome individual ou da organização). |
verificationState |
enum (VerificationState) |
Apenas saída. Status atual da confirmação de identidade do desenvolvedor da conta. |
Enum: DeveloperAccount.VerificationState
| Valor | Descrição |
|---|---|
VERIFIED |
A confirmação de identidade do desenvolvedor foi concluída. A conta pode registrar nomes de pacotes e chaves de assinatura de apps. |
NOT_VERIFIED |
A confirmação de identidade do desenvolvedor não foi concluída no Android Developer Console. |
Métodos: DeveloperAccount
| Método | Solicitação HTTP | Descrição |
|---|---|---|
GetDeveloperAccount |
GET /v1/{name=developerAccounts/*} |
Recupera metadados e o estado de verificação de um único DeveloperAccount. |
ListDeveloperAccounts |
GET /v1/developerAccounts |
Lista todos os objetos DeveloperAccount acessíveis à Conta do Google autenticada (sem paginação). |
Recurso: AndroidPackage
Representa um nome de pacote Android registrado ou em processo de registro em um
DeveloperAccount.
| Campo | Tipo | Descrição |
|---|---|---|
name |
string |
Identificador. Nome do recurso no formato developerAccounts/{developer_account}/androidPackages/{android_package}, em que {android_package} é o nome do pacote Android (por exemplo, com.example.myapp). |
packageName |
string |
Apenas saída. O nome do pacote do Android (por exemplo, com.example.myapp). |
state |
enum (AndroidPackage.State) |
Apenas saída. Estado atual do ciclo de vida do registro do nome do pacote. |
registeredAppStore |
boolean |
Apenas saída. Indica se o nome do pacote está ativo como uma app store registrada. |
Enumeração: AndroidPackage.State
| Valor | Descrição |
|---|---|
DRAFT |
O recurso de nome do pacote foi criado, e o registro da chave de assinatura do app ou a verificação de propriedade ainda está em andamento. |
IN_REVIEW |
O registro do nome do pacote e as justificativas de chave necessárias foram enviados e estão em análise pelo Google. Um pacote passa de DRAFT para IN_REVIEW imediatamente após CreateAndroidPackageKey (quando a verificação de propriedade da chave é ignorada, incluindo quando a chave já foi verificada para outro nome de pacote no mesmo DeveloperAccount) ou após concluir VerifyAndroidPackageKeyOwnership e, se necessário, JustifyAndroidPackageKeyRegistration. |
REGISTERED |
O nome do pacote está registrado ativamente nesta conta de desenvolvedor para a verificação de desenvolvedor Android. |
PENDING_TRANSFER |
O nome do pacote está aguardando a conclusão de uma transferência de propriedade para outra conta de desenvolvedor. |
Recurso: AndroidPackageRegistrationPolicy
Recurso singleton retornado por
GetAndroidPackageRegistrationPolicy
que descreve as chaves de assinatura públicas históricas detectadas para um nome de pacote e
se o registro do nome do pacote com uma determinada chave de assinatura requer uma justificativa
por escrito.
| Campo | Tipo | Descrição |
|---|---|---|
name |
string |
Identificador. Nome do recurso no formato developerAccounts/{developer_account}/androidPackages/{android_package}/registrationPolicy. |
knownKeys[] |
object (KnownKey) |
Lista de chaves de assinatura do app históricas observadas anteriormente distribuindo apps com esse nome de pacote, classificadas lexicograficamente por certificateFingerprintSha256. |
knownKeys[].certificateFingerprintSha256 |
string |
Apenas saída. Impressão digital SHA-256 hexadecimal normalizada de 64 caracteres em minúsculas do certificado de assinatura histórico (sem dois-pontos). |
knownKeys[].justificationRequirement |
enum (JustificationRequirement) |
Apenas saída. Indica se o registro dessa chave requer a chamada de JustifyAndroidPackageKeyRegistration (REQUIRED ou NOT_REQUIRED). Se a chave de assinatura foi verificada anteriormente em outro nome de pacote no mesmo DeveloperAccount, VerifyAndroidPackageKeyOwnership e JustifyAndroidPackageKeyRegistration serão ignorados, mesmo quando justificationRequirement for REQUIRED. |
keySelectionStrategy |
enum (KeySelectionStrategy) |
Apenas saída. Política de seleção de chave para registrar este nome de pacote: SELECT_KEY_FROM_LIST (é necessário registrar uma chave de knownKeys) ou USE_ANY_KEY (qualquer chave de assinatura de app válida do desenvolvedor pode ser registrada). |
Enumeração: KnownKey.JustificationRequirement
| Valor | Descrição |
|---|---|
REQUIRED |
Para registrar essa chave conhecida, é necessário enviar uma justificativa por escrito usando JustifyAndroidPackageKeyRegistration após concluir VerifyAndroidPackageKeyOwnership (a menos que a chave tenha sido verificada anteriormente em outro nome de pacote no mesmo DeveloperAccount. Nesse caso, VerifyAndroidPackageKeyOwnership e JustifyAndroidPackageKeyRegistration são ignorados). |
NOT_REQUIRED |
O registro dessa chave conhecida não requer uma justificativa. A chave passa diretamente para IN_REVIEW após VerifyAndroidPackageKeyOwnership (ou imediatamente após CreateAndroidPackageKey se a chave tiver sido verificada anteriormente em outro nome de pacote no mesmo DeveloperAccount). |
Tipo enumerado: AndroidPackageRegistrationPolicy.KeySelectionStrategy
| Valor | Descrição |
|---|---|
SELECT_KEY_FROM_LIST |
O autor da chamada precisa registrar uma das chaves históricas listadas em knownKeys. |
USE_ANY_KEY |
Além das chaves em knownKeys, o autor da chamada pode registrar qualquer chave de assinatura do app válida que não tenha sido observada anteriormente no ecossistema Android. |
Métodos: AndroidPackage
| Método | Solicitação HTTP | Descrição |
|---|---|---|
GetAndroidPackageRegistrationPolicy |
GET /v1/{name=developerAccounts/*/androidPackages/*/registrationPolicy} |
Recupera a estratégia de seleção de chaves e as chaves de assinatura históricas conhecidas de um nome de pacote. |
CreateAndroidPackage |
POST /v1/{parent=developerAccounts/*}/androidPackages?androidPackageId={package_name} |
Cria um novo recurso AndroidPackage no estado DRAFT para começar a registrar um nome de pacote. |
GetAndroidPackage |
GET /v1/{name=developerAccounts/*/androidPackages/*} |
Recupera detalhes e o estado de registro atual de um AndroidPackage. |
ListAndroidPackages |
GET /v1/{parent=developerAccounts/*}/androidPackages |
Lista objetos AndroidPackage em um DeveloperAccount (pageSize máximo de 1000, pageToken). |
Recurso: AndroidPackageKey
Representa uma impressão digital do certificado de assinatura de apps público associada a um
AndroidPackage e rastreia o estado de verificação de propriedade e análise de
registro.
| Campo | Tipo | Descrição |
|---|---|---|
name |
string |
Identificador. Nome do recurso atribuído pelo servidor no formato developerAccounts/{developer_account}/androidPackages/{android_package}/keys/{key}, em que {key} é uma impressão digital SHA-256 hexadecimal normalizada de 64 caracteres em minúsculas sem dois-pontos. Precisa ser omitido ou vazio ao chamar CreateAndroidPackageKey. |
certificateFingerprintSha256 |
string |
Obrigatório. Imutável. Hash SHA-256 do certificado de assinatura de apps. Na entrada em CreateAndroidPackageKey, aceita hexadecimal simples de 64 caracteres (60e860e8...) ou hexadecimal separado por dois-pontos (60:E8:60:E8:...). Na saída, sempre normalizado para hexadecimal minúsculo de 64 caracteres sem dois-pontos. |
state |
enum (AndroidPackageKey.State) |
Apenas saída. Estado atual do ciclo de vida de verificação e registro da chave. |
verificationToken |
string |
Apenas saída. Token de desafio exclusivo gerado pelo Google. Usado apenas quando o estado é DRAFT (pode ser ignorado quando CreateAndroidPackageKey faz a transição da chave diretamente para IN_REVIEW). Quando o estado é DRAFT, incorpore essa string em assets/adi-registration.properties em um APK assinado para concluir VerifyAndroidPackageKeyOwnership. |
registrationJustificationRequired |
boolean |
Apenas saída. Se true e a chave estiverem no estado OWNERSHIP_VERIFIED, você precisará enviar uma justificativa por escrito usando JustifyAndroidPackageKeyRegistration antes que o registro prossiga para IN_REVIEW. Se CreateAndroidPackageKey fizer a transição da chave diretamente para IN_REVIEW (porque a chave foi verificada anteriormente em outro nome de pacote no mesmo DeveloperAccount), a justificativa será ignorada. |
Enumeração: AndroidPackageKey.State
| Valor | Descrição |
|---|---|
DRAFT |
O recurso de chave foi criado, e a comprovação de posse da chave privada usando o upload do APK assinado (VerifyAndroidPackageKeyOwnership) ainda é necessária porque a propriedade dessa chave ainda não foi verificada em nenhum nome de pacote neste DeveloperAccount. |
OWNERSHIP_VERIFIED |
A propriedade da chave privada foi verificada usando o upload de um APK assinado. Se registrationJustificationRequired for true, ainda será necessário fornecer uma justificativa antes do início da análise. |
IN_REVIEW |
O registro da chave está em análise pelo Google. Uma chave faz a transição para cá imediatamente após CreateAndroidPackageKey quando a comprovação de propriedade não é necessária (por exemplo, em um novo nome de pacote que nunca foi visto no Android ou quando a chave foi verificada anteriormente em outro nome de pacote no mesmo DeveloperAccount, o que também pula JustifyAndroidPackageKeyRegistration), diretamente após VerifyAndroidPackageKeyOwnership (se registrationJustificationRequired for false) ou após JustifyAndroidPackageKeyRegistration (se registrationJustificationRequired for true). |
REGISTERED |
A chave de assinatura do app está registrada ativamente nesse nome de pacote para a verificação de desenvolvedor Android. |
PENDING_TRANSFER |
O registro da chave de assinatura do app está aguardando a conclusão de uma transferência. |
Métodos: AndroidPackageKey
| Método | Solicitação HTTP | Descrição |
|---|---|---|
CreateAndroidPackageKey |
POST /v1/{parent=developerAccounts/*/androidPackages/*}/keys |
Registra uma nova impressão digital SHA-256 do certificado de assinatura de apps em um AndroidPackage. Retorna a chave no estado DRAFT (quando a comprovação de propriedade usando VerifyAndroidPackageKeyOwnership é necessária) ou diretamente no estado IN_REVIEW (quando a verificação de propriedade é ignorada, como para um novo nome de pacote que nunca foi visto no Android ou uma chave já verificada em outro nome de pacote no mesmo DeveloperAccount). |
GetAndroidPackageKey |
GET /v1/{name=developerAccounts/*/androidPackages/*/keys/*} |
Recupera o status, a impressão digital e os metadados de verificação de um AndroidPackageKey específico. |
ListAndroidPackageKeys |
GET /v1/{parent=developerAccounts/*/androidPackages/*}/keys |
Lista todos os objetos AndroidPackageKey registrados em um AndroidPackage (pageSize máximo 1000, pageToken). |
VerifyAndroidPackageKeyOwnership |
POST /upload/v1/{name=developerAccounts/*/androidPackages/*/keys/*}:verify |
Faz upload de um APK mínimo assinado que contém verificationToken em assets/adi-registration.properties para verificar a propriedade da chave privada e enviar as chaves prontas para revisão. |
JustifyAndroidPackageKeyRegistration |
POST /v1/{name=developerAccounts/*/androidPackages/*/keys/*}:justifyAndroidPackageKeyRegistration |
Envia mais contexto de justificativa quando registrationJustificationRequired é true e envia chaves verificadas para análise. |
Tratamento de erros
Quando uma solicitação de API falha, a API Android Developer Console retorna um código de status HTTP 4xx ou 5xx e um corpo de erro JSON google.rpc.Status padrão:
{
"error": {
"code": 400,
"message": "Invalid certificate fingerprint SHA256 format.",
"status": "INVALID_ARGUMENT",
"details": []
}
}
Códigos de status HTTP e soluções comuns
| Código HTTP | Status do gRPC | Causas comuns | Resolução |
|---|---|---|---|
400 Bad Request |
INVALID_ARGUMENT |
androidPackageId no estilo Java ausente ou inválido; formato certificateFingerprintSha256 inválido; campo name não vazio em CreateAndroidPackage ou CreateAndroidPackageKey; o APK enviado não está assinado, está corrompido, não tem assets/adi-registration.properties, não tem verificationToken correspondente ou está assinado com um certificado incompatível. |
Valide os formatos de solicitação em relação aos esquemas de recursos, omita ou esvazie name nas chamadas de criação e verifique a assinatura do APK e o token incorporado usando apksigner verify --print-certs e unzip -p app-release.apk assets/adi-registration.properties antes de fazer o upload. |
400 Bad Request |
FAILED_PRECONDITION |
DeveloperAccount tem verificationState: NOT_VERIFIED; a seleção de chave viola AndroidPackageRegistrationPolicy (SELECT_KEY_FROM_LIST); chamada de VerifyAndroidPackageKeyOwnership ou JustifyAndroidPackageKeyRegistration em um estado não qualificado. |
Conclua a confirmação de identidade do desenvolvedor no Android Developer Console, verifique primeiro o GetAndroidPackageRegistrationPolicy e inspecione o state atual do recurso. |
401 Unauthorized |
UNAUTHENTICATED |
Token de acesso do portador do OAuth 2.0 ausente, expirado ou inválido, ou tentativa de autenticação usando uma chave de API ou conta de serviço. | Consiga um novo token de acesso do portador do OAuth 2.0 delegado pelo usuário com o escopo https://www.googleapis.com/auth/androiddeveloperconsole. |
403 Forbidden |
PERMISSION_DENIED |
O usuário autenticado não tem permissão no DeveloperAccount ou AndroidPackage de destino, ou a API Android Developer Console não está ativada no projeto na nuvem do Google Cloud. |
Verifique a associação da conta usando ListDeveloperAccounts e confira se androiddeveloperconsole.googleapis.com está ativado no console do Google Cloud. |
404 Not Found |
NOT_FOUND |
O caminho do recurso DeveloperAccount, AndroidPackage ou AndroidPackageKey especificado não existe. |
Confirme os caminhos de recursos usando ListDeveloperAccounts, ListAndroidPackages ou ListAndroidPackageKeys. Verifique se os IDs de {key} usam hexadecimal em minúsculas sem dois-pontos. |
409 Conflict |
ALREADY_EXISTS |
O nome do pacote ou a impressão digital do certificado SHA-256 já está registrado nesta ou em outra conta de desenvolvedor. | Inspecione os registros atuais usando GetAndroidPackage ou GetAndroidPackageKey ou verifique o histórico de propriedade usando GetAndroidPackageRegistrationPolicy. |
429 Too Many Requests |
RESOURCE_EXHAUSTED |
A cota por método de 2,000 solicitações por dia por projeto do Google Cloud foi excedida. |
Implemente a espera exponencial com instabilidade e evite loops de sondagem de alta frequência. |
500 / 503 |
INTERNAL / UNAVAILABLE |
Erro temporário de back-end ou indisponibilidade temporária do serviço. | Tente novamente as solicitações idempotentes com espera exponencial truncada. |
Exemplos de solicitação e resposta HTTP
Substitua os valores de marcador, como ACCESS_TOKEN, 1234567890,
com.example.myapp e 60e860e8..., pelos seus próprios valores.
1. GetDeveloperAccount
curl -X GET \
-H "Authorization: Bearer ACCESS_TOKEN" \
"https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890"Resposta:
{
"name": "developerAccounts/1234567890",
"displayName": "Example Developer",
"verificationState": "VERIFIED"
}
2. ListDeveloperAccounts
curl -X GET \
-H "Authorization: Bearer ACCESS_TOKEN" \
"https://androiddeveloperconsole.googleapis.com/v1/developerAccounts"Resposta:
{
"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"Resposta:
{
"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"Resposta:
{
"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"Resposta:
{
"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"Resposta:
{
"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"Resposta:
{
"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"Resposta:
{
"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"Resposta:
{
"androidPackageKeys": [
{
"name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
"certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
"state": "REGISTERED"
}
],
"nextPageToken": ""
}
10. VerifyAndroidPackageKeyOwnership
Opção A: upload de mídia de solicitação única
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"Opção B: protocolo de upload retomável (recomendado para APKs grandes ou CI/CD)
Etapa 1: iniciar a sessão de upload retomável e extrair o cabeçalho X-Goog-Upload-URL retornado:
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"
}'Etapa 2: faça upload do binário do APK assinado para UPLOAD_SESSION_URI e finalize a
sessão:
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"Resposta:
{
"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"Resposta:
{
"name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
"certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
"state": "IN_REVIEW",
"registrationJustificationRequired": true
}
Outros recursos
- Registrar nomes de pacotes com a API Android Developer Console
- Verificar o status do registro do app com a API Android Developer ID Status
- Registrar-se no Android Developer Console
- Registrar no Google Play Console