Android Developer Console API は、確認済みのデベロッパーが Android Developer Console で Android デベロッパーの確認 ワークフローを自動化できるようにする RESTful サービスです。これには、デベロッパー アカウントの取得、主要な資格要件の確認、Android パッケージ名の登録、アプリ署名鍵の登録、鍵の所有権の確認などが含まれます。
概要、ユースケース、実装コンテキスト
主なユースケースと機能
- 自動化された CI/CD パッケージ名の登録: 数十または数百の Android パッケージ名をプログラムで登録します(
CreateAndroidPackage)。 - 過去の鍵ポリシーの事前検査: Google がエコシステムでパッケージ名を以前に確認したかどうか、特定の署名証明書の登録に鍵の所有権の確認(
GetAndroidPackageRegistrationPolicy)が必要かどうかをプログラムで検査します。 - アプリ署名鍵の自動登録と所有権の確認:
公開署名証明書の SHA-256 フィンガープリントを登録し(
CreateAndroidPackageKey)、一意の確認チャレンジ トークンを取得して(verificationToken)、単一リクエストまたは再開可能な署名付き APK のアップロードを使用して秘密鍵の所有証明を自動化します(VerifyAndroidPackageKeyOwnership)。 - プログラムによる理由の送信: 所有権の理由(
JustifyAndroidPackageKeyRegistration)を送信します。 - ステータスのモニタリング: デベロッパー アカウント、パッケージ名、アプリ署名鍵(
GetDeveloperAccount、ListDeveloperAccounts、GetAndroidPackage、ListAndroidPackages、GetAndroidPackageKey、ListAndroidPackageKeys)全体で登録ステータスをモニタリングします。
エンドツーエンドの実装ワークフロー
- UI でデベロッパーの身元確認を 1 回行う: Android Developer Console でデベロッパーの身元確認(
INDIVIDUALまたはORGANIZATION)を完了し、verificationStateがVERIFIEDになるようにします。 - API を有効にして認証する: Google Cloud プロジェクトで
androiddeveloperconsole.googleapis.comを有効にし、スコープhttps://www.googleapis.com/auth/androiddeveloperconsoleを持つユーザー委任 OAuth 2.0 Bearer アクセス トークンを取得します。 - デベロッパー アカウントのリソース名を確認する:
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 パッケージ リソースを作成する: 本文
{"name": ""}を指定してPOST /v1/developerAccounts/{id}/androidPackages?androidPackageId={pkg}(CreateAndroidPackage)を呼び出します(DRAFT状態でリソースが作成されます)。 - アプリ署名鍵のフィンガープリントを登録する: JSON 本文
{"certificateFingerprintSha256": "..."}を指定してPOST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys(CreateAndroidPackageKey)を呼び出します。返された状態を調べます。DRAFT: 秘密鍵の所有権の証明が必要です。レスポンスには、ステップ 7 の一意のverificationTokenが含まれます。IN_REVIEW: 所有権の証明と正当性の証明は自動的にスキップされます(たとえば、Android でこれまでに確認されたことがない新しいパッケージ名を登録する場合や、同じDeveloperAccount内の別のパッケージ名に対してこの署名鍵の所有権をすでに確認している場合)。ステップ 7 とステップ 8 の正当性の証明の呼び出しをスキップし、GetAndroidPackageとGetAndroidPackageKeyのポーリングに直接進みます。
- 確認用 APK をビルドしてアップロードする(状態が
DRAFTの場合): 返されたverificationToken文字列を、packageNameに一致する最小限の APK 内のassets/adi-registration.propertiesに埋め込み、秘密のアプリ署名鍵で署名して、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)を呼び出します。stateがREGISTEREDに達するまで、GetAndroidPackageとGetAndroidPackageKeyをポーリングします。
鍵フィンガープリントと検証用 APK を準備するためのローカル CLI コマンド
キーストア(
keytool)から SHA-256 証明書のフィンガープリントを抽出する:keytool -list -v -keystore release-key.jks -alias my-key-aliasビルドされた APK(
apksigner)で SHA-256 署名証明書ダイジェストを確認する: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
Android Developer Console の UI と API の機能
| タスク | Android Developer Console のウェブ UI(android.google.com/developerconsole) |
Android Developer Console API |
|---|---|---|
| デベロッパーの本人確認(KYC/KYB)と手数料の支払い | サポート対象(1 回限りの前提条件が必要) | 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) |
コンソール UI で署名済みスニペット APK をアップロードする | POST /upload/v1/{name}:verify(VerifyAndroidPackageKeyOwnership) |
| 鍵の手動審査が必要な場合に理由を送信する | キー登録ワークフロー中のテキスト プロンプト | POST /v1/{name}:justifyAndroidPackageKeyRegistration(JustifyAndroidPackageKeyRegistration) |
サービス構成と認証
すべての API リクエストは HTTPS を使用し、Android Developer Console でデベロッパーの本人確認を完了した Google アカウントの OAuth 2.0 ウェブサーバー フローを使用して取得した Authorization: Bearer
ACCESS_TOKEN ヘッダーを含める必要があります。
| プロパティ | 値 |
|---|---|
| ベース REST エンドポイント | https://androiddeveloperconsole.googleapis.com |
| メディア アップロード エンドポイント | https://androiddeveloperconsole.googleapis.com/upload |
| API のバージョン | v1 |
| 必要な OAuth 2.0 スコープ | https://www.googleapis.com/auth/androiddeveloperconsole |
| デフォルトの割り当て上限 | Google Cloud プロジェクトごと、メソッドごとの 1 日あたりの 2,000 リクエスト数 |
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
デベロッパー ID に関連付けられた Android Developer Console のアカウントを表します。
| フィールド | タイプ | 説明 |
|---|---|---|
name |
string |
ID。リソース名(developerAccounts/{developer_account} 形式)。 |
displayName |
string |
出力専用。デベロッパー アカウントに関連付けられた、人が読める形式の名前(個人名または組織名)。 |
verificationState |
enum (VerificationState) |
出力専用。アカウントの現在のデベロッパー身元確認ステータス。 |
列挙型: DeveloperAccount.VerificationState
| 値 | 説明 |
|---|---|
VERIFIED |
デベロッパーの身元確認が完了しました。このアカウントは、パッケージ名とアプリ署名鍵を登録できます。 |
NOT_VERIFIED |
Android Developer Console でデベロッパーの身元確認が完了していない。 |
メソッド: DeveloperAccount
| メソッド | HTTP リクエスト | 説明 |
|---|---|---|
GetDeveloperAccount |
GET /v1/{name=developerAccounts/*} |
1 つの DeveloperAccount のメタデータと確認状態を取得します。 |
ListDeveloperAccounts |
GET /v1/developerAccounts |
認証済みの Google アカウントからアクセス可能なすべての DeveloperAccount オブジェクトを一覧表示します(ページ分けなし)。 |
リソース: AndroidPackage
DeveloperAccount に登録されている、または登録中の Android パッケージ名を表します。
| フィールド | タイプ | 説明 |
|---|---|---|
name |
string |
ID。リソース名。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 による審査中です。パッケージは、CreateAndroidPackageKey の直後(鍵の所有権の確認がスキップされた場合。同じ DeveloperAccount 内の別のパッケージ名で鍵がすでに確認されている場合など)または VerifyAndroidPackageKeyOwnership と JustifyAndroidPackageKeyRegistration(必要な場合)の完了後に、DRAFT から IN_REVIEW に移行します。 |
REGISTERED |
パッケージ名が、Android デベロッパーの確認のためにこのデベロッパー アカウントに登録されている。 |
PENDING_TRANSFER |
パッケージ名は、別のデベロッパー アカウントへの所有権の譲渡が完了するのを待機しています。 |
リソース: AndroidPackageRegistrationPolicy
GetAndroidPackageRegistrationPolicy によって返されるシングルトン リソース。パッケージ名で検出された過去の公開署名鍵と、指定された署名鍵でパッケージ名を登録する際に書面による理由が必要かどうかを示します。
| フィールド | タイプ | 説明 |
|---|---|---|
name |
string |
ID。リソース名(developerAccounts/{developer_account}/androidPackages/{android_package}/registrationPolicy 形式)。 |
knownKeys[] |
object (KnownKey) |
このパッケージ名でアプリを配布していることが以前に確認された、過去のアプリ署名鍵のリスト。certificateFingerprintSha256 の辞書順に並べ替えられています。 |
knownKeys[].certificateFingerprintSha256 |
string |
出力専用。以前の署名証明書の正規化された 64 文字の小文字の 16 進数 SHA-256 フィンガープリント(コロンなし)。 |
knownKeys[].justificationRequirement |
enum (JustificationRequirement) |
出力専用。この鍵の登録に JustifyAndroidPackageKeyRegistration(REQUIRED または NOT_REQUIRED)の呼び出しが必要かどうかを示します。署名鍵が同じ DeveloperAccount の別のパッケージ名ですでに確認されている場合、justificationRequirement が REQUIRED であっても、VerifyAndroidPackageKeyOwnership と JustifyAndroidPackageKeyRegistration の両方がスキップされます。 |
keySelectionStrategy |
enum (KeySelectionStrategy) |
出力専用。このパッケージ名を登録するための鍵選択ポリシー: SELECT_KEY_FROM_LIST(knownKeys の鍵を登録する必要があります)または USE_ANY_KEY(デベロッパーが所有する有効なアプリ署名鍵を登録できます)。 |
列挙型: KnownKey.JustificationRequirement
| 値 | 説明 |
|---|---|
REQUIRED |
この既知の鍵を登録するには、VerifyAndroidPackageKeyOwnership を完了した後に JustifyAndroidPackageKeyRegistration を使用して書面による正当な理由を提出する必要があります(ただし、同じ DeveloperAccount の別のパッケージ名で鍵がすでに確認されている場合は、VerifyAndroidPackageKeyOwnership と JustifyAndroidPackageKeyRegistration の両方がスキップされます)。 |
NOT_REQUIRED |
この既知の鍵を登録する際に、理由を説明する必要はありません。鍵は、VerifyAndroidPackageKeyOwnership の後に直接 IN_REVIEW に移行します(同じ DeveloperAccount の別のパッケージ名で以前に鍵が検証されていた場合は、CreateAndroidPackageKey の直後に移行します)。 |
列挙型: 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} |
DRAFT 状態の新しい AndroidPackage リソースを作成して、パッケージ名の登録を開始します。 |
GetAndroidPackage |
GET /v1/{name=developerAccounts/*/androidPackages/*} |
既存の AndroidPackage の詳細と現在の登録状態を取得します。 |
ListAndroidPackages |
GET /v1/{parent=developerAccounts/*}/androidPackages |
DeveloperAccount の AndroidPackage オブジェクトを一覧表示します(pageSize 最大 1000、pageToken)。 |
リソース: AndroidPackageKey
AndroidPackage に関連付けられた公開アプリ署名証明書のフィンガープリントを表し、所有権の確認と登録審査の状態を追跡します。
| フィールド | タイプ | 説明 |
|---|---|---|
name |
string |
ID。サーバー割り当てのリソース名。developerAccounts/{developer_account}/androidPackages/{android_package}/keys/{key} 形式。ここで、{key} は、コロンなしの正規化された 64 文字の小文字の 16 進数 SHA-256 フィンガープリントです。CreateAndroidPackageKey を呼び出す場合は、省略するか空にする必要があります。 |
certificateFingerprintSha256 |
string |
必須。変更不可。アプリ署名証明書の SHA-256 ハッシュ。CreateAndroidPackageKey の入力では、プレーンな 64 文字の 16 進数(60e860e8...)またはコロン区切りの 16 進数(60:E8:60:E8:...)のいずれかを受け入れます。出力では、常にコロンなしの 64 文字の小文字の 16 進数に正規化されます。 |
state |
enum (AndroidPackageKey.State) |
出力専用。鍵の現在の検証と登録のライフサイクル状態。 |
verificationToken |
string |
出力専用。Google が生成した一意のチャレンジ トークン。状態が DRAFT の場合にのみ使用されます(CreateAndroidPackageKey が鍵を IN_REVIEW に直接移行する場合は無視できます)。状態が DRAFT の場合、この文字列を署名付き APK の assets/adi-registration.properties に埋め込んで VerifyAndroidPackageKeyOwnership を完了します。 |
registrationJustificationRequired |
boolean |
出力専用。true で、鍵が OWNERSHIP_VERIFIED 状態の場合、登録が IN_REVIEW に進む前に、JustifyAndroidPackageKeyRegistration を使用して書面による正当な理由を提出する必要があります。CreateAndroidPackageKey が鍵を IN_REVIEW に直接移行する場合(鍵が同じ DeveloperAccount の別のパッケージ名で以前に検証されているため)、正当化はスキップされます。 |
列挙型: AndroidPackageKey.State
| 値 | 説明 |
|---|---|
DRAFT |
鍵リソースは作成されましたが、この鍵の所有権は、この DeveloperAccount のどのパッケージ名でもまだ確認されていないため、署名付き APK のアップロード(VerifyAndroidPackageKeyOwnership)による秘密鍵の所有証明が引き続き必要です。 |
OWNERSHIP_VERIFIED |
秘密鍵の所有権は、署名済み APK のアップロードを使用して確認されています。registrationJustificationRequired が true の場合でも、審査を開始する前に理由が必要です。 |
IN_REVIEW |
キーの登録は Google による審査中です。鍵がこの状態に移行するのは、所有権の証明が不要な場合は CreateAndroidPackageKey の直後(たとえば、Android で一度も使用されたことのない新規のパッケージ名の場合や、同じ DeveloperAccount の別のパッケージ名で鍵が以前に確認されている場合。この場合は JustifyAndroidPackageKeyRegistration もスキップされます)、registrationJustificationRequired が false の場合は VerifyAndroidPackageKeyOwnership の直後、registrationJustificationRequired が true の場合は JustifyAndroidPackageKeyRegistration の後です。 |
REGISTERED |
アプリ署名鍵は、Android デベロッパーの確認のためにこのパッケージ名に登録されています。 |
PENDING_TRANSFER |
アプリ署名鍵の登録は、移管の完了を待機しています。 |
メソッド: AndroidPackageKey
| メソッド | HTTP リクエスト | 説明 |
|---|---|---|
CreateAndroidPackageKey |
POST /v1/{parent=developerAccounts/*/androidPackages/*}/keys |
AndroidPackage に新しいアプリ署名証明書の SHA-256 フィンガープリントを登録します。DRAFT 状態(VerifyAndroidPackageKeyOwnership を使用した所有権の証明が必要な場合)または直接 IN_REVIEW 状態(所有権の確認がスキップされる場合。たとえば、Android で一度も使用されたことのない新規のパッケージ名や、同じ DeveloperAccount 内の別のパッケージ名ですでに確認済みの鍵の場合)の鍵を返します。 |
GetAndroidPackageKey |
GET /v1/{name=developerAccounts/*/androidPackages/*/keys/*} |
特定の AndroidPackageKey のステータス、フィンガープリント、検証メタデータを取得します。 |
ListAndroidPackageKeys |
GET /v1/{parent=developerAccounts/*/androidPackages/*}/keys |
AndroidPackage に登録されているすべての AndroidPackageKey オブジェクトを一覧表示します(pageSize 最大 1000、pageToken)。 |
VerifyAndroidPackageKeyOwnership |
POST /upload/v1/{name=developerAccounts/*/androidPackages/*/keys/*}:verify |
assets/adi-registration.properties に verificationToken を含む署名済みの最小 APK をアップロードして、秘密鍵の所有権を確認し、準備ができた鍵を審査に送信します。 |
JustifyAndroidPackageKeyRegistration |
POST /v1/{name=developerAccounts/*/androidPackages/*/keys/*}:justifyAndroidPackageKeyRegistration |
registrationJustificationRequired が true の場合、追加の理由コンテキストを送信し、検証済みのキーを審査のために送信します。 |
エラー処理
API リクエストが失敗すると、Android Developer Console API は HTTP 4xx または 5xx ステータス コードと、標準の google.rpc.Status JSON エラー本文を返します。
{
"error": {
"code": 400,
"message": "Invalid certificate fingerprint SHA256 format.",
"status": "INVALID_ARGUMENT",
"details": []
}
}
HTTP ステータス コードと一般的な解決策
| HTTP コード | gRPC ステータス | 一般的な原因 | 解決策 |
|---|---|---|---|
400 Bad Request |
INVALID_ARGUMENT |
Java スタイルの androidPackageId がないか無効、certificateFingerprintSha256 の形式が無効、CreateAndroidPackage または CreateAndroidPackageKey の name フィールドが空でない、アップロードされた APK が署名されていない、破損している、assets/adi-registration.properties がない、一致する verificationToken がない、または一致しない証明書で署名されている。 |
リソース スキーマに照らしてリクエスト形式を検証し、作成呼び出しで name を省略または空にし、アップロード前に apksigner verify --print-certs と unzip -p app-release.apk assets/adi-registration.properties を使用して APK 署名と埋め込みトークンを検証します。 |
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 キーまたはサービス アカウントを使用して認証しようとしています。 | スコープ https://www.googleapis.com/auth/androiddeveloperconsole を指定して、ユーザー委任された新しい OAuth 2.0 Bearer アクセス トークンを取得します。 |
403 Forbidden |
PERMISSION_DENIED |
認証されたユーザーに、ターゲットの DeveloperAccount または AndroidPackage に対する権限がないか、Google Cloud プロジェクトで Android Developer Console API が有効になっていません。 |
ListDeveloperAccounts を使用してアカウント メンバーシップを確認し、Google Cloud コンソールで androiddeveloperconsole.googleapis.com が有効になっていることを確認します。 |
404 Not Found |
NOT_FOUND |
指定された DeveloperAccount、AndroidPackage、または AndroidPackageKey リソースパスが存在しません。 |
ListDeveloperAccounts、ListAndroidPackages、または ListAndroidPackageKeys を使用してリソースパスを確認します。{key} ID には、コロンなしの小文字の 16 進数を使用してください。 |
409 Conflict |
ALREADY_EXISTS |
パッケージ名または SHA-256 証明書フィンガープリントが、このデベロッパー アカウントまたは別のデベロッパー アカウントですでに登録されています。 | GetAndroidPackage または GetAndroidPackageKey を使用して既存の登録を検査するか、GetAndroidPackageRegistrationPolicy を使用して過去の所有権を確認します。 |
429 Too Many Requests |
RESOURCE_EXHAUSTED |
Google Cloud プロジェクトごとに 1 日あたり 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
オプション A: 単一リクエストのメディア アップロード
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"オプション B: 再開可能なアップロード プロトコル(サイズの大きい 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 デベロッパー ID Status API でアプリの登録ステータスを確認する
- Android Developer Console に登録する
- Google Play Console に登録する