Android Developer Console API

Android Developer Console API एक RESTful सेवा है. इसकी मदद से, पुष्टि किए गए डेवलपर, Android Developer Console में Android डेवलपर की पहचान की पुष्टि करने के वर्कफ़्लो को ऑटोमेट कर सकते हैं. इसमें डेवलपर खाते वापस पाना, कुंजी से जुड़ी ज़रूरी शर्तों की जांच करना, Android पैकेज के नाम रजिस्टर करना, ऐप्लिकेशन साइनिंग पासकोड रजिस्टर करना, और कुंजी के मालिकाना हक की पुष्टि करना शामिल है.

खास जानकारी, इस्तेमाल के उदाहरण, और लागू करने का तरीका

इस्तेमाल के मुख्य उदाहरण और सुविधाएं

  • सीआई/सीडी पैकेज के नाम अपने-आप रजिस्टर होने की सुविधा: प्रोग्राम के हिसाब से, Android पैकेज के दर्जनों या सैकड़ों नाम रजिस्टर करें (CreateAndroidPackage).
  • ऐप्लिकेशन पब्लिश करने से पहले, पासकोड की नीति के इतिहास की जांच: प्रोग्राम के हिसाब से जांच करना कि क्या Google ने पहले कभी पैकेज के नाम को इकोसिस्टम में देखा है. साथ ही, यह जांच करना कि क्या किसी खास साइनिंग सर्टिफ़िकेट को रजिस्टर करने के लिए, पासकोड के मालिकाना हक की पुष्टि (GetAndroidPackageRegistrationPolicy) करना ज़रूरी है.
  • ऐप्लिकेशन साइनिंग पासकोड का रजिस्ट्रेशन और मालिकाना हक की पुष्टि अपने-आप होने की सुविधा: सार्वजनिक साइनिंग सर्टिफ़िकेट के SHA-256 फ़िंगरप्रिंट रजिस्टर करें (CreateAndroidPackageKey), पुष्टि करने के लिए यूनीक चैलेंज टोकन पाएं (verificationToken), और निजी पासकोड के मालिकाना हक के सबूत की पुष्टि अपने-आप होने की सुविधा चालू करें. इसके लिए, एक बार में या फिर से शुरू किए जा सकने वाले साइन किए गए APK अपलोड करें (VerifyAndroidPackageKeyOwnership).
  • प्रोग्राम के तहत, मालिकाना हक की पुष्टि करने के लिए दस्तावेज़ सबमिट करना: मालिकाना हक की पुष्टि करने के लिए दस्तावेज़ सबमिट करें (JustifyAndroidPackageKeyRegistration).
  • स्टेटस मॉनिटर करना: डेवलपर खातों, पैकेज के नामों, और ऐप्लिकेशन साइनिंग पासकोड (GetDeveloperAccount, ListDeveloperAccounts, GetAndroidPackage, ListAndroidPackages, GetAndroidPackageKey, ListAndroidPackageKeys) के लिए, रजिस्ट्रेशन का स्टेटस मॉनिटर करें.

शुरू से आखिर तक लागू करने का वर्कफ़्लो

  1. यूज़र इंटरफ़ेस (यूआई) में डेवलपर की पहचान की पुष्टि एक बार करें: Android Developer Console में डेवलपर की पहचान की पुष्टि (INDIVIDUAL या ORGANIZATION) करें, ताकि verificationState VERIFIED हो सके.
  2. एपीआई चालू करें और पुष्टि करें: अपने Google Cloud प्रोजेक्ट में androiddeveloperconsole.googleapis.com चालू करें. साथ ही, https://www.googleapis.com/auth/androiddeveloperconsole स्कोप के साथ उपयोगकर्ता को ऐक्सेस देने वाला OAuth 2.0 Bearer ऐक्सेस टोकन पाएं.
  3. अपने डेवलपर खाते के संसाधन का नाम ढूंढें: developerAccounts/{developer_account} को वापस पाने के लिए, GET /v1/developerAccounts (ListDeveloperAccounts) को कॉल करें और पुष्टि करें कि verificationState, VERIFIED है.
  4. पैकेज के नाम के लिए रजिस्ट्रेशन की नीति देखें: keySelectionStrategy (SELECT_KEY_FROM_LIST या USE_ANY_KEY) और साइनिंग पासकोड के इतिहास (knownKeys) की जांच करने के लिए, GET /v1/developerAccounts/{id}/androidPackages/{pkg}/registrationPolicy (GetAndroidPackageRegistrationPolicy) को कॉल करें.
  5. Android पैकेज संसाधन बनाएं: POST /v1/developerAccounts/{id}/androidPackages?androidPackageId={pkg} (CreateAndroidPackage) को कॉल करें. इसके लिए, मुख्य हिस्से में {"name": ""} का इस्तेमाल करें. इससे DRAFT स्थिति में संसाधन बनता है.
  6. अपने ऐप्लिकेशन साइनिंग पासकोड का फ़िंगरप्रिंट रजिस्टर करें: JSON बॉडी {"certificateFingerprintSha256": "..."} के साथ POST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys (CreateAndroidPackageKey) को कॉल करें. वापस किए गए स्टेटस की जांच करें:
    • DRAFT: निजी पासकोड के मालिकाना हक का सबूत देना ज़रूरी है. जवाब में, सातवें चरण के लिए एक यूनीक verificationToken शामिल होता है.
    • IN_REVIEW: मालिकाना हक का सबूत और वजह बताने की प्रोसेस को अपने-आप स्किप कर दिया जाता है. उदाहरण के लिए, जब कोई ऐसा नया पैकेज नाम रजिस्टर किया जाता है जो Android पर पहले कभी नहीं देखा गया हो या जब आपने उसी DeveloperAccount में किसी दूसरे पैकेज नाम के लिए, इस साइनिंग पासकोड के मालिकाना हक की पुष्टि पहले ही कर ली हो. सातवें चरण और आठवें चरण में वजह बताने की प्रोसेस को स्किप करें. इसके बाद, सीधे GetAndroidPackage और GetAndroidPackageKey को पोल करने पर जाएं.
  7. पुष्टि करने वाला APK बनाएं और अपलोड करें (अगर स्थिति DRAFT है): packageName से मैच करने वाले APK में, assets/adi-registration.properties के अंदर, वापस मिली verificationToken स्ट्रिंग को एम्बेड करें. इसके बाद, ऐप्लिकेशन साइनिंग पासकोड का इस्तेमाल करके, APK पर साइन करें और POST /upload/v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:verify (VerifyAndroidPackageKeyOwnership) का इस्तेमाल करके उसे अपलोड करें.
  8. अगर ज़रूरी हो, तो वजह बताएं और पोल रजिस्ट्रेशन की स्थिति सबमिट करें: अगर पासकोड OWNERSHIP_VERIFIED स्थिति में है और registrationJustificationRequired, true है, तो POST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:justifyAndroidPackageKeyRegistration (JustifyAndroidPackageKeyRegistration) को कॉल करें. GetAndroidPackage और GetAndroidPackageKey को तब तक पोल करें, जब तक state, REGISTERED तक न पहुंच जाए.

कुंजी के फ़िंगरप्रिंट और पुष्टि करने वाले APK तैयार करने के लिए, लोकल सीएलआई कमांड

  • कीस्टोर (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 के यूज़र इंटरफ़ेस (यूआई) और एपीआई की सुविधाएं

टास्क Android Developer Console का वेब यूज़र इंटरफ़ेस (android.google.com/developerconsole) Android Developer Console 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) Console के यूज़र इंटरफ़ेस (यूआई) में, साइन किया हुआ स्निपेट APK अपलोड करना POST /upload/v1/{name}:verify (VerifyAndroidPackageKeyOwnership)
जब कुंजी की मैन्युअल तरीके से समीक्षा करने की ज़रूरत हो, तब वजह सबमिट करना कुंजी के रजिस्ट्रेशन वर्कफ़्लो के दौरान टेक्स्ट प्रॉम्प्ट POST /v1/{name}:justifyAndroidPackageKeyRegistration (JustifyAndroidPackageKeyRegistration)

सेवा का कॉन्फ़िगरेशन और पुष्टि करना

सभी एपीआई अनुरोधों में एचटीटीपीएस का इस्तेमाल किया जाना चाहिए. साथ ही, इनमें Authorization: Bearer ACCESS_TOKEN हेडर शामिल होना चाहिए. यह हेडर, OAuth 2.0 वेब सर्वर फ़्लो का इस्तेमाल करके, उस Google खाते के लिए मिलता है जिसने Android Developer Console में डेवलपर के तौर पर अपनी पहचान की पुष्टि की हो.

प्रॉपर्टी वैल्यू
बुनियादी REST एंडपॉइंट https://androiddeveloperconsole.googleapis.com
मीडिया अपलोड एंडपॉइंट https://androiddeveloperconsole.googleapis.com/upload
एपीआई वर्शन v1
OAuth 2.0 का ज़रूरी दायरा https://www.googleapis.com/auth/androiddeveloperconsole
कोटे की डिफ़ॉल्ट सीमा हर तरीके के लिए, हर Google Cloud प्रोजेक्ट के हिसाब से हर दिन 2,000 अनुरोध

एपीआई के संसाधन और एंडपॉइंट

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

यह Android Developer Console में मौजूद उस खाते को दिखाता है जो किसी डेवलपर की पहचान से जुड़ा होता है.

फ़ील्ड प्रकार ब्यौरा
name string आइडेंटिफ़ायर. developerAccounts/{developer_account} फ़ॉर्मैट में संसाधन का नाम.
displayName string सिर्फ़ आउटपुट के लिए. डेवलपर खाते से जुड़ा ऐसा नाम जिसे कोई व्यक्ति आसानी से पढ़ सके. जैसे, किसी व्यक्ति या संगठन का नाम.
verificationState enum (VerificationState) सिर्फ़ आउटपुट के लिए. खाते के लिए, डेवलपर की पहचान की पुष्टि की मौजूदा स्थिति.

Enum: DeveloperAccount.VerificationState

वैल्यू ब्यौरा
VERIFIED डेवलपर की पहचान की पुष्टि हो गई है. इस खाते से, पैकेज के नाम और ऐप्लिकेशन साइनिंग पासकोड रजिस्टर किए जा सकते हैं.
NOT_VERIFIED Android Developer Console में, डेवलपर के तौर पर अपनी पहचान की पुष्टि करने की प्रक्रिया पूरी नहीं की गई है.

तरीके: DeveloperAccount

तरीका एचटीटीपी अनुरोध ब्यौरा
GetDeveloperAccount GET /v1/{name=developerAccounts/*} किसी एक DeveloperAccount के लिए, मेटाडेटा और पुष्टि की स्थिति की जानकारी हासिल करता है.
ListDeveloperAccounts GET /v1/developerAccounts यह पुष्टि किए गए Google खाते से ऐक्सेस किए जा सकने वाले सभी DeveloperAccount ऑब्जेक्ट की सूची दिखाता है. इसमें पेज नंबर नहीं होते.

संसाधन: AndroidPackage

यह DeveloperAccount के तहत रजिस्टर किए गए या रजिस्टर किए जा रहे Android पैकेज के नाम को दिखाता है.

फ़ील्ड प्रकार ब्यौरा
name string आइडेंटिफ़ायर. संसाधन का नाम developerAccounts/{developer_account}/androidPackages/{android_package} फ़ॉर्मैट में होना चाहिए, जहां {android_package}, Android पैकेज का नाम है (उदाहरण के लिए, com.example.myapp).
packageName string सिर्फ़ आउटपुट के लिए. Android पैकेज का नाम (उदाहरण के लिए, com.example.myapp).
state enum (AndroidPackage.State) सिर्फ़ आउटपुट के लिए. पैकेज के नाम के रजिस्ट्रेशन की लाइफ़साइकल की मौजूदा स्थिति.
registeredAppStore boolean सिर्फ़ आउटपुट के लिए. इससे पता चलता है कि पैकेज का यह नाम, फ़िलहाल रजिस्टर किए गए ऐप स्टोर के तौर पर चालू है या नहीं.

Enum: AndroidPackage.State

वैल्यू ब्यौरा
DRAFT पैकेज के नाम का संसाधन बना लिया गया है. साथ ही, ऐप्लिकेशन साइनिंग पासकोड के रजिस्ट्रेशन या मालिकाना हक की पुष्टि की प्रोसेस अब भी जारी है.
IN_REVIEW पैकेज के नाम का रजिस्ट्रेशन और ज़रूरी पासकोड की जानकारी सबमिट कर दी गई है. Google इसकी समीक्षा कर रहा है. कोई पैकेज DRAFT से IN_REVIEW में बदल जाता है. ऐसा CreateAndroidPackageKey के तुरंत बाद होता है. ऐसा तब होता है, जब पासकोड के मालिकाना हक की पुष्टि करने की प्रोसेस को छोड़ दिया जाता है. इसमें वह स्थिति भी शामिल है जब पासकोड की पुष्टि, उसी DeveloperAccount में किसी दूसरे पैकेज के नाम के लिए पहले ही की जा चुकी हो. इसके अलावा, VerifyAndroidPackageKeyOwnership और ज़रूरत पड़ने पर JustifyAndroidPackageKeyRegistration को पूरा करने के बाद भी ऐसा होता है.
REGISTERED पैकेज का नाम, Android डेवलपर की पहचान की पुष्टि के लिए इस डेवलपर खाते में रजिस्टर किया गया है.
PENDING_TRANSFER पैकेज के नाम का मालिकाना हक का ट्रांसफ़र, किसी दूसरे डेवलपर खाते को किया जा रहा है.

संसाधन: AndroidPackageRegistrationPolicy

GetAndroidPackageRegistrationPolicy से मिला सिंगलटन रिसॉर्स. इससे, किसी पैकेज के नाम के लिए, साइन करने के लिए इस्तेमाल किए गए पुराने सार्वजनिक पासकोड की जानकारी मिलती है. साथ ही, यह पता चलता है कि साइन करने के लिए इस्तेमाल किए गए किसी पासकोड के साथ पैकेज का नाम रजिस्टर करने के लिए, लिखित में वजह बताने की ज़रूरत है या नहीं.

फ़ील्ड प्रकार ब्यौरा
name string आइडेंटिफ़ायर. developerAccounts/{developer_account}/androidPackages/{android_package}/registrationPolicy फ़ॉर्मैट में संसाधन का नाम.
knownKeys[] object (KnownKey) ऐप्लिकेशन साइनिंग पासकोड के पुराने वर्शन की सूची. इस सूची में वे पासकोड शामिल हैं जिनका इस्तेमाल करके, इस पैकेज नाम वाले ऐप्लिकेशन पहले उपलब्ध कराए गए थे. इस सूची को certificateFingerprintSha256 के हिसाब से वर्णमाला के क्रम में लगाया गया है.
knownKeys[].certificateFingerprintSha256 string सिर्फ़ आउटपुट के लिए. पुराने साइनिंग सर्टिफ़िकेट का नॉर्मलाइज़ किया गया 64-वर्ण वाला लोअरकेस हेक्साडेसिमल SHA-256 फ़िंगरप्रिंट (बिना कोलन के).
knownKeys[].justificationRequirement enum (JustificationRequirement) सिर्फ़ आउटपुट के लिए. इससे पता चलता है कि इस पासकोड को रजिस्टर करने के लिए, JustifyAndroidPackageKeyRegistration (REQUIRED या NOT_REQUIRED) को कॉल करना ज़रूरी है या नहीं. अगर साइनिंग पासकोड की पुष्टि पहले ही उसी DeveloperAccount के तहत किसी दूसरे पैकेज के नाम पर की जा चुकी है, तो VerifyAndroidPackageKeyOwnership और JustifyAndroidPackageKeyRegistration, दोनों को छोड़ दिया जाता है. भले ही, justificationRequirement, REQUIRED हो.
keySelectionStrategy enum (KeySelectionStrategy) सिर्फ़ आउटपुट के लिए. इस पैकेज का नाम रजिस्टर करने के लिए, कुंजी चुनने की नीति: SELECT_KEY_FROM_LIST (knownKeys से कोई कुंजी रजिस्टर करनी होगी) या USE_ANY_KEY (डेवलपर के मालिकाना हक वाली, ऐप्लिकेशन साइनिंग की कोई भी मान्य कुंजी रजिस्टर की जा सकती है).

Enum: KnownKey.JustificationRequirement

वैल्यू ब्यौरा
REQUIRED इस कुंजी को रजिस्टर करने के लिए, आपको VerifyAndroidPackageKeyOwnership को पूरा करने के बाद, JustifyAndroidPackageKeyRegistration का इस्तेमाल करके लिखित में वजह बतानी होगी. हालांकि, अगर इस कुंजी की पुष्टि पहले ही उसी DeveloperAccount के तहत किसी दूसरे पैकेज के नाम पर की जा चुकी है, तो VerifyAndroidPackageKeyOwnership और JustifyAndroidPackageKeyRegistration, दोनों को छोड़ दिया जाता है.
NOT_REQUIRED इस जानी-पहचानी कुंजी को रजिस्टर करने के लिए, कोई वजह बताने की ज़रूरत नहीं है. VerifyAndroidPackageKeyOwnership के बाद, पासकोड सीधे IN_REVIEW पर ट्रांसफ़र हो जाता है. अगर पासकोड की पुष्टि पहले ही उसी DeveloperAccount के तहत किसी दूसरे पैकेज के नाम पर की जा चुकी है, तो CreateAndroidPackageKey के बाद पासकोड तुरंत ट्रांसफ़र हो जाता है.

Enum: AndroidPackageRegistrationPolicy.KeySelectionStrategy

वैल्यू ब्यौरा
SELECT_KEY_FROM_LIST कॉलर को knownKeys में मौजूद, पहले से इस्तेमाल की जा रही कुंजियों में से किसी एक को रजिस्टर करना होगा.
USE_ANY_KEY knownKeys में मौजूद किसी भी पासकोड के अलावा, कॉलर किसी भी ऐसे मान्य ऐप्लिकेशन साइनिंग पासकोड को रजिस्टर कर सकता है जो Android ईकोसिस्टम में पहले नहीं देखा गया है.

तरीके: AndroidPackage

तरीका एचटीटीपी अनुरोध ब्यौरा
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 आइडेंटिफ़ायर. सर्वर से असाइन किए गए संसाधन का नाम developerAccounts/{developer_account}/androidPackages/{android_package}/keys/{key} फ़ॉर्मैट में होता है. इसमें {key}, कोलन के बिना 64-वर्ण वाला लोअरकेस हेक्साडेसिमल SHA-256 फ़िंगरप्रिंट होता है. CreateAndroidPackageKey को कॉल करते समय, इसे शामिल नहीं किया जाना चाहिए या खाली छोड़ देना चाहिए.
certificateFingerprintSha256 string ज़रूरी है. इम्यूटेबल. ऐप्लिकेशन साइनिंग सर्टिफ़िकेट का SHA-256 हैश. CreateAndroidPackageKey में इनपुट के तौर पर, 64-वर्ण वाला सामान्य हेक्स (60e860e8...) या कोलन से अलग किया गया हेक्स (60:E8:60:E8:...) स्वीकार किया जाता है. आउटपुट के तौर पर, हमेशा कोलन के बिना 64-वर्ण वाले अंग्रेज़ी के छोटे अक्षरों में हेक्साडेसिमल में नॉर्मलाइज़ किया जाता है.
state enum (AndroidPackageKey.State) सिर्फ़ आउटपुट के लिए. पासकोड की पुष्टि और रजिस्ट्रेशन की लाइफ़साइकल की मौजूदा स्थिति.
verificationToken string सिर्फ़ आउटपुट के लिए. Google से जनरेट किया गया यूनीक चैलेंज टोकन. इसका इस्तेमाल सिर्फ़ तब किया जाता है, जब स्थिति DRAFT हो. अगर CreateAndroidPackageKey, पासकोड को सीधे IN_REVIEW में बदल देता है, तो इसे अनदेखा किया जा सकता है. जब स्थिति DRAFT हो, तो VerifyAndroidPackageKeyOwnership को पूरा करने के लिए, हस्ताक्षर किए गए APK में assets/adi-registration.properties के अंदर इस स्ट्रिंग को एम्बेड करें.
registrationJustificationRequired boolean सिर्फ़ आउटपुट के लिए. अगर true और कुंजी OWNERSHIP_VERIFIED स्थिति में है, तो आपको रजिस्ट्रेशन की प्रोसेस IN_REVIEW पर आगे बढ़ने से पहले, JustifyAndroidPackageKeyRegistration का इस्तेमाल करके लिखित में वजह बतानी होगी. अगर CreateAndroidPackageKey, पासकी को सीधे IN_REVIEW पर ट्रांसफ़र करता है, तो वजह बताने की ज़रूरत नहीं होती. ऐसा इसलिए होता है, क्योंकि पासकी की पुष्टि पहले ही उसी DeveloperAccount में किसी दूसरे पैकेज के नाम पर की जा चुकी होती है.

Enum: AndroidPackageKey.State

वैल्यू ब्यौरा
DRAFT पासकोड का संसाधन बना दिया गया है. हालांकि, हस्ताक्षर किए गए APK को अपलोड (VerifyAndroidPackageKeyOwnership) करके, निजी पासकोड के मालिकाना हक का सबूत देना अब भी ज़रूरी है. ऐसा इसलिए, क्योंकि इस DeveloperAccount के तहत आने वाले किसी भी पैकेज के नाम पर, इस पासकोड के मालिकाना हक की पुष्टि अब तक नहीं की गई है.
OWNERSHIP_VERIFIED हस्ताक्षर किए गए APK को अपलोड करके, निजी पासकोड के मालिकाना हक की पुष्टि की गई है. अगर registrationJustificationRequired, true है, तो समीक्षा शुरू होने से पहले अब भी वजह बताना ज़रूरी है.
IN_REVIEW Google, डिजिटल बटन के रजिस्ट्रेशन की समीक्षा कर रहा है. कोई पासकोड इस स्थिति में तब आता है, जब CreateAndroidPackageKey के तुरंत बाद मालिकाना हक की पुष्टि करने की ज़रूरत नहीं होती. उदाहरण के लिए, पैकेज के ऐसे नए नाम पर जिसे Android पर पहले कभी इस्तेमाल नहीं किया गया है या जब पासकोड की पुष्टि पहले ही उसी DeveloperAccount के तहत किसी दूसरे पैकेज के नाम पर की जा चुकी हो. इससे JustifyAndroidPackageKeyRegistration की ज़रूरत भी नहीं पड़ती. इसके अलावा, VerifyAndroidPackageKeyOwnership के तुरंत बाद (अगर registrationJustificationRequired, false है) या JustifyAndroidPackageKeyRegistration के बाद (अगर registrationJustificationRequired, true है) भी पासकोड इस स्थिति में आता है.
REGISTERED ऐप्लिकेशन साइनिंग पासकोड, इस पैकेज के नाम के साथ रजिस्टर है. इसका इस्तेमाल, Android डेवलपर की पहचान की पुष्टि के लिए किया जाता है.
PENDING_TRANSFER ऐप्लिकेशन साइनिंग पासकोड का रजिस्ट्रेशन, ट्रांसफ़र पूरा होने के बाद ही किया जा सकता है.

तरीके: AndroidPackageKey

तरीका एचटीटीपी अनुरोध ब्यौरा
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 निजी पासकोड के मालिकाना हक की पुष्टि करने और समीक्षा के लिए तैयार पासकोड सबमिट करने के लिए, साइन किया गया एक ऐसा APK अपलोड करें जिसमें assets/adi-registration.properties में verificationToken शामिल हो.
JustifyAndroidPackageKeyRegistration POST /v1/{name=developerAccounts/*/androidPackages/*/keys/*}:justifyAndroidPackageKeyRegistration registrationJustificationRequired के true होने पर, अतिरिक्त जानकारी सबमिट करता है. साथ ही, पुष्टि की गई कुंजियों को समीक्षा के लिए सबमिट करता है.

गड़बड़ी ठीक करना

जब कोई एपीआई अनुरोध पूरा नहीं हो पाता है, तो Android Developer Console API, एचटीटीपी 4xx या 5xx स्टेटस कोड और स्टैंडर्ड google.rpc.Status JSON गड़बड़ी की जानकारी दिखाता है:

{
  "error": {
    "code": 400,
    "message": "Invalid certificate fingerprint SHA256 format.",
    "status": "INVALID_ARGUMENT",
    "details": []
  }
}

एचटीटीपी स्टेटस कोड और आम तौर पर इस्तेमाल होने वाले समाधान

एचटीटीपी कोड gRPC स्टेटस आम वजहें रिज़ॉल्यूशन
400 Bad Request INVALID_ARGUMENT Java-style 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 ऐक्सेस टोकन मौजूद नहीं है, इसकी समयसीमा खत्म हो गई है या यह अमान्य है. इसके अलावा, एपीआई पासकोड या सेवा खाते का इस्तेमाल करके पुष्टि करने की कोशिश की गई है. 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 Console में androiddeveloperconsole.googleapis.com चालू हो.
404 Not Found NOT_FOUND DeveloperAccount, AndroidPackage या AndroidPackageKey के लिए बताया गया रिसॉर्स पाथ मौजूद नहीं है. ListDeveloperAccounts, ListAndroidPackages या ListAndroidPackageKeys का इस्तेमाल करके, संसाधन के पाथ की पुष्टि करें. पक्का करें कि {key} आईडी में कोलन के बिना लोअरकेस हेक्स का इस्तेमाल किया गया हो.
409 Conflict ALREADY_EXISTS पैकेज का नाम या SHA-256 सर्टिफ़िकेट फ़िंगरप्रिंट, इस या किसी दूसरे डेवलपर खाते में पहले से रजिस्टर है. GetAndroidPackage या GetAndroidPackageKey का इस्तेमाल करके, मौजूदा रजिस्ट्रेशन की जांच करें. इसके अलावा, GetAndroidPackageRegistrationPolicy का इस्तेमाल करके, मालिकाना हक का इतिहास देखें.
429 Too Many Requests RESOURCE_EXHAUSTED हर Google Cloud प्रोजेक्ट के लिए, हर दिन 2,000 अनुरोधों का कोटा तय किया गया है. आपने इस कोटे को पार कर लिया है. जिटर के साथ एक्स्पोनेंशियल बैकऑफ़ लागू करें और ज़्यादा फ़्रीक्वेंसी वाले पोलिंग लूप से बचें.
500 / 503 INTERNAL / UNAVAILABLE बैकएंड में कुछ समय के लिए गड़बड़ी होना या सेवा का कुछ समय के लिए उपलब्ध न होना. ट्रंकेटेड एक्स्पोनेंशियल बैकऑफ़ के साथ, आइडमपोटेंट अनुरोधों को फिर से भेजें.

एचटीटीपी अनुरोध और जवाब के उदाहरण

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

पहला विकल्प: एक अनुरोध में मीडिया अपलोड करना

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"

दूसरा विकल्प: फिर से अपलोड किया जा सकने वाला प्रोटोकॉल (बड़े APK या सीआई/सीडी के लिए सुझाया गया)

पहला चरण: फिर से अपलोड करने का सेशन शुरू करें और मिले 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"
  }'

दूसरा चरण: साइन किए गए 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
}

अन्य संसाधन