Android Developer Console API adalah layanan RESTful yang memungkinkan developer terverifikasi mengotomatiskan alur kerja verifikasi developer Android di Konsol Developer Android, termasuk mengambil akun developer, memeriksa persyaratan kelayakan utama, mendaftarkan nama paket Android, mendaftarkan kunci penandatanganan aplikasi, dan memverifikasi kepemilikan kunci.
Ringkasan, kasus penggunaan, dan konteks penerapan
Kasus penggunaan dan fitur utama
- Pendaftaran nama paket CI/CD otomatis: Daftarkan puluhan atau ratusan
nama paket Android secara terprogram (
CreateAndroidPackage). - Pemeriksaan kebijakan kunci historis sebelum peluncuran: Memeriksa secara terprogram
apakah Google telah mengamati nama paket dalam ekosistem dan
apakah mendaftarkan sertifikat penandatanganan tertentu memerlukan verifikasi kepemilikan
kunci (
GetAndroidPackageRegistrationPolicy). - Pendaftaran kunci penandatanganan aplikasi dan verifikasi kepemilikan otomatis:
Daftarkan sidik jari SHA-256 sertifikat penandatanganan publik
(
CreateAndroidPackageKey), ambil token verifikasi unik (verificationToken), dan otomatiskan bukti kepemilikan kunci pribadi menggunakan upload APK bertanda tangan yang dapat dilanjutkan atau permintaan tunggal (VerifyAndroidPackageKeyOwnership). - Pengiriman justifikasi terprogram: Kirim justifikasi kepemilikan
(
JustifyAndroidPackageKeyRegistration). - Pemantauan status: Pantau status pendaftaran di seluruh akun developer, nama paket, dan kunci penandatanganan aplikasi (
GetDeveloperAccount,ListDeveloperAccounts,GetAndroidPackage,ListAndroidPackages,GetAndroidPackageKey,ListAndroidPackageKeys).
Alur kerja penerapan menyeluruh
- Verifikasi identitas developer sekali di UI: Selesaikan verifikasi identitas developer (
INDIVIDUALatauORGANIZATION) di Konsol Developer Android sehinggaverificationStateadalahVERIFIED. - Aktifkan API dan lakukan autentikasi: Aktifkan
androiddeveloperconsole.googleapis.comdi project Google Cloud Anda dan dapatkan token akses Bearer OAuth 2.0 yang didelegasikan pengguna dengan cakupanhttps://www.googleapis.com/auth/androiddeveloperconsole. - Temukan nama resource akun developer Anda: Panggil
GET /v1/developerAccounts(ListDeveloperAccounts) untuk mengambildeveloperAccounts/{developer_account}dan verifikasiverificationStateadalahVERIFIED. - Periksa kebijakan pendaftaran untuk nama paket: Panggil
GET /v1/developerAccounts/{id}/androidPackages/{pkg}/registrationPolicy(GetAndroidPackageRegistrationPolicy) untuk memeriksakeySelectionStrategy(SELECT_KEY_FROM_LISTatauUSE_ANY_KEY) dan kunci penandatanganan historis yang diketahui (knownKeys). - Membuat resource paket Android: Panggil
POST /v1/developerAccounts/{id}/androidPackages?androidPackageId={pkg}(CreateAndroidPackage) dengan isi{"name": ""}(membuat resource dalam statusDRAFT). - Daftarkan sidik jari kunci penandatanganan aplikasi Anda: Panggil
POST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys(CreateAndroidPackageKey) dengan isi JSON{"certificateFingerprintSha256": "..."}. Periksa status yang ditampilkan:DRAFT: Bukti kepemilikan kunci pribadi diperlukan, dan responsnya mencakupverificationTokenunik untuk Langkah 7.IN_REVIEW: Bukti kepemilikan dan justifikasi akan otomatis dilewati (misalnya, saat mendaftarkan nama paket baru yang belum pernah terlihat di Android, atau saat Anda telah memverifikasi kepemilikan kunci penandatanganan ini untuk nama paket lain diDeveloperAccountyang sama). Lewati Langkah 7 dan panggilan justifikasi di Langkah 8, lalu lanjutkan langsung ke pollingGetAndroidPackagedanGetAndroidPackageKey.
- Buat dan upload APK verifikasi (jika statusnya
DRAFT): Sematkan stringverificationTokenyang ditampilkan ke dalamassets/adi-registration.propertiesdi dalam APK minimal yang cocok denganpackageName, tanda tangani dengan kunci penandatanganan aplikasi pribadi Anda, lalu upload menggunakanPOST /upload/v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:verify(VerifyAndroidPackageKeyOwnership). - Kirimkan justifikasi (jika diperlukan) dan status pendaftaran polling: Jika
kunci berada dalam status
OWNERSHIP_VERIFIEDdanregistrationJustificationRequiredadalahtrue, panggilPOST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:justifyAndroidPackageKeyRegistration(JustifyAndroidPackageKeyRegistration). PollingGetAndroidPackagedanGetAndroidPackageKeyhinggastatemencapaiREGISTERED.
Perintah CLI lokal untuk menyiapkan sidik jari kunci dan APK verifikasi
Mengekstrak sidik jari sertifikat SHA-256 dari keystore (
keytool):keytool -list -v -keystore release-key.jks -alias my-key-aliasMemverifikasi ringkasan sertifikat penandatanganan SHA-256 pada APK yang di-build (
apksigner):apksigner verify --print-certs app-release.apkPeriksa nama paket APK dan file token tersemat sebelum mengupload (
aapt2danunzip):aapt2 dump badging app-release.apk | head -n 1 unzip -p app-release.apk assets/adi-registration.properties
Kemampuan UI dan API Konsol Developer Android
| Tugas | UI Web Konsol Developer Android (android.google.com/developerconsole) |
Android Developer Console API |
|---|---|---|
| Verifikasi identitas developer (KYC/KYB) dan pembayaran biaya | Didukung (memerlukan prasyarat satu kali) | Tidak didukung menggunakan API (pemeriksaan status hanya baca menggunakan GetDeveloperAccount dan ListDeveloperAccounts) |
| Melihat akun developer tertaut | Pengalih akun di header konsol | GET /v1/developerAccounts (ListDeveloperAccounts) |
| Memeriksa kunci penandatanganan dan kebijakan historis untuk nama paket | Ditampilkan selama wizard "Daftarkan nama paket" | GET /v1/.../registrationPolicy (GetAndroidPackageRegistrationPolicy) |
| Mendaftarkan nama paket Android baru | Nama paket > Daftarkan nama paket | POST /v1/{parent}/androidPackages?androidPackageId=... (CreateAndroidPackage) |
| Melihat atau mencantumkan nama paket terdaftar dan draf | Tabel dasbor Nama paket | GET /v1/{name} (GetAndroidPackage), GET /v1/{parent}/androidPackages (ListAndroidPackages) |
| Menambahkan kunci penandatanganan aplikasi dan membuat token verifikasi | Detail paket > Tambahkan kunci penandatanganan | POST /v1/{parent}/keys (CreateAndroidPackageKey) |
Membuktikan kepemilikan kunci pribadi (adi-registration.properties) |
Mengupload APK cuplikan yang ditandatangani di UI konsol | POST /upload/v1/{name}:verify (VerifyAndroidPackageKeyOwnership) |
| Mengirimkan justifikasi saat kunci memerlukan peninjauan manual | Perintah teks selama alur kerja pendaftaran kunci | POST /v1/{name}:justifyAndroidPackageKeyRegistration (JustifyAndroidPackageKeyRegistration) |
Konfigurasi dan autentikasi layanan
Semua permintaan API harus menggunakan HTTPS dan menyertakan header Authorization: Bearer
ACCESS_TOKEN yang diperoleh menggunakan alur Server Web OAuth 2.0 untuk Akun Google yang telah menyelesaikan verifikasi identitas developer di Konsol Developer Android.
| Properti | Nilai |
|---|---|
| Endpoint REST dasar | https://androiddeveloperconsole.googleapis.com |
| Endpoint upload media | https://androiddeveloperconsole.googleapis.com/upload |
| Versi API | v1 |
| Cakupan OAuth 2.0 yang diperlukan | https://www.googleapis.com/auth/androiddeveloperconsole |
| Batas kuota default | 2,000 permintaan per hari per project Google Cloud per metode |
Resource dan endpoint API
API Konsol Developer Android mengatur resource dalam hierarki berikut:
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})
Resource: DeveloperAccount
Mewakili akun di Konsol Developer Android yang terkait dengan identitas developer.
| Kolom | Jenis | Deskripsi |
|---|---|---|
name |
string |
ID. Nama resource dalam format developerAccounts/{developer_account}. |
displayName |
string |
Hanya output. Nama yang dapat dibaca manusia yang terkait dengan akun developer (nama individu atau nama organisasi). |
verificationState |
enum (VerificationState) |
Hanya output. Status verifikasi identitas developer saat ini untuk akun. |
Enum: DeveloperAccount.VerificationState
| Nilai | Deskripsi |
|---|---|
VERIFIED |
Verifikasi identitas developer selesai. Akun dapat mendaftarkan nama paket dan kunci penandatanganan aplikasi. |
NOT_VERIFIED |
Verifikasi identitas developer belum diselesaikan di Konsol Developer Android. |
Metode: DeveloperAccount
| Metode | Permintaan HTTP | Deskripsi |
|---|---|---|
GetDeveloperAccount |
GET /v1/{name=developerAccounts/*} |
Mengambil metadata dan status verifikasi untuk satu DeveloperAccount. |
ListDeveloperAccounts |
GET /v1/developerAccounts |
Mencantumkan semua objek DeveloperAccount yang dapat diakses oleh Akun Google yang diautentikasi (tidak diberi nomor halaman). |
Resource: AndroidPackage
Merepresentasikan nama paket Android yang terdaftar atau sedang didaftarkan di
DeveloperAccount.
| Kolom | Jenis | Deskripsi |
|---|---|---|
name |
string |
ID. Nama resource dalam format developerAccounts/{developer_account}/androidPackages/{android_package}, dengan {android_package} adalah nama paket Android (misalnya, com.example.myapp). |
packageName |
string |
Hanya output. Nama paket Android (misalnya, com.example.myapp). |
state |
enum (AndroidPackage.State) |
Hanya output. Status siklus proses pendaftaran nama paket saat ini. |
registeredAppStore |
boolean |
Hanya output. Menunjukkan apakah nama paket ini saat ini aktif sebagai app store terdaftar. |
Enum: AndroidPackage.State
| Nilai | Deskripsi |
|---|---|
DRAFT |
Resource nama paket telah dibuat, dan pendaftaran kunci penandatanganan aplikasi atau verifikasi kepemilikan masih dalam proses. |
IN_REVIEW |
Pendaftaran nama paket dan justifikasi kunci yang diperlukan telah dikirimkan dan sedang ditinjau oleh Google. Paket bertransisi dari DRAFT ke IN_REVIEW segera setelah CreateAndroidPackageKey (saat verifikasi kepemilikan kunci dilewati, termasuk saat kunci telah diverifikasi untuk nama paket lain di DeveloperAccount yang sama) atau setelah menyelesaikan VerifyAndroidPackageKeyOwnership dan, jika diperlukan, JustifyAndroidPackageKeyRegistration. |
REGISTERED |
Nama paket terdaftar secara aktif di akun developer ini untuk verifikasi developer Android. |
PENDING_TRANSFER |
Nama paket sedang menunggu penyelesaian transfer kepemilikan ke akun developer lain. |
Resource: AndroidPackageRegistrationPolicy
Resource singleton yang ditampilkan oleh
GetAndroidPackageRegistrationPolicy
yang menjelaskan kunci penandatanganan publik historis yang terdeteksi untuk nama paket dan
apakah mendaftarkan nama paket dengan kunci penandatanganan tertentu memerlukan justifikasi
tertulis.
| Kolom | Jenis | Deskripsi |
|---|---|---|
name |
string |
ID. Nama resource dalam format developerAccounts/{developer_account}/androidPackages/{android_package}/registrationPolicy. |
knownKeys[] |
object (KnownKey) |
Daftar kunci penandatanganan aplikasi historis yang sebelumnya diamati mendistribusikan aplikasi dengan nama paket ini, diurutkan secara leksikografis menurut certificateFingerprintSha256. |
knownKeys[].certificateFingerprintSha256 |
string |
Hanya output. Sidik jari SHA-256 heksadesimal huruf kecil 64 karakter yang dinormalisasi dari sertifikat penandatanganan historis (tanpa titik dua). |
knownKeys[].justificationRequirement |
enum (JustificationRequirement) |
Hanya output. Menunjukkan apakah pendaftaran kunci ini memerlukan panggilan JustifyAndroidPackageKeyRegistration (REQUIRED atau NOT_REQUIRED). Jika kunci penandatanganan sebelumnya telah diverifikasi pada nama paket lain di bawah DeveloperAccount yang sama, VerifyAndroidPackageKeyOwnership dan JustifyAndroidPackageKeyRegistration akan dilewati meskipun justificationRequirement adalah REQUIRED. |
keySelectionStrategy |
enum (KeySelectionStrategy) |
Hanya output. Kebijakan pemilihan kunci untuk mendaftarkan nama paket ini: SELECT_KEY_FROM_LIST (harus mendaftarkan kunci dari knownKeys) atau USE_ANY_KEY (kunci penandatanganan aplikasi yang valid dan dimiliki oleh developer dapat didaftarkan). |
Enum: KnownKey.JustificationRequirement
| Nilai | Deskripsi |
|---|---|
REQUIRED |
Untuk mendaftarkan kunci yang diketahui ini, Anda harus mengirimkan justifikasi tertulis menggunakan JustifyAndroidPackageKeyRegistration setelah menyelesaikan VerifyAndroidPackageKeyOwnership (kecuali jika kunci tersebut sebelumnya telah diverifikasi pada nama paket lain di bawah DeveloperAccount yang sama, sehingga VerifyAndroidPackageKeyOwnership dan JustifyAndroidPackageKeyRegistration akan dilewati). |
NOT_REQUIRED |
Mendaftarkan kunci yang diketahui ini tidak memerlukan justifikasi. Kunci akan langsung beralih ke IN_REVIEW setelah VerifyAndroidPackageKeyOwnership (atau langsung setelah CreateAndroidPackageKey jika kunci sebelumnya diverifikasi pada nama paket lain di DeveloperAccount yang sama). |
Enum: AndroidPackageRegistrationPolicy.KeySelectionStrategy
| Nilai | Deskripsi |
|---|---|
SELECT_KEY_FROM_LIST |
Pemanggil harus mendaftarkan salah satu kunci historis yang tercantum di knownKeys. |
USE_ANY_KEY |
Selain kunci apa pun di knownKeys, pemanggil dapat mendaftarkan kunci penandatanganan aplikasi yang valid dan belum pernah diamati sebelumnya di ekosistem Android. |
Metode: AndroidPackage
| Metode | Permintaan HTTP | Deskripsi |
|---|---|---|
GetAndroidPackageRegistrationPolicy |
GET /v1/{name=developerAccounts/*/androidPackages/*/registrationPolicy} |
Mengambil strategi pemilihan kunci dan kunci penandatanganan historis yang diketahui untuk nama paket. |
CreateAndroidPackage |
POST /v1/{parent=developerAccounts/*}/androidPackages?androidPackageId={package_name} |
Membuat resource AndroidPackage baru dalam status DRAFT untuk mulai mendaftarkan nama paket. |
GetAndroidPackage |
GET /v1/{name=developerAccounts/*/androidPackages/*} |
Mengambil detail dan status pendaftaran saat ini untuk AndroidPackage yang ada. |
ListAndroidPackages |
GET /v1/{parent=developerAccounts/*}/androidPackages |
Mencantumkan objek AndroidPackage di bawah DeveloperAccount (pageSize maks 1000, pageToken). |
Resource: AndroidPackageKey
Merepresentasikan sidik jari sertifikat penandatanganan aplikasi publik yang terkait dengan
AndroidPackage dan melacak status verifikasi kepemilikan dan peninjauan
pendaftaran.
| Kolom | Jenis | Deskripsi |
|---|---|---|
name |
string |
ID. Nama resource yang ditetapkan server dalam format developerAccounts/{developer_account}/androidPackages/{android_package}/keys/{key}, dengan {key} adalah sidik jari SHA-256 heksadesimal huruf kecil 64 karakter yang dinormalisasi tanpa titik dua. Harus dihilangkan atau kosong saat memanggil CreateAndroidPackageKey. |
certificateFingerprintSha256 |
string |
Wajib. Tidak dapat diubah. Hash SHA-256 dari sertifikat penandatanganan aplikasi. Pada input di CreateAndroidPackageKey, menerima hex 64 karakter biasa (60e860e8...) atau hex yang dipisahkan titik dua (60:E8:60:E8:...). Pada output, selalu dinormalisasi menjadi heksadesimal huruf kecil 64 karakter tanpa titik dua. |
state |
enum (AndroidPackageKey.State) |
Hanya output. Status siklus proses verifikasi dan pendaftaran kunci saat ini. |
verificationToken |
string |
Hanya output. Token verifikasi login unik yang dibuat oleh Google. Hanya digunakan saat statusnya adalah DRAFT (dapat diabaikan saat CreateAndroidPackageKey mentransisikan kunci langsung ke IN_REVIEW). Jika statusnya adalah DRAFT, sematkan string ini di dalam assets/adi-registration.properties di APK yang ditandatangani untuk menyelesaikan VerifyAndroidPackageKeyOwnership. |
registrationJustificationRequired |
boolean |
Hanya output. Jika true dan kunci berada dalam status OWNERSHIP_VERIFIED, Anda harus mengirimkan justifikasi tertulis menggunakan JustifyAndroidPackageKeyRegistration sebelum pendaftaran dilanjutkan ke IN_REVIEW. Jika CreateAndroidPackageKey mentransisikan kunci langsung ke IN_REVIEW (karena kunci sebelumnya telah diverifikasi pada nama paket lain di DeveloperAccount yang sama), justifikasi akan dilewati. |
Enum: AndroidPackageKey.State
| Nilai | Deskripsi |
|---|---|
DRAFT |
Resource kunci telah dibuat, dan bukti kepemilikan kunci pribadi menggunakan upload APK yang ditandatangani (VerifyAndroidPackageKeyOwnership) masih diperlukan karena kepemilikan kunci ini belum diverifikasi pada nama paket apa pun di DeveloperAccount ini. |
OWNERSHIP_VERIFIED |
Kepemilikan kunci pribadi telah diverifikasi menggunakan upload APK yang ditandatangani. Jika registrationJustificationRequired adalah true, justifikasi masih diperlukan sebelum peninjauan dimulai. |
IN_REVIEW |
Pendaftaran kunci sedang dalam peninjauan oleh Google. Kunci akan beralih ke sini, baik segera setelah CreateAndroidPackageKey jika bukti kepemilikan tidak diperlukan (misalnya, pada nama paket baru yang belum pernah terlihat di Android, atau jika kunci sebelumnya telah diverifikasi pada nama paket lain di bawah DeveloperAccount yang sama, yang juga melewati JustifyAndroidPackageKeyRegistration), langsung setelah VerifyAndroidPackageKeyOwnership (jika registrationJustificationRequired adalah false), atau setelah JustifyAndroidPackageKeyRegistration (jika registrationJustificationRequired adalah true). |
REGISTERED |
Kunci penandatanganan aplikasi terdaftar secara aktif ke nama paket ini untuk verifikasi developer Android. |
PENDING_TRANSFER |
Pendaftaran kunci penandatanganan aplikasi sedang menunggu penyelesaian transfer. |
Metode: AndroidPackageKey
| Metode | Permintaan HTTP | Deskripsi |
|---|---|---|
CreateAndroidPackageKey |
POST /v1/{parent=developerAccounts/*/androidPackages/*}/keys |
Mendaftarkan sidik jari SHA-256 sertifikat penandatanganan aplikasi baru di bagian AndroidPackage. Menampilkan kunci dalam status DRAFT (jika bukti kepemilikan menggunakan VerifyAndroidPackageKeyOwnership diperlukan) atau langsung dalam status IN_REVIEW (jika verifikasi kepemilikan dilewati, seperti untuk nama paket baru yang belum pernah terlihat di Android atau kunci yang sudah diverifikasi pada nama paket lain di DeveloperAccount yang sama). |
GetAndroidPackageKey |
GET /v1/{name=developerAccounts/*/androidPackages/*/keys/*} |
Mengambil status, sidik jari, dan metadata verifikasi AndroidPackageKey tertentu. |
ListAndroidPackageKeys |
GET /v1/{parent=developerAccounts/*/androidPackages/*}/keys |
Mencantumkan semua objek AndroidPackageKey yang terdaftar di bawah AndroidPackage (pageSize maks 1000, pageToken). |
VerifyAndroidPackageKeyOwnership |
POST /upload/v1/{name=developerAccounts/*/androidPackages/*/keys/*}:verify |
Mengupload APK minimal yang ditandatangani yang berisi verificationToken di assets/adi-registration.properties untuk memverifikasi kepemilikan kunci pribadi dan mengirimkan kunci yang siap ditinjau. |
JustifyAndroidPackageKeyRegistration |
POST /v1/{name=developerAccounts/*/androidPackages/*/keys/*}:justifyAndroidPackageKeyRegistration |
Mengirimkan konteks justifikasi tambahan saat registrationJustificationRequired adalah true dan mengirimkan kunci terverifikasi untuk ditinjau. |
Penanganan error
Jika permintaan API gagal, Konsol Developer Android API akan menampilkan kode status HTTP
4xx atau 5xx dan isi error JSON
google.rpc.Status standar:
{
"error": {
"code": 400,
"message": "Invalid certificate fingerprint SHA256 format.",
"status": "INVALID_ARGUMENT",
"details": []
}
}
Kode status HTTP dan penyelesaian umum
| Kode HTTP | Status gRPC | Penyebab umum | Resolusi |
|---|---|---|---|
400 Bad Request |
INVALID_ARGUMENT |
androidPackageId gaya Java tidak ada atau tidak valid; format certificateFingerprintSha256 tidak valid; kolom name tidak kosong di CreateAndroidPackage atau CreateAndroidPackageKey; APK yang diupload tidak ditandatangani, rusak, tidak memiliki assets/adi-registration.properties, tidak memiliki verificationToken yang cocok, atau ditandatangani dengan sertifikat yang tidak cocok. |
Validasi format permintaan terhadap skema resource, hapus atau kosongkan name pada panggilan pembuatan, dan verifikasi tanda tangan APK serta token tersemat menggunakan apksigner verify --print-certs dan unzip -p app-release.apk assets/adi-registration.properties sebelum mengupload. |
400 Bad Request |
FAILED_PRECONDITION |
DeveloperAccount memiliki verificationState: NOT_VERIFIED; pemilihan kunci melanggar AndroidPackageRegistrationPolicy (SELECT_KEY_FROM_LIST); memanggil VerifyAndroidPackageKeyOwnership atau JustifyAndroidPackageKeyRegistration dalam status tidak memenuhi syarat. |
Selesaikan verifikasi identitas developer di Konsol Developer Android, periksa GetAndroidPackageRegistrationPolicy terlebih dahulu, dan periksa state resource saat ini. |
401 Unauthorized |
UNAUTHENTICATED |
Token akses Bearer OAuth 2.0 tidak ada, tidak berlaku, atau tidak valid, atau upaya untuk melakukan autentikasi menggunakan kunci API atau akun layanan. | Dapatkan token akses Bearer OAuth 2.0 baru yang didelegasikan pengguna dengan cakupan https://www.googleapis.com/auth/androiddeveloperconsole. |
403 Forbidden |
PERMISSION_DENIED |
Pengguna yang diautentikasi tidak memiliki izin pada DeveloperAccount atau AndroidPackage target, atau Android Developer Console API tidak diaktifkan di project Google Cloud. |
Verifikasi keanggotaan akun menggunakan ListDeveloperAccounts dan pastikan androiddeveloperconsole.googleapis.com diaktifkan di Konsol Google Cloud. |
404 Not Found |
NOT_FOUND |
Jalur resource DeveloperAccount, AndroidPackage, atau AndroidPackageKey yang ditentukan tidak ada. |
Konfirmasi jalur resource menggunakan ListDeveloperAccounts, ListAndroidPackages, atau ListAndroidPackageKeys. Pastikan ID {key} menggunakan hex huruf kecil tanpa titik dua. |
409 Conflict |
ALREADY_EXISTS |
Nama paket atau sidik jari sertifikat SHA-256 sudah terdaftar di akun developer ini atau akun developer lain. | Periksa pendaftaran yang ada menggunakan GetAndroidPackage atau GetAndroidPackageKey, atau periksa kepemilikan historis menggunakan GetAndroidPackageRegistrationPolicy. |
429 Too Many Requests |
RESOURCE_EXHAUSTED |
Melampaui kuota per metode sebesar 2,000 permintaan per hari per project Google Cloud. |
Terapkan backoff eksponensial dengan jitter dan hindari loop polling frekuensi tinggi. |
500/503 |
INTERNAL/UNAVAILABLE |
Error backend sementara atau ketidaktersediaan layanan sementara. | Coba lagi permintaan idempoten dengan backoff eksponensial terpotong. |
Contoh permintaan dan respons HTTP
Ganti nilai placeholder seperti ACCESS_TOKEN, 1234567890,
com.example.myapp, dan 60e860e8... dengan nilai Anda sendiri.
1. GetDeveloperAccount
curl -X GET \
-H "Authorization: Bearer ACCESS_TOKEN" \
"https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890"Respons:
{
"name": "developerAccounts/1234567890",
"displayName": "Example Developer",
"verificationState": "VERIFIED"
}
2. ListDeveloperAccounts
curl -X GET \
-H "Authorization: Bearer ACCESS_TOKEN" \
"https://androiddeveloperconsole.googleapis.com/v1/developerAccounts"Respons:
{
"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"Respons:
{
"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"Respons:
{
"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"Respons:
{
"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"Respons:
{
"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"Respons:
{
"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"Respons:
{
"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"Respons:
{
"androidPackageKeys": [
{
"name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
"certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
"state": "REGISTERED"
}
],
"nextPageToken": ""
}
10. VerifyAndroidPackageKeyOwnership
Opsi A: Upload media permintaan tunggal
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"Opsi B: Protokol upload yang dapat dilanjutkan (direkomendasikan untuk APK besar atau CI/CD)
Langkah 1: Mulai sesi upload yang dapat dilanjutkan dan ekstrak header X-Goog-Upload-URL yang ditampilkan:
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"
}'Langkah 2: Upload biner APK yang ditandatangani ke UPLOAD_SESSION_URI dan selesaikan
sesi:
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"Respons:
{
"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"Respons:
{
"name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
"certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
"state": "IN_REVIEW",
"registrationJustificationRequired": true
}
Referensi lainnya
- Mendaftarkan nama paket dengan Android Developer Console API
- Memeriksa status pendaftaran aplikasi dengan Android Developer ID Status API
- Mendaftar di Konsol Developer Android
- Mendaftar di Konsol Google Play