Android Developer Roadmap: Tạo và Ký Ứng dụng Android cho Phiên bản Phát hành (APK/AAB)

Chào mừng các bạn quay trở lại với series “Android Developer Roadmap”! Chúng ta đã cùng nhau đi qua rất nhiều chặng đường quan trọng, từ việc thiết lập môi trường phát triển, học Kotlin, tạo ứng dụng đầu tiên, viết kiểm thử, đến phân phối thử nghiệm. Giờ đây, chúng ta đang tiến gần hơn đến bước cuối cùng: đưa ứng dụng của mình đến tay người dùng trên Google Play Store.

Trước khi làm được điều đó, có một bước cực kỳ quan trọng mà mọi nhà phát triển Android phải thực hiện: tạo ra một phiên bản phát hành (release build) của ứng dụng và ký (sign) nó. Bước này không chỉ đơn thuần là đóng gói ứng dụng, mà còn là việc thiết lập “dấu vân tay” kỹ thuật số độc đáo, đảm bảo tính toàn vẹn và nguồn gốc của ứng dụng. Trong bài viết chuyên sâu này, chúng ta sẽ khám phá tại sao việc ký ứng dụng lại quan trọng, cách tạo Keystore (khoá ký), cấu hình quy trình ký trong Gradle, và cuối cùng là tạo ra tệp tin APK hoặc AAB sẵn sàng cho production.

Tại Sao Cần Phiên Bản Phát hành (Release Build) và Việc Ký Ứng dụng?

Trong quá trình phát triển, chúng ta thường làm việc với các bản dựng “debug”. Bản dựng này có những đặc điểm phục vụ cho việc gỡ lỗi (debugging), chẳng hạn như kích hoạt logging chi tiết, cho phép kết nối debugger, và thường không được tối ưu hoá về hiệu suất hoặc kích thước. Quan trọng hơn, các bản dựng debug được ký bằng một debug key được tạo tự động bởi Android SDK, key này giống nhau trên tất cả các máy tính và chỉ dùng cho mục đích phát triển.

Ngược lại, phiên bản phát hành (release build) được tối ưu hoá cho người dùng cuối. Nó thường được nén mã nguồn (code shrinking), tài nguyên (resource shrinking), và làm rối mã (obfuscation) bằng các công cụ như R8/ProGuard để giảm kích thước và bảo vệ mã nguồn ở mức cơ bản. Nhưng điểm khác biệt cốt lõi và quan trọng nhất chính là việc nó PHẢI được ký bằng một private key (khoá riêng) mà chỉ bạn sở hữu.

Việc ký ứng dụng mang lại nhiều lợi ích then chốt:

  1. Tính toàn vẹn (Integrity): Chữ ký kỹ thuật số đảm bảo rằng tệp tin ứng dụng (APK hoặc AAB) không bị thay đổi hoặc làm giả sau khi được tạo ra bởi nhà phát triển. Nếu bất kỳ bit nào trong tệp tin bị thay đổi (dù vô tình hay cố ý), chữ ký sẽ không còn hợp lệ, và hệ thống Android sẽ từ chối cài đặt hoặc cập nhật ứng dụng.
  2. Nhận dạng (Identity): Chữ ký xác định danh tính của nhà phát triển ứng dụng. Mặc dù không nhất thiết phải liên kết trực tiếp với tên thật của bạn, chữ ký đóng vai trò như một “dấu vân tay” duy nhất.
  3. Cập nhật liền mạch (Seamless Updates): Đây là vai trò quan trọng nhất. Để hệ thống Android cho phép cài đặt hoặc cập nhật một phiên bản mới của ứng dụng, phiên bản mới đó PHẢI được ký bằng CÙNG một khoá ký với phiên bản đã được cài đặt trên thiết bị. Điều này ngăn chặn kẻ xấu giả mạo ứng dụng của bạn và phân phối các bản cập nhật độc hại. Nếu bạn mất khoá ký, bạn sẽ không thể cập nhật ứng dụng hiện có trên Google Play Store nữa và buộc phải xuất bản một ứng dụng mới với Package Name khác.

Tóm lại, việc ký ứng dụng là một bước bắt buộc và không thể thiếu để đảm bảo an ninh, độ tin cậy, và khả năng duy trì (cập nhật) ứng dụng Android của bạn trong môi trường production.

Hiểu về Keystore và Khoá Ký (Signing Key)

Một khoá ký Android (Android Signing Key) bao gồm hai phần chính:

  1. Private Key (Khoá Riêng): Đây là phần bí mật, chỉ bạn sở hữu. Nó được sử dụng để tạo ra chữ ký cho tệp tin APK hoặc AAB của bạn.
  2. Certificate (Chứng chỉ): Đây là phần công khai. Nó chứa thông tin về “danh tính” của bạn (chẳng hạn như tên, tổ chức, quốc gia) và đi kèm với Private Key của bạn. Certificate được sử dụng để xác minh chữ ký được tạo ra bởi Private Key tương ứng.

Các cặp Private Key và Certificate này thường được lưu trữ trong một tệp tin gọi là **Keystore**. Keystore là một cơ sở dữ liệu được mã hoá, có thể chứa một hoặc nhiều cặp Private Key/Certificate, mỗi cặp được xác định bằng một **Alias** (bí danh) duy nhất.

Khi bạn ký ứng dụng, bạn chọn một Keystore, cung cấp mật khẩu cho Keystore đó, chọn một Alias trong Keystore, và cung cấp mật khẩu cho Alias (hoặc Key). Sau đó, Android SDK (thông qua các công cụ như apksigner hoặc jarsigner) sẽ sử dụng Private Key tương ứng để ký tệp tin ứng dụng.

LƯU Ý CỰC KỲ QUAN TRỌNG: Keystore của bạn và mật khẩu truy cập là tài sản quý giá nhất liên quan đến việc xuất bản ứng dụng của bạn. **Tuyệt đối KHÔNG làm mất Keystore**. **Tuyệt đối KHÔNG chia sẻ mật khẩu Keystore một cách công khai**. Hãy sao lưu Keystore của bạn ở một nơi an toàn (ví dụ: dịch vụ lưu trữ đám mây được mã hoá, USB drive vật lý). Nếu bạn mất Keystore, bạn sẽ không bao giờ có thể cập nhật ứng dụng đã xuất bản bằng khoá đó nữa.

Tạo Khoá Ký (Keystore) Bằng Android Studio

Cách phổ biến và đơn giản nhất để tạo Keystore cho người mới bắt đầu là sử dụng giao diện của Android Studio.

Bước 1: Bắt đầu quy trình tạo Signed Bundle/APK

Mở project Android của bạn trong Android Studio.
Trên thanh menu, chọn Build > Generate Signed Bundle / APK...

Build
  > Make Project
  > Rebuild Project
  > Clean Project
  > Build Bundles(s) / APK(s)
    > Build Bundle(s)
    > Build APK(s)
  > Generate Signed Bundle / APK...  <-- Chọn mục này

Bước 2: Chọn Loại Bundle

Một cửa sổ mới sẽ hiện ra hỏi bạn muốn tạo loại file nào. Bạn có thể chọn `Android App Bundle` (AAB) hoặc `APK`. Đối với việc xuất bản lên Google Play Store ngày nay, Google khuyến khích và yêu cầu sử dụng AAB vì nó giúp tối ưu kích thước ứng dụng cho từng thiết bị người dùng. Tuy nhiên, quá trình ký cho cả hai loại đều tương tự. Chúng ta sẽ đi qua các bước tạo Keystore, áp dụng cho cả hai. Chọn `APK` để minh hoạ việc tạo file trực tiếp, hoặc `Android App Bundle` nếu bạn nhắm đến Play Store. Nhấn `Next`.

Generate Signed Bundle or APK
--------------------------------
| Android App Bundle (recommended) |
| APK                              |  <-- Chọn APK hoặc AAB
--------------------------------
[Cancel] [Next]

Bước 3: Tạo Keystore mới

Trong cửa sổ tiếp theo, bạn sẽ được hỏi về Module và thông tin Keystore.
Nếu bạn chưa có Keystore, hãy chọn nút `Create new...`.

Generate Signed Bundle or APK
--------------------------------
Module: app
--------------------------------
Key store path: [Path to your existing keystore]  [... ] [Create new...] <-- Nhấn vào đây
Key store password: [*******]
Key alias: [Alias name]
Key password: [*******]
--------------------------------
Remember passwords
--------------------------------
[Cancel] [Next]

Bước 4: Điền thông tin Keystore và Key

Cửa sổ "New Key Store" sẽ xuất hiện. Đây là nơi bạn điền tất cả thông tin cần thiết:

  • Keystore path: Nhấn nút `...` và chọn vị trí lưu tệp tin Keystore trên máy tính của bạn. Tên tệp tin thường kết thúc bằng `.jks` (Java Key Store) hoặc `.keystore`. Ví dụ: /Users/yourname/Documents/my-release-key.jks. **Hãy chọn một vị trí an toàn và dễ nhớ, và sao lưu tệp tin này!**
  • Password: Mật khẩu cho Keystore. Hãy đặt một mật khẩu mạnh và **ghi nhớ hoặc lưu trữ nó ở nơi an toàn tuyệt đối**.
  • Confirm: Nhập lại mật khẩu Keystore để xác nhận.
  • Alias: Tên định danh cho cặp khoá (Private Key/Certificate) này bên trong Keystore. Bạn có thể có nhiều cặp khoá trong một Keystore, mỗi cặp có một Alias riêng. Đặt một tên dễ nhớ, ví dụ: `my_app_key`.
  • Password: Mật khẩu cho cặp khoá (Key) này. Có thể giống hoặc khác với mật khẩu Keystore. **Cũng cần ghi nhớ hoặc lưu trữ an toàn**.
  • Confirm: Nhập lại mật khẩu Key.
  • Validity (years): Thời hạn hiệu lực của Certificate (chứng chỉ). Google Play yêu cầu chứng chỉ phải có hiệu lực đến năm 2033 trở đi. Hãy đặt giá trị đủ lớn, ví dụ 25 năm (để có hiệu lực đến khoảng năm 2050).
  • Certificate: Phần thông tin công khai của chứng chỉ.
    • First and Last Name: Tên của bạn hoặc tổ chức.
    • Organizational Unit: Đơn vị tổ chức (ví dụ: phòng ban).
    • Organization: Tên công ty hoặc tổ chức của bạn.
    • City or Locality: Tên thành phố.
    • State or Province: Tên bang hoặc tỉnh.
    • Country Code (XX): Mã quốc gia gồm 2 chữ cái (ví dụ: VN cho Việt Nam, US cho Hoa Kỳ).

Sau khi điền đầy đủ thông tin (đảm bảo bạn đã ghi lại tất cả các mật khẩu!), nhấn `OK`.

New Key Store
--------------------------------
Keystore Path:      [Path you chose] [... ]
Password:           [*******]
Confirm:            [*******]

Key
Alias:              [Alias you chose]
Password:           [*******]
Confirm:            [*******]

Certificate
Validity (years):   [e.g., 25]
First and Last Name: [Your Name/Org Name]
Organizational Unit: [Your Unit]
Organization:       [Your Org]
City or Locality:   [Your City]
State or Province:  [Your State]
Country Code (XX):  [Your Country Code]
--------------------------------
[Cancel] [OK]

Bước 5: Hoàn tất việc chọn Keystore

Sau khi nhấn `OK` ở bước 4, bạn sẽ quay lại cửa sổ "Generate Signed Bundle or APK". Các trường thông tin Keystore giờ đây sẽ được điền sẵn với đường dẫn Keystore và Alias bạn vừa tạo. Hãy nhập mật khẩu Keystore và mật khẩu Key. Tích chọn "Remember passwords" nếu bạn muốn Android Studio lưu lại (chỉ nên làm trên máy tính cá nhân an toàn). Nhấn `Next`.

Cấu hình Gradle để Tự động Ký (Không bắt buộc nhưng nên làm)

Việc tạo Keystore bằng Android Studio chỉ mới là bước chuẩn bị. Bạn có thể sử dụng giao diện của Studio để tạo file APK/AAB đã ký mỗi lần. Tuy nhiên, để tự động hoá quy trình build (ví dụ: khi sử dụng command line hoặc tích hợp CI/CD), bạn nên cấu hình thông tin ký trong file `build.gradle` (module level).

**LƯU Ý QUAN TRỌNG VỀ BẢO MẬT:** **KHÔNG BAO GIỜ** đưa mật khẩu Keystore và Key trực tiếp vào file `build.gradle` của bạn, đặc biệt là khi bạn quản lý mã nguồn bằng Gitlưu trữ trên các dịch vụ như GitHub. Thay vào đó, hãy lưu trữ thông tin nhạy cảm này trong file `gradle.properties`.

Bước 1: Lưu thông tin ký vào `gradle.properties`

Mở file `gradle.properties` trong project của bạn (thường nằm ở thư mục gốc của project). Thêm các dòng sau (thay thế các giá trị bằng thông tin của bạn):


# Signing Config
RELEASE_STORE_FILE=/Users/yourname/Documents/my-release-key.jks
RELEASE_STORE_PASSWORD=your_keystore_password
RELEASE_KEY_ALIAS=my_app_key
RELEASE_KEY_PASSWORD=your_key_password

ĐẢM BẢO file `gradle.properties` này được thêm vào file `.gitignore` của project của bạn để tránh vô tình đưa thông tin nhạy cảm lên repository công khai hoặc dùng chung.

Bước 2: Cấu hình `signingConfigs` trong `build.gradle` (module level)

Mở file `build.gradle` của module ứng dụng (thường là `app/build.gradle`). Tìm block `android` và thêm block `signingConfigs` bên trong nó như sau:


android {
    // ... các cấu hình khác

    signingConfigs {
        release {
            storeFile file(System.getenv("RELEASE_STORE_FILE") ?: project.findProperty("RELEASE_STORE_FILE") as String)
            storePassword System.getenv("RELEASE_STORE_PASSWORD") ?: project.findProperty("RELEASE_STORE_PASSWORD") as String
            keyAlias System.getenv("RELEASE_KEY_ALIAS") ?: project.findProperty("RELEASE_KEY_ALIAS") as String
            keyPassword System.getenv("RELEASE_KEY_PASSWORD") ?: project.findProperty("RELEASE_KEY_PASSWORD") as String
        }
    }

    buildTypes {
        release {
            // ... các cấu hình khác cho bản release
            signingConfig signingConfigs.release // Áp dụng cấu hình ký cho bản release
        }
        debug {
            // ...
            signingConfig signingConfigs.debug // Bản debug dùng debug key mặc định
        }
    }

    // ...
}

Trong đoạn code trên:

  • Chúng ta định nghĩa một cấu hình ký tên là `release` bên trong block `signingConfigs`.
  • Đối với mỗi thông tin (đường dẫn file Keystore, mật khẩu Keystore, Alias, mật khẩu Key), chúng ta cố gắng đọc giá trị từ biến môi trường trước (`System.getenv(...)`). Nếu không tìm thấy, chúng ta mới đọc từ file `gradle.properties` (`project.findProperty(...)`). Cách này tăng cường bảo mật, cho phép bạn cung cấp mật khẩu thông qua biến môi trường trên các hệ thống CI/CD mà không cần lưu trong file.
  • Trong block `buildTypes`, chúng ta áp dụng cấu hình ký `signingConfigs.release` cho bản dựng `release`.

Sau khi thêm cấu hình này, hãy Sync Project với Gradle (`File` > `Sync Project with Gradle Files`). Giờ đây, khi bạn yêu cầu Gradle build bản `release`, nó sẽ tự động sử dụng Keystore và thông tin bạn đã cấu hình để ký file đầu ra.

Tạo File APK hoặc AAB đã Ký (Signed)

Bạn có thể tạo file đã ký bằng Android Studio hoặc bằng command line.

Cách 1: Sử dụng Android Studio (Tiếp theo Bước 5 của "Tạo Keystore")

Nếu bạn đã điền thông tin Keystore ở các bước trên và nhấn `Next`, bạn sẽ đến cửa sổ cuối cùng:

Generate Signed Bundle or APK
--------------------------------
Module: app
Key store path: [Path you chose]
Key alias: [Alias you chose]
--------------------------------
Build Types:
  [x] release   [ ] debug    <-- Chọn 'release'
Signature Versions:
  [x] V1 (Jar Signature)
  [x] V2 (Full APK Signature)
  [ ] V3 (APK Signature Scheme v3)
  [ ] V4 (APK Signature Scheme v4) <-- V2+ được khuyến khích. V3/V4 mới hơn, tương thích tốt hơn.
--------------------------------
Destination Folder: [Output path] [... ]
Build Variant:       release      [Edit]
--------------------------------
[Cancel] [Finish]
  • Module: Chọn module ứng dụng của bạn (thường là `app`).
  • Build Types: Chọn `release`.
  • Signature Versions: Bạn nên chọn cả `V1` và `V2` để đảm bảo khả năng tương thích tối đa với các phiên bản Android khác nhau. `V2` là scheme ký mới hơn, nhanh hơn và an toàn hơn `V1`. `V3` và `V4` là các scheme mới hơn nữa hỗ trợ xoay khoá (key rotation). Đối với các ứng dụng mới, hãy chọn V2+ hoặc tất cả các phiên bản có sẵn.
  • Destination Folder: Chọn thư mục nơi bạn muốn lưu tệp tin APK/AAB đã ký. Thường mặc định là thư mục `release` trong module ứng dụng của bạn (ví dụ: `app/release`).
  • Build Variant: Mặc định là `release`.

Nhấn `Finish`. Android Studio sẽ chạy quá trình build Gradle. Khi hoàn thành, bạn sẽ nhận được thông báo và có thể click vào "locate" để mở thư mục chứa tệp tin đã ký.

Cách 2: Sử dụng Gradle Command Line

Nếu bạn đã cấu hình `signingConfigs` trong `build.gradle` như hướng dẫn ở phần trước, bạn có thể build và ký ứng dụng bằng cách sử dụng Terminal hoặc Command Prompt.

Mở Terminal, điều hướng đến thư mục gốc của project Android của bạn.

* Để tạo **APK** đã ký:


    ./gradlew assembleRelease
    

(Trên Windows, dùng `gradlew assembleRelease`)

* Để tạo **Android App Bundle (AAB)** đã ký (đây là định dạng được Google Play khuyến khích):


    ./gradlew bundleRelease
    

(Trên Windows, dùng `gradlew bundleRelease`)

Gradle sẽ thực hiện toàn bộ quá trình build và ký bằng thông tin bạn đã cấu hình. File đầu ra sẽ nằm trong thư mục output mặc định của Gradle cho bản `release` (ví dụ: `app/build/outputs/apk/release/` cho APK hoặc `app/build/outputs/bundle/release/` cho AAB).

Sử dụng command line rất hữu ích cho việc tự động hóa và tích hợp với các hệ thống Continuous Integration/Continuous Delivery (CI/CD).

APK vs AAB: Định Dạng Nào Nên Sử Dụng?

Trước đây, APK là định dạng tiêu chuẩn để phân phối ứng dụng Android. Tuy nhiên, từ tháng 8 năm 2021, Google Play yêu cầu các ứng dụng mới phải sử dụng định dạng Android App Bundle (AAB).

Dưới đây là bảng so sánh cơ bản:

Đặc điểm APK (Android Package Kit) AAB (Android App Bundle)
Định dạng phân phối Truyền thống Hiện đại, khuyến khích bởi Google Play
Cơ chế tạo tệp tin Chứa tất cả tài nguyên và mã nguồn cho mọi kiến trúc thiết bị và ngôn ngữ Chứa mã nguồn và tài nguyên theo cấu trúc module; Google Play tạo APK tối ưu dựa trên cấu hình thiết bị cụ thể
Kích thước tệp tin Thường lớn hơn Thường nhỏ hơn (trung bình giảm 15-20%)
Việc ký ứng dụng Bạn ký tệp APK trước khi phân phối (trừ khi dùng App Signing by Google Play) Bạn ký tệp AAB trước khi tải lên Google Play. Google Play sử dụng AAB này để tạo các APK tối ưu, và sau đó Google Play ký các APK này bằng khoá phân phối của Google.
Google Play App Signing Có thể sử dụng (tải lên APK đã ký bằng upload key) Hoạt động tốt nhất với AAB (tải lên AAB đã ký bằng upload key, Google ký bằng distribution key)

Đối với hầu hết các trường hợp xuất bản lên Google Play Store ngày nay, bạn nên tạo và ký tệp tin AAB. Nếu bạn cần phân phối ứng dụng ngoài Play Store (ví dụ: cho mục đích nội bộ, qua website), bạn có thể cần tạo tệp tin APK đã ký.

Google Play App Signing: Một Dịch Vụ Quan Trọng

Khi xuất bản ứng dụng trên Google Play Store, bạn nên cân nhắc sử dụng dịch vụ **App Signing by Google Play**.

Cách hoạt động:

  1. Bạn tạo Keystore của riêng mình (gọi là "upload key").
  2. Bạn sử dụng upload key này để ký tệp AAB (hoặc APK) và tải lên Google Play Console.
  3. **Lần đầu tiên**, Google Play sẽ yêu cầu bạn cung cấp Keystore gốc (cái bạn đã tạo ban đầu, gọi là "distribution key") HOẶC cho phép Google Play tạo một distribution key mới cho bạn. **Đây là khoá mà Google sẽ sử dụng để ký các APK thực sự được phân phối đến người dùng cuối.**
  4. Sau đó, mỗi khi bạn tải lên một bản cập nhật (dưới dạng AAB hoặc APK) được ký bằng upload key của bạn, Google Play sẽ xác minh chữ ký của bạn. Nếu hợp lệ, Google Play sẽ gỡ bỏ chữ ký đó và ký lại các APK tối ưu được tạo từ AAB (hoặc APK bạn cung cấp) bằng distribution key mà Google đang quản lý.

Lợi ích của App Signing by Google Play:

  • Bảo mật distribution key: Distribution key nhạy cảm nhất được lưu trữ an toàn trên cơ sở hạ tầng của Google. Bạn chỉ cần quản lý upload key (ít nhạy cảm hơn, có thể dễ dàng reset nếu bị lộ).
  • Khả năng khôi phục: Nếu bạn làm mất upload key, bạn có thể yêu cầu Google Play reset nó. Nếu bạn mất distribution key mà không sử dụng dịch vụ này, bạn sẽ mất khả năng cập nhật ứng dụng vĩnh viễn.
  • Hỗ trợ các tính năng phân phối mới: Google Play sử dụng distribution key này để kích hoạt các tính năng như Android App Bundle.

**Khuyến nghị mạnh mẽ:** Luôn luôn sử dụng App Signing by Google Play khi xuất bản lên Play Store. Khi thiết lập dịch vụ này, bạn sẽ tải lên Keystore gốc của mình hoặc cho phép Google tạo một cái mới. Sau đó, bạn sẽ chỉ dùng upload key để ký các bản build tải lên.

Kiểm tra Tệp Tin đã Ký

Làm thế nào để biết tệp tin APK hoặc AAB của bạn đã được ký đúng cách chưa?

* **Với APK:** Bạn có thể sử dụng công cụ `apksigner` (trong Android SDK build-tools). Mở Terminal và chạy:


    apksigner verify your_app.apk
    

Nếu mọi thứ ổn, nó sẽ trả về `Verifies`. Bạn cũng có thể xem chi tiết chữ ký bằng:


    apksigner verify --verbose your_app.apk
    

Hoặc dùng `jarsigner` (trong Java Development Kit):


    jarsigner -verify -verbose -certs your_app.apk
    

* **Với AAB:** Tệp AAB cũng được ký tương tự như APK. Bạn có thể kiểm tra chữ ký bằng các công cụ tương tự nếu cần, nhưng mục đích chính của việc ký AAB là để Google Play xác minh danh tính của bạn trước khi họ ký lại bằng distribution key của họ.

Ngoài ra, bạn có thể giải nén tệp APK (nó thực chất là một tệp zip) và kiểm tra thư mục `META-INF`. Bạn sẽ thấy các tệp như `CERT.RSA`, `CERT.SF`, `MANIFEST.MF` nếu nó đã được ký đúng cách.

Tổng kết

Việc tạo phiên bản phát hành và ký ứng dụng Android là một bước không thể thiếu trên lộ trình phát triển Android chuyên nghiệp. Nó đảm bảo tính bảo mật, toàn vẹn và khả năng cập nhật cho ứng dụng của bạn. Chúng ta đã tìm hiểu về Keystore, cách tạo nó bằng Android Studio, cấu hình Gradle để tự động hóa quy trình ký, và tạo ra các tệp tin APK hoặc AAB sẵn sàng cho production. Chúng ta cũng đã thảo luận về sự khác biệt giữa APK và AAB, và tầm quan trọng của dịch vụ App Signing by Google Play.

Hãy nhớ rằng Keystore và mật khẩu của bạn là cực kỳ quan trọng. Hãy bảo vệ chúng cẩn thận và luôn sao lưu. Việc làm chủ quy trình này là bước cuối cùng trước khi bạn xuất bản ứng dụng lên Google Play Store.

Chúc mừng bạn đã tiến thêm một bước dài trên hành trình trở thành nhà phát triển Android chuyên nghiệp! Hẹn gặp lại các bạn trong các bài viết tiếp theo của series "Android Developer Roadmap".

Chỉ mục