Android Developer Console API

Android Developer Console API হল একটি RESTful পরিষেবা যা যাচাইকৃত ডেভেলপারদের Android Developer Console-এ Android ডেভেলপার যাচাইকরণ ওয়ার্কফ্লো অটোমেট করতে দেয়, যার মধ্যে ডেভেলপার অ্যাকাউন্ট ফিরিয়ে আনা, কী-এর যোগ্যতার প্রয়োজনীয়তা চেক করা, Android প্যাকেজের নাম রেজিস্টার করা, অ্যাপ সাইনিং কী রেজিস্টার করা এবং কী-এর মালিকানা যাচাই করা অন্তর্ভুক্ত।

ওভারভিউ, ব্যবহারের উদাহরণ ও প্রয়োগের প্রসঙ্গ

মূল ব্যবহারিক ক্ষেত্র ও ফিচার

  • অটোমেটেড CI/CD প্যাকেজের নাম রেজিস্ট্রেশন: প্রোগ্রাম্যাটিকভাবে (CreateAndroidPackage) ডজন বা শত শত Android প্যাকেজের নাম রেজিস্টার করুন।
  • প্রি-ফ্লাইট হিস্টোরিক্যাল কী পলিসি ইন্সপেকশন: Google আগে ইকোসিস্টেমে কোনও প্যাকেজের নাম লক্ষ্য করেছে কিনা এবং কোনও নির্দিষ্ট সাইনিং সার্টিফিকেট রেজিস্টার করার জন্য কী-এর মালিকানা যাচাইকরণ (GetAndroidPackageRegistrationPolicy) প্রয়োজন কিনা তা প্রোগ্রাম্যাটিকভাবে পরীক্ষা করুন।
  • অটোমেটিক অ্যাপ সাইনিং কী রেজিস্ট্রেশন ও মালিকানা যাচাইকরণ: পাবলিক সাইনিং সার্টিফিকেট SHA-256 ফিঙ্গারপ্রিন্ট রেজিস্টার করুন (CreateAndroidPackageKey), অনন্য যাচাইকরণ চ্যালেঞ্জ টোকেন ফিরিয়ে আনুন (verificationToken) এবং সিঙ্গল-রিকোয়েস্ট বা রিজুম করা যায় এমন সাইন করা APK আপলোড ব্যবহার করে ব্যক্তিগত কী পজেশন অটোমেট করুন (VerifyAndroidPackageKeyOwnership)।
  • প্রোগ্রামাটিক জাস্টিফিকেশন জমা দেওয়া: মালিকানার জাস্টিফিকেশন জমা দিন (JustifyAndroidPackageKeyRegistration)।
  • স্ট্যাটাস মনিটর করা: ডেভেলপার অ্যাকাউন্ট, প্যাকেজের নাম ও অ্যাপ সাইনিং কী (GetDeveloperAccount, ListDeveloperAccounts, GetAndroidPackage, ListAndroidPackages, GetAndroidPackageKey, ListAndroidPackageKeys) জুড়ে রেজিস্ট্রেশন স্ট্যাটাস মনিটর করুন।

এন্ড-টু-এন্ড প্রয়োগের ওয়ার্কফ্লো

  1. UI-তে একবার ডেভেলপারের পরিচয় যাচাই করুন: Android Developer Console-এ ডেভেলপারের পরিচয় যাচাইকরণ (INDIVIDUAL বা ORGANIZATION) সম্পূর্ণ করুন যাতে verificationState, VERIFIED হয়।
  2. API চালু ও যাচাই করুন: আপনার Google Cloud প্রোজেক্টে androiddeveloperconsole.googleapis.com চালু করুন এবং https://www.googleapis.com/auth/androiddeveloperconsole স্কোপ সহ ব্যবহারকারী-প্রতিনিধি OAuth 2.0 বিয়ারার অ্যাক্সেস টোকেন পান।
  3. আপনার ডেভেলপার অ্যাকাউন্ট রিসোর্সের নাম খুঁজে নিন: GET /v1/developerAccounts (ListDeveloperAccounts) কল করে developerAccounts/{developer_account} ফিরিয়ে আনুন এবং যাচাই করুন যে verificationState হল VERIFIED।
  4. প্যাকেজের নামের জন্য রেজিস্ট্রেশন নীতি চেক করুন: keySelectionStrategy (SELECT_KEY_FROM_LIST অথবা USE_ANY_KEY) এবং আগে থেকে জানা কোনও ঐতিহাসিক সাইনিং কী (knownKeys) পরীক্ষা করতে GET /v1/developerAccounts/{id}/androidPackages/{pkg}/registrationPolicy (GetAndroidPackageRegistrationPolicy) কল করুন।
  5. Android প্যাকেজ রিসোর্স তৈরি করুন: {"name": ""} বডি সহ POST /v1/developerAccounts/{id}/androidPackages?androidPackageId={pkg} (CreateAndroidPackage) কল করুন (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 স্ট্রিং এম্বেড করুন, আপনার ব্যক্তিগত অ্যাপ সাইনিং কী দিয়ে এটি সাইন করুন এবং 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)-এ কল করুন। state, REGISTERED-এ না পৌঁছানো পর্যন্ত GetAndroidPackage এবং GetAndroidPackageKey পোল করুন।

কী ফিঙ্গারপ্রিন্ট ও যাচাইকরণ APK প্রস্তুত করার জন্য লোকাল CLI কমান্ড

  • কিস্টোর (keytool) থেকে SHA-256 সার্টিফিকেট ফিঙ্গারপ্রিন্ট এক্সট্র্যাক্ট করুন:

    keytool -list -v -keystore release-key.jks -alias my-key-alias
  • তৈরি করা APK-তে (apksigner) SHA-256 সাইনিং সার্টিফিকেট ডাইজেস্ট যাচাই করুন:

    apksigner verify --print-certs app-release.apk
  • আপলোড করার আগে APK প্যাকেজের নাম এবং এম্বেড করা টোকেন ফাইল চেক করুন (aapt2 এবং unzip):

    aapt2 dump badging app-release.apk | head -n 1
    unzip -p app-release.apk assets/adi-registration.properties

Android Developer Console UI এবং API-এর ক্ষমতা

টাস্ক Android Developer Console Web UI (android.google.com/developerconsole) Android Developer Console API
ডেভেলপারের পরিচয় যাচাইকরণ (KYC/KYB) এবং ফি পেমেন্ট কাজ করে (একবারই পূর্বশর্ত পূরণ করতে হয়) API ব্যবহার করে কাজ করে না (GetDeveloperAccount এবং ListDeveloperAccounts ব্যবহার করে শুধু-পড়ার স্ট্যাটাস চেক)
লিঙ্ক করা ডেভেলপার অ্যাকাউন্ট দেখুন কনসোল হেডারে অ্যাকাউন্ট বদলকারী GET /v1/developerAccounts (ListDeveloperAccounts)
কোনও প্যাকেজের নামের জন্য পুরনো সাইনিং কী এবং নীতি পরীক্ষা করুন "প্যাকেজের নাম রেজিস্টার করুন" উইজার্ড চলাকালীন দেখানো হয় GET /v1/.../registrationPolicy (GetAndroidPackageRegistrationPolicy)
নতুন Android প্যাকেজের নাম রেজিস্টার করুন প্যাকেজের নাম > প্যাকেজের নাম রেজিস্টার করুন POST /v1/{parent}/androidPackages?androidPackageId=... (CreateAndroidPackage)
রেজিস্টার করা ও ড্রাফ্ট প্যাকেজের নাম দেখুন বা তালিকাভুক্ত করুন প্যাকেজের নাম ড্যাশবোর্ড টেবিল GET /v1/{name} (GetAndroidPackage), GET /v1/{parent}/androidPackages (ListAndroidPackages)
অ্যাপ সাইনিং কী যোগ করুন এবং চ্যালেঞ্জ টোকেন জেনারেট করুন প্যাকেজের বিবরণ > সাইন-ইন কী যোগ করুন POST /v1/{parent}/keys (CreateAndroidPackageKey)
ব্যক্তিগত 'কী'-এর মালিকানা প্রমাণ করুন (adi-registration.properties) কনসোল UI-তে স্বাক্ষরিত স্নিপেট APK আপলোড করুন POST /upload/v1/{name}:verify (VerifyAndroidPackageKeyOwnership)
কী ম্যানুয়ালি পর্যালোচনা করার প্রয়োজন হলে, যুক্তি জমা দিন কী রেজিস্ট্রেশন ওয়ার্কফ্লো চলাকালীন টেক্সট প্রম্পট POST /v1/{name}:justifyAndroidPackageKeyRegistration (JustifyAndroidPackageKeyRegistration)

পরিষেবা কনফিগারেশন ও যাচাইকরণ

সব API অনুরোধে HTTPS ব্যবহার করতে হবে এবং Android Developer Console-এ ডেভেলপারের পরিচয় যাচাইকরণ সম্পূর্ণ করেছে এমন Google অ্যাকাউন্টের জন্য OAuth 2.0 ওয়েব সার্ভার ফ্লো ব্যবহার করে পাওয়া Authorization: Bearer ACCESS_TOKEN হেডার অন্তর্ভুক্ত করতে হবে।

প্রপার্টি মান
বেস REST এন্ডপয়েন্ট https://androiddeveloperconsole.googleapis.com
মিডিয়া আপলোড এন্ডপয়েন্ট https://androiddeveloperconsole.googleapis.com/upload
API ভার্সন v1
প্রয়োজনীয় OAuth 2.0 স্কোপ https://www.googleapis.com/auth/androiddeveloperconsole
ডিফল্ট কোটার সীমা প্রতিটি Google Cloud প্রোজেক্টের প্রতিটি পদ্ধতির জন্য প্রতিদিন 2,000টি অনুরোধ

API রিসোর্স ও এন্ডপয়েন্ট

Android Developer Console API নিম্নলিখিত ক্রম অনুযায়ী রিসোর্স সাজায়:

  • DeveloperAccount (developerAccounts/{developer_account})
    • AndroidPackage (developerAccounts/{developer_account}/androidPackages/{android_package})
      • AndroidPackageRegistrationPolicy (developerAccounts/{developer_account}/androidPackages/{android_package}/registrationPolicy)
      • AndroidPackageKey (developerAccounts/{developer_account}/androidPackages/{android_package}/keys/{key}টি)

রিসোর্স: DeveloperAccount

Android Developer Console-এ কোনও অ্যাকাউন্টকে বোঝায় যা কোনও ডেভেলপারের পরিচয়ের সাথে যুক্ত।

ফিল্ড ধরন বর্ণনা
name string শনাক্তকারী। developerAccounts/{developer_account} ফর্ম্যাটে রিসোর্সের নাম।
displayName string শুধু আউটপুট। ডেভেলপার অ্যাকাউন্টের সাথে যুক্ত মানুষের-পঠনযোগ্য নাম (ব্যক্তিগত নাম বা সংস্থার নাম)।
verificationState enum (VerificationState) শুধু আউটপুট। অ্যাকাউন্টের বর্তমান ডেভেলপার পরিচয় যাচাইকরণ স্ট্যাটাস।

Enum: DeveloperAccount.VerificationState

মান বর্ণনা
VERIFIED ডেভেলপারের পরিচয় যাচাইকরণ সম্পূর্ণ হয়েছে। অ্যাকাউন্টটি প্যাকেজের নাম এবং অ্যাপ সাইনিং 'কী' রেজিস্টার করতে পারে।
NOT_VERIFIED Android Developer Console-এ ডেভেলপারের পরিচয় যাচাইকরণ সম্পূর্ণ করা হয়নি।

Methods: DeveloperAccount

পদ্ধতি HTTP অনুরোধ বর্ণনা
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 তা পর্যালোচনা করছে। CreateAndroidPackageKey-এর সাথে সাথে (যখন 'কী' মালিকানা যাচাইকরণ এড়িয়ে যাওয়া হয়, যার মধ্যে একই DeveloperAccount-এ অন্য প্যাকেজের নামের জন্য 'কী' আগে থেকেই যাচাই করা থাকলে) অথবা VerifyAndroidPackageKeyOwnership এবং প্রয়োজন হলে JustifyAndroidPackageKeyRegistration সম্পূর্ণ করার পরে, প্যাকেজ DRAFT থেকে IN_REVIEW-এ ট্রানজিশন করে।
REGISTERED Android ডেভেলপার যাচাইকরণের জন্য এই ডেভেলপার অ্যাকাউন্টে প্যাকেজের নাম সক্রিয়ভাবে রেজিস্টার করা আছে।
PENDING_TRANSFER অন্য ডেভেলপার অ্যাকাউন্টে মালিকানা ট্রান্সফার সম্পূর্ণ করার জন্য প্যাকেজের নাম অপেক্ষা করছে।

রিসোর্স: AndroidPackageRegistrationPolicy

GetAndroidPackageRegistrationPolicy দ্বারা রিটার্ন করা সিঙ্গলটন রিসোর্স যা কোনও প্যাকেজের নামের জন্য শনাক্ত করা ঐতিহাসিক পাবলিক সাইনিং কী এবং প্রদত্ত সাইনিং কী সহ প্যাকেজের নাম রেজিস্টার করার জন্য লিখিত যুক্তি প্রয়োজন কিনা তা বর্ণনা করে।

ফিল্ড ধরন বর্ণনা
name string শনাক্তকারী। developerAccounts/{developer_account}/androidPackages/{android_package}/registrationPolicy ফর্ম্যাটে রিসোর্সের নাম।
knownKeys[] object (KnownKey) এই প্যাকেজের নাম সহ অ্যাপ ডিস্ট্রিবিউট করার সময় আগে লক্ষ্য করা অ্যাপ সাইনিং কী-এর তালিকা, certificateFingerprintSha256 অনুযায়ী বর্ণানুক্রমিকভাবে সাজানো।
knownKeys[].certificateFingerprintSha256 string শুধু আউটপুট। ঐতিহাসিক সাইনিং সার্টিফিকেটের (কোলন ছাড়া) নরমালাইজ করা ৬৪-অক্ষরের ছোট হাতের হেক্সাডেসিমেল SHA-256 ফিঙ্গারপ্রিন্ট।
knownKeys[].justificationRequirement enum (JustificationRequirement) শুধু আউটপুট। এই 'কী' রেজিস্টার করার জন্য JustifyAndroidPackageKeyRegistration (REQUIRED বা NOT_REQUIRED) কল করতে হবে কিনা তা দেখায়। একই DeveloperAccount-এর অধীনে অন্য কোনও প্যাকেজের নামে সাইনিং 'কী' আগে যাচাই করা হয়ে থাকলে, justificationRequirement-এর মান REQUIRED হলেও VerifyAndroidPackageKeyOwnership এবং JustifyAndroidPackageKeyRegistration উভয়ই এড়িয়ে যাওয়া হয়।
keySelectionStrategy enum (KeySelectionStrategy) শুধু আউটপুট। এই প্যাকেজের নাম রেজিস্টার করার জন্য 'কী' বেছে নেওয়ার নীতি: SELECT_KEY_FROM_LIST (knownKeys থেকে একটি 'কী' রেজিস্টার করতে হবে) অথবা USE_ANY_KEY (ডেভেলপারের মালিকানাধীন যেকোনও বৈধ অ্যাপ সাইনিং 'কী' রেজিস্টার করা যাবে)।

Enum: KnownKey.JustificationRequirement

মান বর্ণনা
REQUIRED এই পরিচিত 'কী' রেজিস্টার করার জন্য VerifyAndroidPackageKeyOwnership সম্পূর্ণ করার পরে JustifyAndroidPackageKeyRegistration ব্যবহার করে একটি লিখিত যুক্তি জমা দিতে হবে (যদি না 'কী'টি আগে একই DeveloperAccount-এর অধীনে অন্য প্যাকেজের নামে যাচাই করা হয়, সেক্ষেত্রে VerifyAndroidPackageKeyOwnership এবং JustifyAndroidPackageKeyRegistration উভয়ই এড়িয়ে যাওয়া হয়)।
NOT_REQUIRED এই পরিচিত 'কী' রেজিস্টার করার জন্য কোনও যুক্তি দেখানোর প্রয়োজন নেই। VerifyAndroidPackageKeyOwnership-এর পরে 'কী' সরাসরি IN_REVIEW-এ ট্রানজিশন করে (অথবা CreateAndroidPackageKey-এর সাথে সাথে যদি 'কী' আগে একই DeveloperAccount-এর অধীনে অন্য প্যাকেজের নামে যাচাই করা হয়ে থাকে)।

Enum: AndroidPackageRegistrationPolicy.KeySelectionStrategy

মান বর্ণনা
SELECT_KEY_FROM_LIST কলকারীকে knownKeys-এ তালিকাভুক্ত ঐতিহাসিক কীগুলির মধ্যে একটি রেজিস্টার করতে হবে।
USE_ANY_KEY knownKeys-এ থাকা যেকোনও কী ছাড়াও, কলার যেকোনও বৈধ অ্যাপ সাইনিং কী রেজিস্টার করতে পারবেন যা আগে Android ইকোসিস্টেমে দেখা যায়নি।

পদ্ধতি: AndroidPackage

পদ্ধতি HTTP অনুরোধ বর্ণনা
GetAndroidPackageRegistrationPolicy GET /v1/{name=developerAccounts/*/androidPackages/*/registrationPolicy} প্যাকেজের নামের জন্য 'কী' বেছে নেওয়ার স্ট্র্যাটেজি এবং পরিচিত ঐতিহাসিক সাইনিং 'কী' ফিরিয়ে আনে।
CreateAndroidPackage POST /v1/{parent=developerAccounts/*}/androidPackages?androidPackageId={package_name} প্যাকেজের নাম রেজিস্টার করা শুরু করতে DRAFT স্ট্যাটাসে নতুন AndroidPackage রিসোর্স তৈরি করে।
GetAndroidPackage GET /v1/{name=developerAccounts/*/androidPackages/*} আগে থেকে থাকা AndroidPackage-এর বিবরণ ও বর্তমান রেজিস্ট্রেশন স্ট্যাটাস রিট্রিভ করে।
ListAndroidPackages GET /v1/{parent=developerAccounts/*}/androidPackages DeveloperAccount-এর অধীনে AndroidPackageটি অবজেক্টের তালিকা (pageSize সর্বাধিক 1000, pageToken)।

রিসোর্স: AndroidPackageKey

AndroidPackage-এর সাথে যুক্ত পাবলিক অ্যাপ সাইনিং সার্টিফিকেট ফিঙ্গারপ্রিন্ট দেখায় এবং মালিকানা যাচাইকরণ ও রেজিস্ট্রেশন পর্যালোচনা স্ট্যাটাস ট্র্যাক করে।

ফিল্ড ধরন বর্ণনা
name string শনাক্তকারী। developerAccounts/{developer_account}/androidPackages/{android_package}/keys/{key} ফর্ম্যাটে সার্ভার-অ্যাসাইন করা রিসোর্সের নাম, যেখানে {key} হল কোলন ছাড়া নরমালাইজ করা ৬৪-অক্ষরের ছোট হাতের হেক্সাডেসিমেল SHA-256 ফিঙ্গারপ্রিন্ট। CreateAndroidPackageKey কল করার সময় অবশ্যই বাদ দিতে হবে বা খালি রাখতে হবে।
certificateFingerprintSha256 string প্রয়োজনীয়। পরিবর্তন করা যাবে না। অ্যাপ সাইনিং সার্টিফিকেটের SHA-256 হ্যাশ। CreateAndroidPackageKey-এ ইনপুট হিসেবে, হয় প্লেন ৬৪-অক্ষরের হেক্স (60e860e8...) অথবা কোলন দ্বারা আলাদা করা হেক্স (60:E8:60:E8:...) গ্রহণ করে। আউটপুটে, কোলন ছাড়া ৬৪-অক্ষরের ছোট হাতের হেক্সাডেসিমাল হিসেবে সবসময় নরমালাইজ করা হয়।
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-এর মাধ্যমে 'কী' রেজিস্ট্রেশন পর্যালোচনা করা হচ্ছে। মালিকানার প্রমাণ প্রয়োজন না হলে (যেমন, Android-এ আগে কখনও দেখা যায়নি এমন নতুন প্যাকেজের নাম অথবা একই DeveloperAccount-এর অধীনে অন্য প্যাকেজের নামে 'কী' আগে যাচাই করা হলে, যা JustifyAndroidPackageKeyRegistration-কেও এড়িয়ে যায়), VerifyAndroidPackageKeyOwnership-এর ঠিক পরে (registrationJustificationRequired, false হলে) অথবা JustifyAndroidPackageKeyRegistration-এর পরে (registrationJustificationRequired, true হলে) CreateAndroidPackageKey-এর সাথে সাথে এখানে 'কী' ট্রানজিশন করে।
REGISTERED Android ডেভেলপার যাচাইকরণ-এর জন্য এই প্যাকেজের নামে অ্যাপ সাইনিং কী সক্রিয়ভাবে রেজিস্টার করা আছে।
PENDING_TRANSFER অ্যাপ সাইনিং কী রেজিস্ট্রেশন ট্রান্সফার সম্পূর্ণ হওয়ার জন্য অপেক্ষা করছে।

পদ্ধতি: AndroidPackageKey

পদ্ধতি HTTP অনুরোধ বর্ণনা
CreateAndroidPackageKey POST /v1/{parent=developerAccounts/*/androidPackages/*}/keys AndroidPackage-এর অধীনে নতুন অ্যাপ সাইনিং সার্টিফিকেট SHA-256 ফিঙ্গারপ্রিন্ট রেজিস্টার করে। DRAFT স্ট্যাটাসে (যখন VerifyAndroidPackageKeyOwnership ব্যবহার করে মালিকানার প্রমাণ প্রয়োজন হয়) বা সরাসরি IN_REVIEW স্ট্যাটাসে (যখন মালিকানা যাচাইকরণ এড়িয়ে যাওয়া হয়, যেমন Android-এ আগে কখনও দেখা যায়নি এমন একটি নতুন প্যাকেজের নাম বা একই DeveloperAccount-এ অন্য প্যাকেজের নামে আগে থেকেই যাচাই করা একটি 'কী') 'কী' ফিরিয়ে দেয়।
GetAndroidPackageKey GET /v1/{name=developerAccounts/*/androidPackages/*/keys/*} নির্দিষ্ট AndroidPackageKey-এর স্ট্যাটাস, ফিঙ্গারপ্রিন্ট ও যাচাইকরণ মেটাডেটা ফিরিয়ে আনে।
ListAndroidPackageKeys GET /v1/{parent=developerAccounts/*/androidPackages/*}/keys AndroidPackage-এর অধীনে রেজিস্টার করা সব AndroidPackageKey অবজেক্টের তালিকা দেখায় (pageSize সর্বাধিক 1000, pageToken)।
VerifyAndroidPackageKeyOwnership POST /upload/v1/{name=developerAccounts/*/androidPackages/*/keys/*}:verify ব্যক্তিগত কী-এর মালিকানা যাচাই করতে এবং পর্যালোচনার জন্য প্রস্তুত কী জমা দিতে assets/adi-registration.properties-এ verificationToken সহ একটি স্বাক্ষরিত ন্যূনতম APK আপলোড করে।
JustifyAndroidPackageKeyRegistration POST /v1/{name=developerAccounts/*/androidPackages/*/keys/*}:justifyAndroidPackageKeyRegistration registrationJustificationRequired-এর মান true হলে, অতিরিক্ত যুক্তিযুক্ত প্রসঙ্গ জমা দেয় এবং পর্যালোচনার জন্য যাচাই করা 'কী' জমা দেয়।

সমস্যা ম্যানেজ করা

API অনুরোধ ব্যর্থ হলে, Android Developer Console API একটি HTTP 4xx বা 5xx স্ট্যাটাস কোড এবং একটি স্ট্যান্ডার্ড google.rpc.Status JSON ত্রুটি বডি ফেরত দেয়:

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

HTTP স্ট্যাটাস কোড ও সাধারণ সমাধান

HTTP কোড gRPC স্ট্যাটাস সাধারণ কারণ রেজোলিউশন
400 Bad Request INVALID_ARGUMENT জাভা-স্টাইল 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 বিয়ারার অ্যাক্সেস টোকেন নেই, মেয়াদ শেষ হয়ে গেছে বা ভুল অথবা API কী বা পরিষেবা অ্যাকাউন্ট ব্যবহার করে যাচাই করার চেষ্টা করা হয়েছে। https://www.googleapis.com/auth/androiddeveloperconsole স্কোপ সহ নতুন ব্যবহারকারী-প্রতিনিধি OAuth 2.0 Bearer অ্যাক্সেস টোকেন পান।
403 Forbidden PERMISSION_DENIED যাচাইকৃত ব্যবহারকারীর কাছে টার্গেট DeveloperAccount বা AndroidPackage-এর অনুমতি নেই অথবা Google Cloud প্রোজেক্টে Android Developer Console API চালু করা নেই। ListDeveloperAccounts ব্যবহার করে অ্যাকাউন্ট মেম্বারশিপ যাচাই করুন এবং Google Cloud 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 সাময়িক ব্যাকএন্ড সমস্যা বা সাময়িকভাবে পরিষেবা উপলভ্য না থাকা। ট্রাঙ্কেট করা এক্সপোনেনশিয়াল ব্যাকঅফ সহ আইডেমপোটেন্ট অনুরোধ আবার চেষ্টা করুন।

HTTP অনুরোধ ও উত্তরের উদাহরণ

ACCESS_TOKEN, 1234567890, com.example.myapp এবং 60e860e8...-এর মতো প্লেসহোল্ডার ভ্যালু আপনার নিজস্ব ভ্যালু দিয়ে পরিবর্তন করুন।

১. GetDeveloperAccount

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890"

উত্তর:

{
  "name": "developerAccounts/1234567890",
  "displayName": "Example Developer",
  "verificationState": "VERIFIED"
}

২. ListDeveloperAccounts

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts"

উত্তর:

{
  "developerAccounts": [
    {
      "name": "developerAccounts/1234567890",
      "displayName": "Example Developer",
      "verificationState": "VERIFIED"
    }
  ]
}

৩. 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"
}

৪. 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
}

৫. 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
}

৬. 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": ""
}

৭. 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"
}

৮. 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"
}

৯. 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": ""
}

১০. 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 বা CI/CD-এর জন্য সাজেস্ট করা হয়)

ধাপ ১: আবার চালু করা যায় এমন আপলোড সেশন শুরু করুন এবং ফেরত আসা 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"
  }'

ধাপ ২: UPLOAD_SESSION_URI-এ সাইন করা APK বাইনারি আপলোড করুন এবং সেশন চূড়ান্ত করুন:

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"
}

১১. 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
}

অতিরিক্ত রিসোর্স