Use a API Android Developer Status para verificar se o nome do pacote de um app Android está registrado em um desenvolvedor verificado. Se você cria ferramentas de desenvolvimento de software, IDEs ou fluxos de trabalho automatizados de CI/CD, pode integrar essa API de servidor para servidor para fazer o seguinte:
- Verificar se o nome do pacote de um app está registrado em um desenvolvedor verificado
- Validar se a impressão digital SHA-256 do certificado de assinatura de um app corresponde às credenciais registradas para o nome do pacote
- Solicitar que os desenvolvedores na interface da sua ferramenta registrem apps não reconhecidos no programa de verificação de desenvolvedor Android
Essa API foi projetada para oferecer suporte a vários fluxos de trabalho de desenvolvedores:
| Caso de uso | Descrição | endpoint de API |
|---|---|---|
| Qualificação do nome do pacote | Verificar se um nome de pacote já foi registrado. Retorna REGISTERED se o nome do pacote estiver vinculado a um desenvolvedor verificado ou NOT_REGISTERED. |
CheckPackageRegistrationStatus |
| O app foi registrado | Verificar se um nome de pacote e um par de impressão digital de certificado específicos estão registrados. Retorna REGISTERED se o nome do pacote e o par de impressão digital do certificado estiverem registrados, NOT_REGISTERED se o nome do pacote e o par de impressão digital do certificado não estiverem registrados ou REGISTERED_WITH_ANOTHER_CERTIFICATE_FINGERPRINT se o nome do pacote estiver registrado com uma impressão digital de certificado diferente. |
CheckPackageRegistrationStatus |
Este guia explica como concluir as seguintes tarefas:
- Configurar o acesso e a autenticação da API Google Cloud.
- Verificar se o nome do pacote e o par de impressão digital do certificado público SHA-256 de um app foram registrados no programa de verificação de desenvolvedor Android por um desenvolvedor verificado, com a impressão digital do certificado público SHA-256 fornecida ou uma impressão digital diferente.
- Processar estados de registro de API no fluxo de trabalho da sua ferramenta de desenvolvimento ou IDE.
Pré-requisitos
Este documento é destinado a desenvolvedores de apps Android ou de ferramentas de desenvolvimento de software. Antes de começar, você precisa ter:
- Acesso administrativo a um projeto do Google Cloud.
- Noções básicas sobre APIs RESTful, JSON e impressões digitais de certificado SHA-256.
Você também precisa conhecer estes termos:
| Termo | Definição |
|---|---|
| Verificação de desenvolvedor Android | A verificação de desenvolvedor Android é um novo requisito projetado para vincular entidades reais (pessoas e organizações) aos apps Android. O Android vai exigir que todos os apps sejam registrados por desenvolvedores verificados para que possam ser instalados pelos usuários em dispositivos Android certificados. |
| Impressão digital do certificado | O hash SHA-256 do certificado público usado para assinar o app. |
| Estado de registro | O status retornado pela API para o nome do pacote de um app ou o nome do pacote e o par de impressão digital do certificado público SHA-256 de um app. Esse estado determina a ação que você precisa realizar (por exemplo, REGISTERED, NOT_REGISTERED). |
Endpoint de serviço
Um endpoint de serviço é um URL de base que especifica o endereço de rede de um serviço de API. Esse serviço tem o endpoint a seguir e todos os URIs são relativos a ele:
https://androiddeveloperidstatus.googleapis.com
Ativar a API
Para usar a API Android Developer ID Status, conclua as etapas de configuração para criar um projeto e ativar a API.
Criar um projeto do Google Cloud
- Crie uma conta do Google Cloud se você não tiver uma.
- Abra o Console do Google Cloud.
- Crie um projeto do Google Cloud.
Ativar a API no seu projeto
- No Console do Google Cloud, acesse APIs e serviços > Biblioteca.
- Selecione seu projeto no menu suspenso.
- Pesquise API Android Developer ID Status.
- Clique em Ativar.
Autenticar
A API oferece suporte a credenciais de chave de API. Para gerar uma chave de API:
- No Console do Google Cloud, acesse APIs e serviços > Credenciais.
- Clique em + Criar credenciais e selecione Chave de API.
- Configure a chave e copie-a. Use essa chave nos cabeçalhos de solicitação.
Verificar o status de registro do app
Você pode consultar o recurso PackageRegistrationStatus para verificar apenas um nome de pacote ou um nome de pacote pareado com uma impressão digital do certificado específica.
Verificar um nome de pacote
Para verificar se o nome do pacote de um app está registrado em um desenvolvedor verificado, faça uma solicitação GET autenticada que contenha o nome do pacote do app Android (por exemplo, com.example.app) para o endpoint packageRegistrationStatus:check sem parâmetros opcionais:
Solicitação:
curl -X GET "https://androiddeveloperidstatus.googleapis.com/v1/packages/com.example.app/packageRegistrationStatus:check" \
-H "X-Goog-Api-Key: [key]"
Resultados
Resposta (registrado):
Se o nome do pacote estiver registrado, você vai receber o seguinte corpo de resposta HTTP com o código de resposta HTTP 200:
{
"name": "packages/com.example.app/packageRegistrationStatus",
"state": "REGISTERED"
}
Ação recomendada: se você estiver realizando essa verificação em nome de outro desenvolvedor, informe que o nome do pacote está registrado.
Resposta (não registrado):
Se o nome do pacote não estiver registrado, você vai receber o seguinte corpo de resposta HTTP com o código de resposta HTTP 200:
{
"name": "packages/com.example.app/packageRegistrationStatus",
"state": "NOT_REGISTERED"
}
Ação recomendada: se você estiver realizando essa verificação em nome de outro desenvolvedor, informe que o nome do pacote não está registrado.
Exemplo do Java
Este exemplo do Java chama a API sem parâmetros de consulta para verificar se o nome do pacote está registrado.
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class CheckPackageNameClient {
private static final String API_ENDPOINT = "https://androiddeveloperidstatus.googleapis.com";
public static void main(String[] args) {
String apiKey = "YOUR_API_KEY";
String packageName = "com.example.app";
try {
String response = checkPackageRegistrationStatus(apiKey, packageName);
System.out.println("Response: " + response);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
/**
* Checks the registration status of an Android package.
*/
public static String checkPackageRegistrationStatus(String apiKey, String packageName)
throws IOException, InterruptedException {
String fullUrl = String.format("%s/v1/packages/%s/packageRegistrationStatus:check", API_ENDPOINT, packageName);
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(fullUrl))
.header("Accept", "application/json")
.header("X-Goog-Api-Key", apiKey)
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() != 200) {
throw new IOException("Unexpected response code: " + response.statusCode() + ", body: " + response.body());
}
return response.body();
}
}
Verificar pares de nome de pacote e impressão digital do certificado
Para verificar se o nome do pacote de um app está registrado com uma impressão digital de certificado público SHA-256 específica, transmita o parâmetro de consulta certificateFingerprint:
Solicitação:
curl -X GET "https://androiddeveloperidstatus.googleapis.com/v1/packages/com.example.app/packageRegistrationStatus:check?certificateFingerprint=d6ac89ed1d0a805aad4b087d06d5f41645b814480b133fbc867ef7498d069e06" \
-H "X-Goog-Api-Key: [key]"
Resultados
Resposta (registrado com impressão digital de certificado correspondente):
Se o nome do pacote estiver registrado com a impressão digital do certificado público SHA-256 fornecida, você vai receber o seguinte corpo de resposta HTTP com o código de resposta HTTP 200:
{
"name": "packages/com.example.app/packageRegistrationStatus",
"state": "REGISTERED"
}
Ação recomendada: se você estiver realizando essa verificação em nome de outro desenvolvedor, informe que o nome do pacote está registrado com a impressão digital do certificado fornecida.
Resposta (registrado com impressão digital de certificado diferente):
Se o nome do pacote estiver registrado com uma impressão digital de certificado SHA-256 diferente da fornecida, você vai receber o seguinte corpo de resposta HTTP com o código de resposta HTTP 200:
{
"name": "packages/com.example.app/packageRegistrationStatus",
"state": "REGISTERED_WITH_ANOTHER_CERTIFICATE_FINGERPRINT"
}
Ação recomendada: se você estiver realizando essa verificação em nome de outro desenvolvedor, informe que o nome do pacote está registrado, mas com uma impressão digital do certificado diferente da fornecida.
Resposta (não registrado):
Se o nome do pacote não estiver registrado com a impressão digital do certificado público SHA-256 fornecida, você vai receber o seguinte corpo de resposta HTTP com o código de resposta HTTP 200:
{
"name": "packages/com.example.app/packageRegistrationStatus",
"state": "NOT_REGISTERED"
}
Ação recomendada: se você estiver realizando essa verificação em nome de outro desenvolvedor, informe que o nome do pacote não está registrado com a impressão digital do certificado fornecida.
Exemplo do Java
Este exemplo do Java inclui explicitamente a certificateFingerprint como um parâmetro de consulta codificado por URL para verificar um pacote e um pareamento de impressão digital específicos.
import java.io.IOException;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
public class CheckPackageAndFingerprintClient {
private static final String API_ENDPOINT = "https://androiddeveloperidstatus.googleapis.com";
public static void main(String[] args) {
String apiKey = "YOUR_API_KEY";
String packageName = "com.example.app";
String certificateFingerprint = "d6ac89ed1d0a805aad4b087d06d5f41645b814480b133fbc867ef7498d069e06";
try {
String response = checkPackageAndFingerprintRegistrationStatus(apiKey, packageName, certificateFingerprint);
System.out.println("Response: " + response);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
/**
* Checks the registration status of a specific Android package and certificate fingerprint pair.
*/
public static String checkPackageAndFingerprintRegistrationStatus(
String apiKey, String packageName, String certificateFingerprint)
throws IOException, InterruptedException {
String path = String.format("/v1/packages/%s/packageRegistrationStatus:check", packageName);
String encodedFingerprint = URLEncoder.encode(certificateFingerprint, StandardCharsets.UTF_8);
String fullUrl = API_ENDPOINT + path + "?certificateFingerprint=" + encodedFingerprint;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(fullUrl))
.header("Accept", "application/json")
.header("X-Goog-Api-Key", apiKey)
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() != 200) {
throw new IOException("Unexpected response code: " + response.statusCode() + ", body: " + response.body());
}
return response.body();
}
}
Entender os estados de registro e o tratamento de erros
Quando uma solicitação de API falha, a API Android Developer ID Status retorna um objeto de erro JSON padrão do Google Cloud no corpo da resposta. Esse objeto fornece uma estrutura consistente para entender e processar o erro.
Exemplo de resposta de erro:
{
"error": {
"code": 400,
"message": "Request contains an invalid argument.",
"status": "INVALID_ARGUMENT"
}
}
O objeto de erro contém os seguintes campos de chave:
code: o código de status HTTP (por exemplo,400,403,500).message: uma descrição do erro em inglês para desenvolvedores. Essa mensagem não é estável e pode mudar. Portanto, não crie uma lógica de análise com base nela.status: um código de erro canônico que identifica programaticamente o tipo de erro (por exemplo,INVALID_ARGUMENT,PERMISSION_DENIED). A lógica de tratamento de erros precisa ser criada com base nesse identificador estável.
A tabela a seguir lista os erros mais comuns retornados pela API e o curso de ação recomendado.
| Status HTTP | Código de erro canônico (status) |
Significado e causa comum | Ação recomendada | Pode ser repetido? |
|---|---|---|---|---|
400 Solicitação inválida |
INVALID_ARGUMENT |
A solicitação estava malformada. | Não tente novamente. Inspecione o campo de detalhes na resposta de erro para identificar a violação de campo específica. Corrija o payload da solicitação e envie-o novamente. | Não |
401 Não autorizado |
UNAUTHENTICATED |
O token de acesso está ausente, expirado ou inválido. | Não tente novamente imediatamente. Verifique se você está usando o token ou a chave de acesso corretos. | Não |
403 Proibido |
PERMISSION_DENIED |
Você está autenticado, mas seu projeto não tem permissão para acessar a API. A causa mais comum é que você não ativou a API no seu projeto do Google Cloud. | Não tente novamente. Verifique se você está usando o ID do projeto correto e se a API está ativada. | Não |
429 Muitas solicitações |
RESOURCE_EXHAUSTED |
Você excedeu a cota da API para seu projeto. | Pare de enviar solicitações e tente novamente após um atraso. Verifique as cotas do seu projeto no Console do Google Cloud. | Sim |
500 Erro interno do servidor |
INTERNAL |
Ocorreu um erro inesperado nos servidores do Google. | É provável que seja um problema temporário. Tente novamente a solicitação usando uma estratégia de espera exponencial. Se o erro persistir, entre em contato com o suporte. | Sim |
503 Serviço não disponível |
UNAVAILABLE |
O serviço está temporariamente indisponível. | Tente novamente a solicitação usando uma estratégia de espera exponencial. | Sim |
Limites de cotas
As cotas de uso são aplicadas por projeto para garantir a confiabilidade do serviço.
| Método de API | Limite padrão (por projeto) | Observações |
|---|---|---|
CheckPackageRegistrationStatus |
1.000 solicitações por dia | Os autores da chamada precisam gerenciar a limitação de taxa interna para evitar abusos. |
Monitorar seu uso
É possível monitorar o uso atual da API do seu projeto e verificar a proximidade dos limites de cota diretamente no Console do Google Cloud.
- Acesse a página APIs e serviços > Painel.
- Selecione a API Android Developer ID Status.
- Clique na guia Cotas.
Esse painel fornece um detalhamento detalhado do volume de solicitações ao longo do tempo.