Android Developer Console API

Android Developer Console API là một dịch vụ RESTful cho phép các nhà phát triển đã xác minh tự động hoá quy trình xác minh nhà phát triển Android trong Android Developer Console, bao gồm cả việc truy xuất tài khoản nhà phát triển, kiểm tra các yêu cầu chính về điều kiện, đăng ký tên gói Android, đăng ký khoá ký ứng dụng và xác minh quyền sở hữu khoá.

Tổng quan, trường hợp sử dụng và bối cảnh triển khai

Các trường hợp sử dụng và tính năng chính

  • Đăng ký tên gói CI/CD tự động: Đăng ký hàng chục hoặc hàng trăm tên gói Android theo phương thức lập trình (CreateAndroidPackage).
  • Kiểm tra chính sách khoá trước khi phát hành: Kiểm tra theo phương thức lập trình xem Google có từng ghi nhận tên gói trong hệ sinh thái hay không và liệu việc đăng ký một chứng chỉ ký cụ thể có yêu cầu xác minh quyền sở hữu khoá hay không (GetAndroidPackageRegistrationPolicy).
  • Tự động đăng ký khoá ký ứng dụng và xác minh quyền sở hữu: Đăng ký vân tay số SHA-256 của chứng chỉ ký công khai (CreateAndroidPackageKey), truy xuất mã xác minh thử thách duy nhất (verificationToken) và tự động hoá quy trình chứng minh quyền sở hữu khoá riêng tư bằng cách sử dụng tính năng tải tệp APK đã ký lên theo yêu cầu duy nhất hoặc có thể tiếp tục (VerifyAndroidPackageKeyOwnership).
  • Gửi lý do theo phương thức có lập trình: Gửi lý do chứng minh quyền sở hữu (JustifyAndroidPackageKeyRegistration).
  • Theo dõi trạng thái: Theo dõi trạng thái đăng ký trên các tài khoản nhà phát triển, tên gói và khoá ký ứng dụng (GetDeveloperAccount, ListDeveloperAccounts, GetAndroidPackage, ListAndroidPackages, GetAndroidPackageKey, ListAndroidPackageKeys).

Quy trình triển khai toàn diện

  1. Xác minh danh tính nhà phát triển một lần trong giao diện người dùng: Hoàn tất quy trình xác minh danh tính nhà phát triển (INDIVIDUAL hoặc ORGANIZATION) trong Android Developer Console để verificationState là VERIFIED.
  2. Bật API và xác thực: Bật androiddeveloperconsole.googleapis.com trong dự án trên đám mây của Google Cloud và lấy mã truy cập Bearer OAuth 2.0 do người dùng uỷ quyền có phạm vi https://www.googleapis.com/auth/androiddeveloperconsole.
  3. Tìm tên tài nguyên của tài khoản nhà phát triển: Gọi GET /v1/developerAccounts (ListDeveloperAccounts) để truy xuất developerAccounts/{developer_account} và xác minh verificationState là VERIFIED.
  4. Kiểm tra chính sách đăng ký cho tên gói: Gọi GET /v1/developerAccounts/{id}/androidPackages/{pkg}/registrationPolicy (GetAndroidPackageRegistrationPolicy) để kiểm tra keySelectionStrategy (SELECT_KEY_FROM_LIST hoặc USE_ANY_KEY) và mọi khoá ký đã biết trong nhật ký (knownKeys).
  5. Tạo tài nguyên gói Android: Gọi POST /v1/developerAccounts/{id}/androidPackages?androidPackageId={pkg} (CreateAndroidPackage) với nội dung {"name": ""} (tạo tài nguyên ở trạng thái DRAFT).
  6. Đăng ký vân tay số của khoá ký ứng dụng: Gọi POST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys (CreateAndroidPackageKey) bằng nội dung JSON {"certificateFingerprintSha256": "..."}. Kiểm tra trạng thái được trả về:
    • DRAFT: Bạn phải cung cấp bằng chứng về quyền sở hữu khoá riêng tư và phản hồi sẽ bao gồm một verificationToken duy nhất cho Bước 7.
    • IN_REVIEW: Bằng chứng chứng minh quyền sở hữu và lý do sẽ tự động được bỏ qua (ví dụ: khi đăng ký tên gói mới chưa từng xuất hiện trên Android hoặc khi bạn đã xác minh quyền sở hữu khoá ký này cho một tên gói khác trong cùng một DeveloperAccount). Bỏ qua Bước 7 và lệnh gọi lý do ở Bước 8, rồi chuyển thẳng đến lệnh gọi thăm dò ý kiến GetAndroidPackage và GetAndroidPackageKey.
  7. Tạo và tải APK xác minh lên (nếu trạng thái là DRAFT): Nhúng chuỗi verificationToken được trả về vào assets/adi-registration.properties bên trong một APK tối thiểu khớp với packageName, ký APK đó bằng khoá ký ứng dụng riêng tư của bạn rồi tải APK đó lên bằng POST /upload/v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:verify (VerifyAndroidPackageKeyOwnership).
  8. Gửi lý do (nếu cần) và thăm dò trạng thái đăng ký: Nếu khoá ở trạng thái OWNERSHIP_VERIFIED và registrationJustificationRequired là true, hãy gọi POST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:justifyAndroidPackageKeyRegistration (JustifyAndroidPackageKeyRegistration). Thăm dò GetAndroidPackage và GetAndroidPackageKey cho đến khi state đạt REGISTERED.

Các lệnh CLI cục bộ để chuẩn bị dấu vân tay khoá và APK xác minh

  • Trích xuất dấu vân tay chứng chỉ SHA-256 từ kho khoá (keytool):

    keytool -list -v -keystore release-key.jks -alias my-key-alias
  • Xác minh chuỗi đại diện chứng chỉ ký SHA-256 trên một tệp APK đã tạo (apksigner):

    apksigner verify --print-certs app-release.apk
  • Kiểm tra tên gói APK và tệp mã thông báo được nhúng trước khi tải lên (aapt2 và unzip):

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

Giao diện người dùng và các chức năng API của Android Developer Console

Nhiệm vụ Giao diện người dùng web của Android Developer Console (android.google.com/developerconsole) Android Developer Console API
Xác minh danh tính nhà phát triển (KYC/KYB) và thanh toán phí Được hỗ trợ (bắt buộc phải có điều kiện tiên quyết một lần) Không được hỗ trợ khi sử dụng API (kiểm tra trạng thái chỉ đọc bằng GetDeveloperAccount và ListDeveloperAccounts)
Xem các tài khoản nhà phát triển được liên kết Trình chuyển đổi tài khoản trong tiêu đề của bảng điều khiển GET /v1/developerAccounts (ListDeveloperAccounts)
Kiểm tra khoá ký trước đây và chính sách cho một tên gói Hiển thị trong trình hướng dẫn "Đăng ký tên gói" GET /v1/.../registrationPolicy (GetAndroidPackageRegistrationPolicy)
Đăng ký tên gói Android mới Tên gói > Đăng ký tên gói POST /v1/{parent}/androidPackages?androidPackageId=... (CreateAndroidPackage)
Xem hoặc liệt kê tên gói đã đăng ký và tên gói nháp Bảng Tên gói trên trang tổng quan GET /v1/{name} (GetAndroidPackage), GET /v1/{parent}/androidPackages (ListAndroidPackages)
Thêm khoá ký ứng dụng và tạo mã xác thực Thông tin chi tiết về gói > Thêm khoá ký POST /v1/{parent}/keys (CreateAndroidPackageKey)
Chứng minh quyền sở hữu khoá riêng tư (adi-registration.properties) Tải tệp APK đoạn mã đã ký lên giao diện người dùng của Play Console POST /upload/v1/{name}:verify (VerifyAndroidPackageKeyOwnership)
Gửi lý do khi khoá cần được xem xét thủ công Câu lệnh văn bản trong quy trình đăng ký khoá POST /v1/{name}:justifyAndroidPackageKeyRegistration (JustifyAndroidPackageKeyRegistration)

Cấu hình và xác thực dịch vụ

Tất cả yêu cầu API đều phải sử dụng HTTPS và bao gồm một tiêu đề Authorization: Bearer ACCESS_TOKEN có được bằng cách sử dụng quy trình Máy chủ web OAuth 2.0 cho một Tài khoản Google đã hoàn tất quy trình xác minh danh tính nhà phát triển trong Android Developer Console.

Thuộc tính Giá trị
Điểm cuối REST cơ sở https://androiddeveloperconsole.googleapis.com
Điểm cuối tải nội dung nghe nhìn lên https://androiddeveloperconsole.googleapis.com/upload
Phiên bản API v1
Phạm vi OAuth 2.0 bắt buộc https://www.googleapis.com/auth/androiddeveloperconsole
Hạn mức mặc định 2,000 yêu cầu mỗi ngày cho mỗi dự án trên đám mây cho mỗi phương thức

Tài nguyên và điểm cuối API

Android Developer Console API sắp xếp tài nguyên theo hệ phân cấp sau:

  • 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})

Tài nguyên: DeveloperAccount

Đại diện cho một tài khoản trong Android Developer Console được liên kết với danh tính của nhà phát triển.

Trường Loại Mô tả
name string Giá trị nhận dạng. Tên tài nguyên ở định dạng developerAccounts/{developer_account}.
displayName string Chỉ có đầu ra. Tên mà con người có thể đọc được, liên kết với tài khoản nhà phát triển (tên cá nhân hoặc tên tổ chức).
verificationState enum (VerificationState) Chỉ có đầu ra. Trạng thái xác minh danh tính nhà phát triển hiện tại của tài khoản.

Enum: DeveloperAccount.VerificationState

Giá trị Mô tả
VERIFIED Đã hoàn tất quy trình xác minh danh tính nhà phát triển. Tài khoản này có thể đăng ký tên gói và khoá ký ứng dụng.
NOT_VERIFIED Quy trình xác minh danh tính nhà phát triển chưa hoàn tất trong Android Developer Console.

Phương thức: DeveloperAccount

Phương thức Yêu cầu HTTP Mô tả
GetDeveloperAccount GET /v1/{name=developerAccounts/*} Truy xuất siêu dữ liệu và trạng thái xác minh cho một DeveloperAccount.
ListDeveloperAccounts GET /v1/developerAccounts Liệt kê tất cả đối tượng DeveloperAccount mà Tài khoản Google đã xác thực có thể truy cập (không phân trang).

Tài nguyên: AndroidPackage

Đại diện cho tên gói Android đã đăng ký hoặc đang được đăng ký trong một DeveloperAccount.

Trường Loại Mô tả
name string Giá trị nhận dạng. Tên tài nguyên ở định dạng developerAccounts/{developer_account}/androidPackages/{android_package}, trong đó {android_package} là tên gói Android (ví dụ: com.example.myapp).
packageName string Chỉ có đầu ra. Tên gói Android (ví dụ: com.example.myapp).
state enum (AndroidPackage.State) Chỉ có đầu ra. Trạng thái vòng đời đăng ký hiện tại của tên gói.
registeredAppStore boolean Chỉ có đầu ra. Cho biết liệu tên gói này hiện có đang hoạt động dưới dạng cửa hàng ứng dụng đã đăng ký hay không.

Enum: AndroidPackage.State

Giá trị Mô tả
DRAFT Tài nguyên tên gói đã được tạo và quá trình đăng ký khoá ký ứng dụng hoặc xác minh quyền sở hữu vẫn đang diễn ra.
IN_REVIEW Yêu cầu đăng ký tên gói và mọi lý do cần thiết về khoá đã được gửi và đang được Google xem xét. Một gói chuyển từ trạng thái DRAFT sang IN_REVIEW ngay sau khi CreateAndroidPackageKey (khi bỏ qua quy trình xác minh quyền sở hữu khoá, bao gồm cả khi khoá đã được xác minh cho một tên gói khác trong cùng một DeveloperAccount) hoặc sau khi hoàn tất VerifyAndroidPackageKeyOwnership và JustifyAndroidPackageKeyRegistration (nếu cần).
REGISTERED Tên gói này đã được đăng ký cho tài khoản nhà phát triển này để xác minh nhà phát triển Android.
PENDING_TRANSFER Tên gói này đang chờ hoàn tất quy trình chuyển quyền sở hữu sang một tài khoản nhà phát triển khác.

Tài nguyên: AndroidPackageRegistrationPolicy

Tài nguyên đơn lẻ do GetAndroidPackageRegistrationPolicy trả về, mô tả các khoá ký công khai trước đây được phát hiện cho một tên gói và liệu việc đăng ký tên gói bằng một khoá ký nhất định có cần phải có lý do bằng văn bản hay không.

Trường Loại Mô tả
name string Giá trị nhận dạng. Tên tài nguyên ở định dạng developerAccounts/{developer_account}/androidPackages/{android_package}/registrationPolicy.
knownKeys[] object (KnownKey) Danh sách các khoá ký ứng dụng trước đây từng được ghi nhận là dùng để phân phối ứng dụng có tên gói này, được sắp xếp theo thứ tự bảng chữ cái theo certificateFingerprintSha256.
knownKeys[].certificateFingerprintSha256 string Chỉ có đầu ra. Dấu vân tay SHA-256 hệ thập lục phân gồm 64 ký tự viết thường, đã chuẩn hoá của chứng chỉ ký trước đây (không có dấu hai chấm).
knownKeys[].justificationRequirement enum (JustificationRequirement) Chỉ có đầu ra. Cho biết liệu việc đăng ký khoá này có yêu cầu gọi JustifyAndroidPackageKeyRegistration (REQUIRED hoặc NOT_REQUIRED) hay không. Nếu khoá ký đã được xác minh trước đó trên một tên gói khác trong cùng một DeveloperAccount, thì cả VerifyAndroidPackageKeyOwnership và JustifyAndroidPackageKeyRegistration đều bị bỏ qua ngay cả khi justificationRequirement là REQUIRED.
keySelectionStrategy enum (KeySelectionStrategy) Chỉ có đầu ra. Chính sách chọn khoá để đăng ký tên gói này: SELECT_KEY_FROM_LIST (phải đăng ký một khoá từ knownKeys) hoặc USE_ANY_KEY (có thể đăng ký bất kỳ khoá ký ứng dụng hợp lệ nào thuộc sở hữu của nhà phát triển).

Enum: KnownKey.JustificationRequirement

Giá trị Mô tả
REQUIRED Để đăng ký khoá đã biết này, bạn cần gửi văn bản giải trình bằng JustifyAndroidPackageKeyRegistration sau khi hoàn tất VerifyAndroidPackageKeyOwnership (trừ phi khoá này đã được xác minh trước đó trên một tên gói khác trong cùng một DeveloperAccount, trong trường hợp đó, cả VerifyAndroidPackageKeyOwnership và JustifyAndroidPackageKeyRegistration đều được bỏ qua).
NOT_REQUIRED Bạn không cần đưa ra lý do khi đăng ký khoá đã biết này. Khoá này sẽ chuyển trực tiếp sang IN_REVIEW sau VerifyAndroidPackageKeyOwnership (hoặc ngay sau CreateAndroidPackageKey nếu khoá này đã được xác minh trước đó trên một tên gói khác trong cùng một DeveloperAccount).

Enum: AndroidPackageRegistrationPolicy.KeySelectionStrategy

Giá trị Mô tả
SELECT_KEY_FROM_LIST Phương thức gọi phải đăng ký một trong các khoá trước đây được liệt kê trong knownKeys.
USE_ANY_KEY Ngoài mọi khoá trong knownKeys, phương thức gọi có thể đăng ký mọi khoá ký ứng dụng hợp lệ chưa từng thấy trong hệ sinh thái Android.

Phương thức: AndroidPackage

Phương thức Yêu cầu HTTP Mô tả
GetAndroidPackageRegistrationPolicy GET /v1/{name=developerAccounts/*/androidPackages/*/registrationPolicy} Truy xuất chiến lược chọn khoá và khoá ký đã biết trong quá khứ cho một tên gói.
CreateAndroidPackage POST /v1/{parent=developerAccounts/*}/androidPackages?androidPackageId={package_name} Tạo tài nguyên AndroidPackage mới ở trạng thái DRAFT để bắt đầu đăng ký tên gói.
GetAndroidPackage GET /v1/{name=developerAccounts/*/androidPackages/*} Truy xuất thông tin chi tiết và trạng thái đăng ký hiện tại của một AndroidPackage hiện có.
ListAndroidPackages GET /v1/{parent=developerAccounts/*}/androidPackages Liệt kê các đối tượng AndroidPackage trong DeveloperAccount (pageSize tối đa 1000, pageToken).

Tài nguyên: AndroidPackageKey

Đại diện cho dấu vân tay chứng chỉ ký ứng dụng công khai liên kết với một AndroidPackage, đồng thời theo dõi trạng thái xem xét việc đăng ký và xác minh quyền sở hữu.

Trường Loại Mô tả
name string Giá trị nhận dạng. Tên tài nguyên do máy chủ chỉ định ở định dạng developerAccounts/{developer_account}/androidPackages/{android_package}/keys/{key}, trong đó {key} là dấu vân tay SHA-256 thập lục phân viết thường gồm 64 ký tự được chuẩn hoá và không có dấu hai chấm. Phải bỏ qua hoặc để trống khi gọi CreateAndroidPackageKey.
certificateFingerprintSha256 string Bắt buộc. Không thể thay đổi. Hàm băm SHA-256 của chứng chỉ ký ứng dụng. Khi nhập vào CreateAndroidPackageKey, chấp nhận hệ thập lục phân 64 ký tự thuần tuý (60e860e8...) hoặc hệ thập lục phân được phân tách bằng dấu hai chấm (60:E8:60:E8:...). Khi xuất, luôn được chuẩn hoá thành hệ thập lục phân viết thường 64 ký tự không có dấu hai chấm.
state enum (AndroidPackageKey.State) Chỉ có đầu ra. Trạng thái hiện tại của vòng đời xác minh và đăng ký của khoá.
verificationToken string Chỉ có đầu ra. Mã xác thực duy nhất do Google tạo. Chỉ dùng khi trạng thái là DRAFT (có thể bỏ qua khi CreateAndroidPackageKey chuyển khoá trực tiếp sang IN_REVIEW). Khi trạng thái là DRAFT, hãy nhúng chuỗi này vào bên trong assets/adi-registration.properties trong một tệp APK đã ký để hoàn tất VerifyAndroidPackageKeyOwnership.
registrationJustificationRequired boolean Chỉ có đầu ra. Nếu true và khoá ở trạng thái OWNERSHIP_VERIFIED, bạn phải gửi văn bản giải trình bằng JustifyAndroidPackageKeyRegistration trước khi tiến hành đăng ký IN_REVIEW. Nếu CreateAndroidPackageKey chuyển trực tiếp khoá sang IN_REVIEW (vì khoá này đã được xác minh trước đó trên một tên gói khác trong cùng một DeveloperAccount), thì lý do sẽ bị bỏ qua.

Enum: AndroidPackageKey.State

Giá trị Mô tả
DRAFT Tài nguyên khoá đã được tạo và bạn vẫn cần chứng minh quyền sở hữu khoá riêng tư bằng cách tải tệp APK đã ký lên (VerifyAndroidPackageKeyOwnership) vì quyền sở hữu khoá này chưa được xác minh trên bất kỳ tên gói nào trong DeveloperAccount này.
OWNERSHIP_VERIFIED Quyền sở hữu khoá riêng tư đã được xác minh bằng cách tải tệp APK đã ký lên. Nếu registrationJustificationRequired là true, bạn vẫn cần đưa ra lý do trước khi bắt đầu xem xét.
IN_REVIEW Google đang xem xét thông tin đăng ký khoá. Khoá sẽ chuyển sang trạng thái này ngay sau khi CreateAndroidPackageKey khi không cần bằng chứng về quyền sở hữu (ví dụ: trên một tên gói mới chưa từng xuất hiện trên Android hoặc khi khoá đã được xác minh trước đó trên một tên gói khác trong cùng một DeveloperAccount, cũng bỏ qua JustifyAndroidPackageKeyRegistration), ngay sau VerifyAndroidPackageKeyOwnership (nếu registrationJustificationRequired là false) hoặc sau JustifyAndroidPackageKeyRegistration (nếu registrationJustificationRequired là true).
REGISTERED Khoá ký ứng dụng đã được đăng ký cho tên gói này trong quy trình xác minh nhà phát triển Android.
PENDING_TRANSFER Quá trình đăng ký khoá ký ứng dụng đang chờ hoàn tất một lượt chuyển.

Phương thức: AndroidPackageKey

Phương thức Yêu cầu HTTP Mô tả
CreateAndroidPackageKey POST /v1/{parent=developerAccounts/*/androidPackages/*}/keys Đăng ký dấu vân tay chứng chỉ SHA-256 mới để ký ứng dụng trong một AndroidPackage. Trả về khoá ở trạng thái DRAFT (khi cần có bằng chứng chứng minh quyền sở hữu bằng VerifyAndroidPackageKeyOwnership) hoặc trực tiếp ở trạng thái IN_REVIEW (khi bỏ qua bước xác minh quyền sở hữu, chẳng hạn như đối với một tên gói mới chưa từng xuất hiện trên Android hoặc một khoá đã được xác minh trên một tên gói khác trong cùng một DeveloperAccount).
GetAndroidPackageKey GET /v1/{name=developerAccounts/*/androidPackages/*/keys/*} Truy xuất trạng thái, vân tay số và siêu dữ liệu xác minh của một AndroidPackageKey cụ thể.
ListAndroidPackageKeys GET /v1/{parent=developerAccounts/*/androidPackages/*}/keys Liệt kê tất cả đối tượng AndroidPackageKey đã đăng ký trong một AndroidPackage (pageSize tối đa 1000, pageToken).
VerifyAndroidPackageKeyOwnership POST /upload/v1/{name=developerAccounts/*/androidPackages/*/keys/*}:verify Tải một tệp APK tối giản đã ký chứa verificationToken trong assets/adi-registration.properties lên để xác minh quyền sở hữu khoá riêng tư và gửi các khoá đã sẵn sàng để xem xét.
JustifyAndroidPackageKeyRegistration POST /v1/{name=developerAccounts/*/androidPackages/*/keys/*}:justifyAndroidPackageKeyRegistration Gửi thêm bối cảnh giải thích khi registrationJustificationRequired là true và gửi các khoá đã xác minh để xem xét.

Xử lý lỗi

Khi một yêu cầu API không thành công, Android Developer Console API sẽ trả về mã trạng thái HTTP 4xx hoặc 5xx và nội dung lỗi JSON google.rpc.Status chuẩn:

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

Mã trạng thái HTTP và cách giải quyết phổ biến

Mã HTTP Trạng thái gRPC Nguyên nhân thường gặp Độ phân giải
400 Bad Request INVALID_ARGUMENT Thiếu hoặc không hợp lệ androidPackageId kiểu Java; định dạng certificateFingerprintSha256 không hợp lệ; trường name không trống trên CreateAndroidPackage hoặc CreateAndroidPackageKey; APK đã tải lên chưa được ký, bị hỏng, thiếu assets/adi-registration.properties, thiếu verificationToken phù hợp hoặc được ký bằng chứng chỉ không khớp. Xác thực định dạng yêu cầu theo giản đồ tài nguyên, bỏ qua hoặc để trống name trong lệnh gọi tạo, đồng thời xác minh chữ ký APK và mã thông báo được nhúng bằng apksigner verify --print-certs và unzip -p app-release.apk assets/adi-registration.properties trước khi tải lên.
400 Bad Request FAILED_PRECONDITION DeveloperAccount có verificationState: NOT_VERIFIED; lựa chọn khoá vi phạm AndroidPackageRegistrationPolicy (SELECT_KEY_FROM_LIST); gọi VerifyAndroidPackageKeyOwnership hoặc JustifyAndroidPackageKeyRegistration ở trạng thái không đủ điều kiện. Hoàn tất quy trình xác minh danh tính nhà phát triển trong Android Developer Console, kiểm tra GetAndroidPackageRegistrationPolicy trước, rồi kiểm tra state hiện tại của tài nguyên.
401 Unauthorized UNAUTHENTICATED Mã truy cập Bearer OAuth 2.0 bị thiếu, hết hạn hoặc không hợp lệ, hoặc cố gắng xác thực bằng khoá API hoặc tài khoản dịch vụ. Lấy mã truy cập Bearer OAuth 2.0 mới do người dùng uỷ quyền có phạm vi https://www.googleapis.com/auth/androiddeveloperconsole.
403 Forbidden PERMISSION_DENIED Người dùng đã xác thực không có quyền đối với DeveloperAccount hoặc AndroidPackage mục tiêu, hoặc Android Developer Console API chưa được bật trên dự án trên đám mây của Google. Xác minh tư cách thành viên tài khoản bằng ListDeveloperAccounts và đảm bảo androiddeveloperconsole.googleapis.com được bật trong Google Cloud Console.
404 Not Found NOT_FOUND Đường dẫn tài nguyên DeveloperAccount, AndroidPackage hoặc AndroidPackageKey được chỉ định không tồn tại. Xác nhận đường dẫn tài nguyên bằng ListDeveloperAccounts, ListAndroidPackages hoặc ListAndroidPackageKeys. Đảm bảo mã nhận dạng {key} sử dụng hệ thập lục phân viết thường không có dấu hai chấm.
409 Conflict ALREADY_EXISTS Tên gói hoặc dấu vân tay chứng chỉ SHA-256 đã được đăng ký trong tài khoản nhà phát triển này hoặc tài khoản nhà phát triển khác. Kiểm tra các thông tin đăng ký hiện có bằng GetAndroidPackage hoặc GetAndroidPackageKey, hoặc kiểm tra quyền sở hữu trước đây bằng GetAndroidPackageRegistrationPolicy.
429 Too Many Requests RESOURCE_EXHAUSTED Đã vượt quá hạn mức theo phương thức là 2,000 yêu cầu mỗi ngày cho mỗi dự án trên đám mây của Google Cloud. Triển khai thuật toán thời gian đợi tăng dần có độ trễ và tránh các vòng lặp thăm dò tần suất cao.
500/503 INTERNAL/UNAVAILABLE Lỗi tạm thời ở phần phụ trợ hoặc dịch vụ tạm thời không hoạt động. Thử lại các yêu cầu idempotent bằng thuật toán thời gian đợi luỹ thừa bị cắt bớt.

Ví dụ về yêu cầu và phản hồi HTTP

Thay thế các giá trị phần giữ chỗ như ACCESS_TOKEN, 1234567890, com.example.myapp và 60e860e8... bằng giá trị của riêng bạn.

1. GetDeveloperAccount

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

Câu trả lời:

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

2. ListDeveloperAccounts

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

Câu trả lời:

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

Câu trả lời:

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

Câu trả lời:

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

Câu trả lời:

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

Câu trả lời:

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

Câu trả lời:

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

Câu trả lời:

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

Câu trả lời:

{
  "androidPackageKeys": [
    {
      "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
      "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
      "state": "REGISTERED"
    }
  ],
  "nextPageToken": ""
}

10. VerifyAndroidPackageKeyOwnership

Cách A: Tải nội dung nghe nhìn lên bằng một yêu cầu duy nhất

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"

Cách B: Giao thức tải lên có thể tiếp tục (nên dùng cho các tệp APK lớn hoặc CI/CD)

Bước 1: Bắt đầu phiên tải lên có thể tiếp tục và trích xuất tiêu đề X-Goog-Upload-URL được trả về:

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

Bước 2: Tải tệp nhị phân APK đã ký lên UPLOAD_SESSION_URI và hoàn tất phiê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"

Câu trả lời:

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

Câu trả lời:

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "state": "IN_REVIEW",
  "registrationJustificationRequired": true
}

Tài nguyên khác