Android Developer Console API

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ışı

  1. Geliştirici kimliğini kullanıcı arayüzünde bir kez doğrulayın: Android Developer Console'da geliştirici kimlik doğrulamasını (INDIVIDUAL veya ORGANIZATION) tamamlayın. Böylece verificationState, VERIFIED olur.
  2. API'yi etkinleştirme ve kimlik doğrulama: Google Cloud projenizde androiddeveloperconsole.googleapis.com API'sini etkinleştirin ve https://www.googleapis.com/auth/androiddeveloperconsole kapsamına sahip, kullanıcı tarafından yetkilendirilmiş bir OAuth 2.0 Bearer erişim jetonu alın.
  3. Geliştirici hesabınızın kaynak adını öğrenme: developerAccounts/{developer_account} değerini almak için GET /v1/developerAccounts (ListDeveloperAccounts) yöntemini çağırın ve verificationState değerinin VERIFIED olduğunu doğrulayın.
  4. Paket adı için kayıt politikasını kontrol edin: keySelectionStrategy (SELECT_KEY_FROM_LIST veya USE_ANY_KEY) ve bilinen geçmiş imzalama anahtarlarını (knownKeys) incelemek için GET /v1/developerAccounts/{id}/androidPackages/{pkg}/registrationPolicy (GetAndroidPackageRegistrationPolicy) yöntemini çağırın.
  5. Android paketi kaynağını oluşturun: {"name": ""} gövdesiyle POST /v1/developerAccounts/{id}/androidPackages?androidPackageId={pkg} (CreateAndroidPackage) yöntemini çağırın (DRAFT durumunda kaynak oluşturur).
  6. Uygulama imzalama anahtarı parmak izinizi kaydedin: JSON gövdesi {"certificateFingerprintSha256": "..."} ile POST /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 bir verificationToken iç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ı DeveloperAccount iç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ğrudan GetAndroidPackage ve GetAndroidPackageKey için yoklama yapmaya geçin.
  7. Doğrulama APK'sını oluşturun ve yükleyin (durum DRAFT ise): Döndürülen verificationToken dizesini packageName ile eşleşen minimum APK içindeki assets/adi-registration.properties öğesine yerleştirin, özel uygulama imzalama anahtarınızla imzalayın ve POST /upload/v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:verify (VerifyAndroidPackageKeyOwnership) kullanarak yükleyin.
  8. Gerekçe gönderin (gerekirse) ve kayıt durumunu sorgulayın: Anahtar OWNERSHIP_VERIFIED durumundaysa ve registrationJustificationRequired, true ise POST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:justifyAndroidPackageKeyRegistration (JustifyAndroidPackageKeyRegistration) yöntemini çağırın. state, REGISTERED değerine ulaşana kadar GetAndroidPackage ve GetAndroidPackageKey yö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-alias
  • Derlenmiş bir APK'da (apksigner) SHA-256 imzalama sertifikası özetini doğrulama:

    apksigner verify --print-certs app-release.apk
  • Yüklemeden önce APK paket adını ve yerleşik jeton dosyasını inceleyin (aapt2 ve unzip):

    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