Android Developer Console API, doğrulanmış geliştiricilerin Android Developer Console'da Android geliştirici doğrulama iş akışlarını otomatikleştirmesine olanak tanıyan bir RESTful hizmetidir. Bu iş akışları arasında geliştirici hesaplarını alma, temel uygunluk koşullarını kontrol etme, Android paket adlarını kaydetme, uygulama imzalama anahtarlarını kaydetme ve anahtar sahipliğini doğrulama yer alır.
Genel bakış, kullanım alanları ve uygulama bağlamı
Temel kullanım alanları ve özellikler
- Otomatik CI/CD paket adı kaydı: Onlarca veya yüzlerce Android paket adını programatik olarak kaydedin (
CreateAndroidPackage). - Ön uçuş geçmiş anahtar politikası denetimi: Google'ın daha önce ekosistemde bir paket adı görüp görmediğini ve belirli bir imzalama sertifikasının kaydedilmesi için anahtar sahipliği doğrulaması (
GetAndroidPackageRegistrationPolicy) gerekip gerekmediğini programatik olarak denetleyin. - Otomatik uygulama imzalama anahtarı kaydı ve sahiplik doğrulaması:
Ortak imzalama sertifikası SHA-256 parmak izlerini kaydedin
(
CreateAndroidPackageKey), benzersiz doğrulama sorgulama jetonlarını alın (verificationToken) ve tek istekli veya devam ettirilebilir imzalı APK yüklemelerini kullanarak özel anahtar sahipliği kanıtını otomatikleştirin (VerifyAndroidPackageKeyOwnership). - Programatik gerekçe gönderme: Sahiplik gerekçelerini gönderin
(
JustifyAndroidPackageKeyRegistration). - Durum izleme: Geliştirici hesapları, paket adları ve uygulama imzalama anahtarları (
GetDeveloperAccount,ListDeveloperAccounts,GetAndroidPackage,ListAndroidPackages,GetAndroidPackageKey,ListAndroidPackageKeys) genelinde kayıt durumunu izleyin.
Uçtan uca uygulama iş akışı
- Geliştirici kimliğini kullanıcı arayüzünde bir kez doğrulayın: Android Developer Console'da geliştirici kimlik doğrulamasını (
INDIVIDUALveyaORGANIZATION) tamamlayın. BöyleceverificationState,VERIFIEDolur. - API'yi etkinleştirme ve kimlik doğrulama: Google Cloud projenizde
androiddeveloperconsole.googleapis.comAPI'sini etkinleştirin vehttps://www.googleapis.com/auth/androiddeveloperconsolekapsamına sahip, kullanıcı tarafından yetkilendirilmiş bir OAuth 2.0 Bearer erişim jetonu alın. - Geliştirici hesabınızın kaynak adını öğrenme:
developerAccounts/{developer_account}değerini almak içinGET /v1/developerAccounts(ListDeveloperAccounts) yöntemini çağırın veverificationStatedeğerininVERIFIEDolduğunu doğrulayın. - Paket adı için kayıt politikasını kontrol edin:
keySelectionStrategy(SELECT_KEY_FROM_LISTveyaUSE_ANY_KEY) ve bilinen geçmiş imzalama anahtarlarını (knownKeys) incelemek içinGET /v1/developerAccounts/{id}/androidPackages/{pkg}/registrationPolicy(GetAndroidPackageRegistrationPolicy) yöntemini çağırın. - Android paketi kaynağını oluşturun:
{"name": ""}gövdesiylePOST /v1/developerAccounts/{id}/androidPackages?androidPackageId={pkg}(CreateAndroidPackage) yöntemini çağırın (DRAFTdurumunda kaynak oluşturur). - Uygulama imzalama anahtarı parmak izinizi kaydedin: JSON gövdesi
{"certificateFingerprintSha256": "..."}ilePOST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys(CreateAndroidPackageKey) çağrısı yapın. Döndürülen durumu inceleyin:DRAFT: Özel anahtar sahipliğinin kanıtlanması gerekir ve yanıt, 7. adım için benzersiz birverificationTokeniçerir.IN_REVIEW: Sahiplik kanıtı ve gerekçe otomatik olarak atlanır (ör. Android'de daha önce hiç görülmemiş yeni bir paket adı kaydederken veya aynıDeveloperAccountiçin başka bir paket adında bu imzalama anahtarının sahipliğini zaten doğruladıysanız). 7. adımı ve 8. adımdaki gerekçe çağrısını atlayıp doğrudanGetAndroidPackageveGetAndroidPackageKeyiçin yoklama yapmaya geçin.
- Doğrulama APK'sını oluşturun ve yükleyin (durum
DRAFTise): DöndürülenverificationTokendizesinipackageNameile eşleşen minimum APK içindekiassets/adi-registration.propertiesöğesine yerleştirin, özel uygulama imzalama anahtarınızla imzalayın vePOST /upload/v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:verify(VerifyAndroidPackageKeyOwnership) kullanarak yükleyin. - Gerekçe gönderin (gerekirse) ve kayıt durumunu sorgulayın: Anahtar
OWNERSHIP_VERIFIEDdurumundaysa veregistrationJustificationRequired,trueisePOST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:justifyAndroidPackageKeyRegistration(JustifyAndroidPackageKeyRegistration) yöntemini çağırın.state,REGISTEREDdeğerine ulaşana kadarGetAndroidPackageveGetAndroidPackageKeyyöntemlerini sorgulayın.
Anahtar parmak izlerini ve doğrulama APK'larını hazırlamak için yerel CLI komutları
Anahtar deposundan (
keytool) SHA-256 sertifika parmak izini ayıklama:keytool -list -v -keystore release-key.jks -alias my-key-aliasDerlenmiş bir APK'da (
apksigner) SHA-256 imzalama sertifikası özetini doğrulama:apksigner verify --print-certs app-release.apkYüklemeden önce APK paket adını ve yerleşik jeton dosyasını inceleyin (
aapt2veunzip):aapt2 dump badging app-release.apk | head -n 1 unzip -p app-release.apk assets/adi-registration.properties
Android Developer Console kullanıcı arayüzü ve API özellikleri
| Görev | Android Developer Console Web Kullanıcı Arayüzü (android.google.com/developerconsole) |
Android Developer Console API |
|---|---|---|
| Geliştirici kimlik doğrulaması (KYC/KYB) ve ücret ödemesi | Desteklenir (tek seferlik ön koşul gereklidir) | API kullanılarak desteklenmez (GetDeveloperAccount ve ListDeveloperAccounts kullanılarak salt okunur durum kontrolü) |
| Bağlı geliştirici hesaplarını görüntüleme | Konsol başlığında hesap değiştirici | GET /v1/developerAccounts (ListDeveloperAccounts) |
| Bir paket adının geçmiş imzalama anahtarlarını ve politikasını inceleme | "Paket adını kaydet" sihirbazı sırasında gösterilir | GET /v1/.../registrationPolicy (GetAndroidPackageRegistrationPolicy) |
| Yeni bir Android paket adı kaydetme | Paket adları > Paket adını kaydet | POST /v1/{parent}/androidPackages?androidPackageId=... (CreateAndroidPackage) |
| Kayıtlı ve taslak paket adlarını görüntüleme veya listeleme | Paket adları kontrol paneli tablosu | GET /v1/{name} (GetAndroidPackage), GET /v1/{parent}/androidPackages (ListAndroidPackages) |
| Uygulama imzalama anahtarı ekleme ve sorgulama jetonu oluşturma | Paket ayrıntıları > İmzalama anahtarı ekle | POST /v1/{parent}/keys (CreateAndroidPackageKey) |
Özel anahtar sahipliğini kanıtlama (adi-registration.properties) |
İmzalı snippet APK'sını Console kullanıcı arayüzüne yükleme | POST /upload/v1/{name}:verify (VerifyAndroidPackageKeyOwnership) |
| Anahtar için manuel inceleme gerektiğinde gerekçe gönderme | Anahtar kaydı iş akışı sırasında yazılı istem | POST /v1/{name}:justifyAndroidPackageKeyRegistration (JustifyAndroidPackageKeyRegistration) |
Hizmet yapılandırması ve kimlik doğrulama
Tüm API istekleri HTTPS kullanmalı ve Android Developer Console'da geliştirici kimlik doğrulamasını tamamlamış bir Google Hesabı için OAuth 2.0 web sunucusu akışı kullanılarak alınmış bir Authorization: Bearer
ACCESS_TOKEN üstbilgisi içermelidir.
| Özellik | Değer |
|---|---|
| Temel REST uç noktası | https://androiddeveloperconsole.googleapis.com |
| Medya yükleme uç noktası | https://androiddeveloperconsole.googleapis.com/upload |
| API sürümü | v1 |
| Gerekli OAuth 2.0 kapsamı | https://www.googleapis.com/auth/androiddeveloperconsole |
| Varsayılan kota sınırı | Yöntem başına her Google Cloud projesinde günde 2,000 istek |
API kaynakları ve uç noktaları
Android Developer Console API, kaynakları aşağıdaki hiyerarşide düzenler:
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})
Kaynak: DeveloperAccount
Android Developer Console'da bir geliştirici kimliğiyle ilişkili hesabı temsil eder.
| Alan | Tür | Açıklama |
|---|---|---|
name |
string |
Tanımlayıcı. developerAccounts/{developer_account} biçimindeki kaynak adı. |
displayName |
string |
Yalnızca çıkış. Geliştirici hesabıyla ilişkili, okunabilir ad (bireysel ad veya kuruluş adı). |
verificationState |
enum (VerificationState) |
Yalnızca çıkış. Hesabın mevcut geliştirici kimliği doğrulama durumu. |
Enum: DeveloperAccount.VerificationState
| Değer | Açıklama |
|---|---|
VERIFIED |
Geliştirici kimlik doğrulaması tamamlandı. Hesap, paket adlarını ve uygulama imzalama anahtarlarını kaydedebilir. |
NOT_VERIFIED |
Android Developer Console'da geliştirici kimliği doğrulama işlemi tamamlanmamıştır. |
Yöntemler: DeveloperAccount
| Yöntem | HTTP isteği | Açıklama |
|---|---|---|
GetDeveloperAccount |
GET /v1/{name=developerAccounts/*} |
Tek bir DeveloperAccount için meta verileri ve doğrulama durumunu alır. |
ListDeveloperAccounts |
GET /v1/developerAccounts |
Kimliği doğrulanmış Google Hesabı'nın erişebileceği tüm DeveloperAccount nesnelerini listeler (sayfalandırılmamış). |
Kaynak: AndroidPackage
DeveloperAccount altında kayıtlı veya kaydedilmekte olan bir Android paket adını temsil eder.
| Alan | Tür | Açıklama |
|---|---|---|
name |
string |
Tanımlayıcı. developerAccounts/{developer_account}/androidPackages/{android_package} biçimindeki kaynak adı. Burada {android_package}, Android paket adıdır (ör. com.example.myapp). |
packageName |
string |
Yalnızca çıkış. Android paket adı (ör. com.example.myapp). |
state |
enum (AndroidPackage.State) |
Yalnızca çıkış. Paket adının mevcut kayıt yaşam döngüsü durumu. |
registeredAppStore |
boolean |
Yalnızca çıkış. Bu paket adının şu anda kayıtlı bir uygulama mağazası olarak etkin olup olmadığını gösterir. |
Enum: AndroidPackage.State
| Değer | Açıklama |
|---|---|
DRAFT |
Paket adı kaynağı oluşturuldu ve uygulama imzalama anahtarı kaydı veya sahiplik doğrulaması hâlâ devam ediyor. |
IN_REVIEW |
Paket adı kaydı ve gerekli anahtar gerekçesi gönderildi ve Google tarafından inceleniyor. Bir paket, CreateAndroidPackageKey işleminden hemen sonra (anahtar sahipliği doğrulamasının atlandığı durumlarda, anahtarın aynı DeveloperAccount içindeki başka bir paket adı için zaten doğrulanmış olduğu durumlar dahil) veya VerifyAndroidPackageKeyOwnership ve gerekirse JustifyAndroidPackageKeyRegistration işlemlerini tamamladıktan sonra DRAFT durumundan IN_REVIEW durumuna geçer. |
REGISTERED |
Paket adı, Android geliştirici doğrulama için bu geliştirici hesabına etkin bir şekilde kayıtlıdır. |
PENDING_TRANSFER |
Paket adı, başka bir geliştirici hesabına sahiplik aktarımının tamamlanmasını bekliyor. |
Kaynak: AndroidPackageRegistrationPolicy
GetAndroidPackageRegistrationPolicy tarafından döndürülen tekil kaynak. Bu kaynak, bir paket adı için algılanan geçmişe ait herkese açık imzalama anahtarlarını ve paket adını belirli bir imzalama anahtarıyla kaydetmek için yazılı bir gerekçe gerekip gerekmediğini açıklar.
| Alan | Tür | Açıklama |
|---|---|---|
name |
string |
Tanımlayıcı. developerAccounts/{developer_account}/androidPackages/{android_package}/registrationPolicy biçimindeki kaynak adı. |
knownKeys[] |
object (KnownKey) |
Daha önce bu paket adıyla uygulama dağıttığı gözlemlenen eski uygulama imzalama anahtarlarının certificateFingerprintSha256 değerine göre alfabetik olarak sıralanmış listesi. |
knownKeys[].certificateFingerprintSha256 |
string |
Yalnızca çıkış. Geçmiş imzalama sertifikasının normalleştirilmiş 64 karakterlik küçük harfli onaltılık SHA-256 parmak izi (iki nokta üst üste olmadan). |
knownKeys[].justificationRequirement |
enum (JustificationRequirement) |
Yalnızca çıkış. Bu anahtarı kaydetmek için JustifyAndroidPackageKeyRegistration (REQUIRED veya NOT_REQUIRED) çağrısının yapılması gerekip gerekmediğini gösterir. İmzalama anahtarı daha önce aynı DeveloperAccount altındaki başka bir paket adında doğrulandıysa justificationRequirement, REQUIRED olsa bile hem VerifyAndroidPackageKeyOwnership hem de JustifyAndroidPackageKeyRegistration atlanır. |
keySelectionStrategy |
enum (KeySelectionStrategy) |
Yalnızca çıkış. Bu paket adını kaydetmek için anahtar seçim politikası: SELECT_KEY_FROM_LIST (knownKeys adresinden bir anahtar kaydedilmelidir) veya USE_ANY_KEY (geliştiriciye ait geçerli herhangi bir uygulama imzalama anahtarı kaydedilebilir). |
Enum: KnownKey.JustificationRequirement
| Değer | Açıklama |
|---|---|
REQUIRED |
Bu bilinen anahtarı kaydetmek için VerifyAndroidPackageKeyOwnership işlemini tamamladıktan sonra JustifyAndroidPackageKeyRegistration kullanarak yazılı bir gerekçe göndermeniz gerekir (Anahtar daha önce aynı DeveloperAccount altındaki başka bir paket adında doğrulanmışsa hem VerifyAndroidPackageKeyOwnership hem de JustifyAndroidPackageKeyRegistration atlanır). |
NOT_REQUIRED |
Bu bilinen anahtarı kaydetmek için gerekçe sunmanız gerekmez. Anahtar, VerifyAndroidPackageKeyOwnership tarihinden sonra (veya anahtar daha önce aynı DeveloperAccount altındaki başka bir paket adında doğrulandıysa CreateAndroidPackageKey tarihinden hemen sonra) doğrudan IN_REVIEW durumuna geçer. |
Enum: AndroidPackageRegistrationPolicy.KeySelectionStrategy
| Değer | Açıklama |
|---|---|
SELECT_KEY_FROM_LIST |
Arayanın, knownKeys içinde listelenen geçmiş anahtarlardan birini kaydetmesi gerekir. |
USE_ANY_KEY |
Arayan, knownKeys içindeki anahtarlara ek olarak, Android ekosisteminde daha önce görülmemiş geçerli herhangi bir uygulama imzalama anahtarını kaydedebilir. |
Yöntemler: AndroidPackage
| Yöntem | HTTP isteği | Açıklama |
|---|---|---|
GetAndroidPackageRegistrationPolicy |
GET /v1/{name=developerAccounts/*/androidPackages/*/registrationPolicy} |
Bir paket adı için anahtar seçim stratejisini ve bilinen geçmiş imzalama anahtarlarını alır. |
CreateAndroidPackage |
POST /v1/{parent=developerAccounts/*}/androidPackages?androidPackageId={package_name} |
Paket adı kaydetmeye başlamak için DRAFT durumunda yeni bir AndroidPackage kaynağı oluşturur. |
GetAndroidPackage |
GET /v1/{name=developerAccounts/*/androidPackages/*} |
Mevcut bir AndroidPackage ile ilgili ayrıntıları ve mevcut kayıt durumunu alır. |
ListAndroidPackages |
GET /v1/{parent=developerAccounts/*}/androidPackages |
DeveloperAccount altındaki AndroidPackage nesneleri listeler (pageSize maks. 1000, pageToken). |
Kaynak: AndroidPackageKey
Bir AndroidPackage ile ilişkili herkese açık uygulama imzalama sertifikası parmak izini temsil eder ve sahiplik doğrulama ile kayıt inceleme durumunu takip eder.
| Alan | Tür | Açıklama |
|---|---|---|
name |
string |
Tanımlayıcı. developerAccounts/{developer_account}/androidPackages/{android_package}/keys/{key} biçiminde sunucu tarafından atanan kaynak adı. Burada {key}, iki nokta üst üste işareti içermeyen, normalleştirilmiş 64 karakterlik küçük harfli onaltılık SHA-256 parmak izidir. CreateAndroidPackageKey çağrılırken atlanmalı veya boş bırakılmalıdır. |
certificateFingerprintSha256 |
string |
Zorunlu. Değiştirilemez. Uygulama imzalama sertifikasının SHA-256 karma değeri. CreateAndroidPackageKey alanına giriş yaparken düz 64 karakterlik onaltılık (60e860e8...) veya iki nokta ile ayrılmış onaltılık (60:E8:60:E8:...) biçimini kabul eder. Çıkışta her zaman iki nokta işareti olmadan 64 karakterlik küçük harfli onaltılık biçime normalleştirilir. |
state |
enum (AndroidPackageKey.State) |
Yalnızca çıkış. Anahtarın mevcut doğrulama ve kayıt yaşam döngüsü durumu. |
verificationToken |
string |
Yalnızca çıkış. Google tarafından oluşturulan benzersiz sorgulama jetonu. Yalnızca durum DRAFT olduğunda kullanılır (CreateAndroidPackageKey, anahtarı doğrudan IN_REVIEW durumuna geçirdiğinde yoksayılabilir). Durum DRAFT olduğunda, VerifyAndroidPackageKeyOwnership işlemini tamamlamak için bu dizeyi imzalı bir APK'daki assets/adi-registration.properties içine yerleştirin. |
registrationJustificationRequired |
boolean |
Yalnızca çıkış. true ise ve anahtar OWNERSHIP_VERIFIED durumundaysa kaydın IN_REVIEW durumuna geçmesi için JustifyAndroidPackageKeyRegistration kullanarak yazılı bir gerekçe göndermeniz gerekir. CreateAndroidPackageKey, anahtarı doğrudan IN_REVIEW durumuna geçirirse (anahtar daha önce aynı DeveloperAccount içindeki başka bir paket adında doğrulandığı için) gerekçe atlanır. |
Enum: AndroidPackageKey.State
| Değer | Açıklama |
|---|---|
DRAFT |
Anahtar kaynağı oluşturuldu. Bu anahtarın sahipliği bu DeveloperAccount altındaki herhangi bir paket adında henüz doğrulanmadığı için imzalı APK yüklemesi (VerifyAndroidPackageKeyOwnership) kullanılarak özel anahtarın sahipliğinin kanıtlanması hâlâ gereklidir. |
OWNERSHIP_VERIFIED |
Özel anahtar sahipliği, imzalı bir APK yüklemesi kullanılarak doğrulandı. registrationJustificationRequired, true ise inceleme başlamadan önce gerekçe belirtilmesi gerekir. |
IN_REVIEW |
Anahtar kaydı Google tarafından inceleniyor. Sahiplik kanıtı gerekmediğinde (ör. Android'de daha önce hiç görülmemiş yeni bir paket adında veya anahtar daha önce aynı DeveloperAccount altındaki başka bir paket adında doğrulandığında, bu durumda JustifyAndroidPackageKeyRegistration da atlanır) CreateAndroidPackageKey işleminden hemen sonra, VerifyAndroidPackageKeyOwnership işleminden hemen sonra (registrationJustificationRequired, false ise) veya JustifyAndroidPackageKeyRegistration işleminden sonra (registrationJustificationRequired, true ise) bir anahtar bu duruma geçer. |
REGISTERED |
Uygulama imzalama anahtarı, Android geliştirici doğrulama için bu paket adına etkin bir şekilde kayıtlıdır. |
PENDING_TRANSFER |
Uygulama imzalama anahtarı kaydı, bir aktarımın tamamlanmasını bekliyor. |
Yöntemler: AndroidPackageKey
| Yöntem | HTTP isteği | Açıklama |
|---|---|---|
CreateAndroidPackageKey |
POST /v1/{parent=developerAccounts/*/androidPackages/*}/keys |
AndroidPackage altında yeni bir uygulama imzalama sertifikası SHA-256 parmak izi kaydeder. Anahtarı DRAFT durumunda (VerifyAndroidPackageKeyOwnership kullanılarak sahiplik kanıtı gerektiğinde) veya doğrudan IN_REVIEW durumunda (sahiplik doğrulaması atlandığında, örneğin Android'de daha önce hiç görülmemiş yeni bir paket adı veya aynı DeveloperAccount içindeki başka bir paket adında zaten doğrulanmış bir anahtar için) döndürür. |
GetAndroidPackageKey |
GET /v1/{name=developerAccounts/*/androidPackages/*/keys/*} |
Belirli bir AndroidPackageKey için durum, parmak izi ve doğrulama meta verilerini alır. |
ListAndroidPackageKeys |
GET /v1/{parent=developerAccounts/*/androidPackages/*}/keys |
Bir AndroidPackage altında kayıtlı tüm AndroidPackageKey nesnelerini listeler (pageSize maks. 1000, pageToken). |
VerifyAndroidPackageKeyOwnership |
POST /upload/v1/{name=developerAccounts/*/androidPackages/*/keys/*}:verify |
Özel anahtar sahipliğini doğrulamak ve hazır anahtarları incelemeye göndermek için assets/adi-registration.properties içinde verificationToken içeren imzalı bir minimum APK yükler. |
JustifyAndroidPackageKeyRegistration |
POST /v1/{name=developerAccounts/*/androidPackages/*/keys/*}:justifyAndroidPackageKeyRegistration |
registrationJustificationRequired, true olduğunda ek gerekçe bağlamı gönderir ve doğrulanmış anahtarları incelemeye gönderir. |
Hata işleme
Bir API isteği başarısız olduğunda Android Developer Console API, bir HTTP 4xx veya 5xx durum kodu ve standart bir google.rpc.Status JSON hata gövdesi döndürür:
{
"error": {
"code": 400,
"message": "Invalid certificate fingerprint SHA256 format.",
"status": "INVALID_ARGUMENT",
"details": []
}
}
HTTP durum kodları ve yaygın çözümler
| HTTP kodu | gRPC durumu | Genel nedenler | Çözünürlük |
|---|---|---|---|
400 Bad Request |
INVALID_ARGUMENT |
Java stili androidPackageId eksik veya geçersiz; certificateFingerprintSha256 biçimi geçersiz; CreateAndroidPackage veya CreateAndroidPackageKey üzerinde name alanı boş değil; yüklenen APK imzalanmamış, bozuk, assets/adi-registration.properties eksik, eşleşen verificationToken eksik veya eşleşmeyen bir sertifikayla imzalanmış. |
İstek biçimlerini kaynak şemalarına göre doğrulayın, oluşturma çağrılarında name değerini atlayın veya boş bırakın ve yüklemeden önce apksigner verify --print-certs ile unzip -p app-release.apk assets/adi-registration.properties kullanarak APK imzanızı ve yerleşik jetonunuzu doğrulayın. |
400 Bad Request |
FAILED_PRECONDITION |
DeveloperAccount, verificationState: NOT_VERIFIED değerine sahip; anahtar seçimi AndroidPackageRegistrationPolicy (SELECT_KEY_FROM_LIST) kuralını ihlal ediyor; uygun olmayan bir durumda VerifyAndroidPackageKeyOwnership veya JustifyAndroidPackageKeyRegistration çağrılıyor. |
Android Developer Console'da geliştirici kimlik doğrulamasını tamamlayın, önce GetAndroidPackageRegistrationPolicy değerini kontrol edin ve kaynağın mevcut state değerini inceleyin. |
401 Unauthorized |
UNAUTHENTICATED |
OAuth 2.0 Bearer erişim jetonu eksik, geçersiz veya süresi dolmuş ya da bir API anahtarı veya hizmet hesabı kullanılarak kimlik doğrulama denenmiş. | https://www.googleapis.com/auth/androiddeveloperconsole kapsamına sahip, kullanıcı tarafından yetkilendirilmiş yeni bir OAuth 2.0 Bearer erişim jetonu alın. |
403 Forbidden |
PERMISSION_DENIED |
Kimliği doğrulanmış kullanıcının hedef DeveloperAccount veya AndroidPackage üzerinde izni yok ya da Google Cloud projesinde Android Developer Console API etkinleştirilmemiş. |
ListDeveloperAccounts kullanarak hesap üyeliğini doğrulayın ve Google Cloud Console'da androiddeveloperconsole.googleapis.com hizmetinin etkinleştirildiğinden emin olun. |
404 Not Found |
NOT_FOUND |
Belirtilen DeveloperAccount, AndroidPackage veya AndroidPackageKey kaynak yolu mevcut değil. |
ListDeveloperAccounts, ListAndroidPackages veya ListAndroidPackageKeys kullanarak kaynak yollarını onaylayın. {key} kimliklerinin iki nokta üst üste olmadan küçük harfli onaltılık değerler kullandığından emin olun. |
409 Conflict |
ALREADY_EXISTS |
Paket adı veya SHA-256 sertifika parmak izi bu geliştirici hesabına ya da başka bir geliştirici hesabına zaten kayıtlı. | GetAndroidPackage veya GetAndroidPackageKey kullanarak mevcut kayıtları inceleyin ya da GetAndroidPackageRegistrationPolicy kullanarak geçmiş sahipliği kontrol edin. |
429 Too Many Requests |
RESOURCE_EXHAUSTED |
Google Cloud projesi başına günlük 2,000 istek olan yöntem başına kota aşıldı. |
Dalgalanma ile eksponansiyel geri yükleme uygulayın ve yüksek frekanslı yoklama döngülerinden kaçının. |
500/503 |
INTERNAL/UNAVAILABLE |
Geçici arka uç hatası veya hizmetin geçici olarak kullanılamaması. | Idempotent istekleri, kesilmiş eksponansiyel geri yükleme ile yeniden deneyin. |
HTTP isteği ve yanıtı örnekleri
ACCESS_TOKEN, 1234567890, com.example.myapp ve 60e860e8... gibi yer tutucu değerleri kendi değerlerinizle değiştirin.
1. GetDeveloperAccount
curl -X GET \
-H "Authorization: Bearer ACCESS_TOKEN" \
"https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890"Yanıt:
{
"name": "developerAccounts/1234567890",
"displayName": "Example Developer",
"verificationState": "VERIFIED"
}
2. ListDeveloperAccounts
curl -X GET \
-H "Authorization: Bearer ACCESS_TOKEN" \
"https://androiddeveloperconsole.googleapis.com/v1/developerAccounts"Yanıt:
{
"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"Yanıt:
{
"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"Yanıt:
{
"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"Yanıt:
{
"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"Yanıt:
{
"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"Yanıt:
{
"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"Yanıt:
{
"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"Yanıt:
{
"androidPackageKeys": [
{
"name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
"certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
"state": "REGISTERED"
}
],
"nextPageToken": ""
}
10. VerifyAndroidPackageKeyOwnership
A seçeneği: Tek istekli medya yükleme
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 seçeneği: Devam ettirilebilir yükleme protokolü (büyük APK'lar veya CI/CD için önerilir)
1. adım: Devam ettirilebilir yükleme oturumunu başlatın ve döndürülen X-Goog-Upload-URL üstbilgisini ayıklayın:
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. adım: İmzalı APK ikili programını UPLOAD_SESSION_URI adresine yükleyin ve oturumu tamamlayın:
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"Yanıt:
{
"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"Yanıt:
{
"name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
"certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
"state": "IN_REVIEW",
"registrationJustificationRequired": true
}
Ek kaynaklar
- Android Developer Console API ile paket adlarını kaydetme
- Android Developer ID Status API ile uygulama kayıt durumunu kontrol etme
- Android Developer Console'a kaydolma
- Google Play Console'da kaydolma