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
- 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 (
INDIVIDUALhoặcORGANIZATION) trong Android Developer Console đểverificationStatelàVERIFIED. - Bật API và xác thực: Bật
androiddeveloperconsole.googleapis.comtrong 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 vihttps://www.googleapis.com/auth/androiddeveloperconsole. - 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ấtdeveloperAccounts/{developer_account}và xác minhverificationStatelàVERIFIED. - 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 trakeySelectionStrategy(SELECT_KEY_FROM_LISThoặcUSE_ANY_KEY) và mọi khoá ký đã biết trong nhật ký (knownKeys). - 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áiDRAFT). - Đă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ộtverificationTokenduy 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ộtDeveloperAccount). 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ếnGetAndroidPackagevàGetAndroidPackageKey.
- Tạo và tải APK xác minh lên (nếu trạng thái là
DRAFT): Nhúng chuỗiverificationTokenđược trả về vàoassets/adi-registration.propertiesbên trong một APK tối thiểu khớp vớipackageName, ký APK đó bằng khoá ký ứng dụng riêng tư của bạn rồi tải APK đó lên bằngPOST /upload/v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:verify(VerifyAndroidPackageKeyOwnership). - 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_VERIFIEDvàregistrationJustificationRequiredlàtrue, hãy gọiPOST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:justifyAndroidPackageKeyRegistration(JustifyAndroidPackageKeyRegistration). Thăm dòGetAndroidPackagevàGetAndroidPackageKeycho đến khistateđạtREGISTERED.
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-aliasXá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.apkKiể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 (
aapt2và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
- Đăng ký tên gói bằng API Android Developer Console
- Kiểm tra trạng thái đăng ký ứng dụng bằng Android Developer ID Status API
- Đăng ký trên Android Developer Console
- Đăng ký trên Google Play Console