Định dạng Android App Bundle

Gới ứng dụng Android (Android App Bundle) là một tệp (có đuôi tệp .aab) mà bạn tải lên Google Play.

Gói ứng dụng là mã nhị phân được ký có chức năng sắp xếp mã và tài nguyên của ứng dụng thành các mô-đun như minh hoạ trong hình 1. Mã và tài nguyên cho từng mô-đun được sắp xếp tương tự như tệp APK. Điều này cũng dễ hiểu vì mỗi mô-đun có thể được tạo dưới dạng tệp APK riêng biệt. Sau đó, Google Play sử dụng gói ứng dụng để tạo nhiều tệp APK được người dùng sử dụng, chẳng hạn như tệp APK cơ sở, tệp APK tính năng, tệp APK cấu hình và (cho các thiết bị không hỗ trợ tệp APK phân tách) tệp APK nhiều phiên bản (multi-APK). Các thư mục có màu xanh dương, chẳng hạn như thư mục drawable/, values/lib/, đại diện cho mã và tài nguyên mà Google Play dùng để tạo các tệp APK cấu hình cho mỗi mô-đun.

Các gói ứng dụng sắp xếp ứng dụng của bạn thành các thư mục, trong đó mỗi thư mục đại diện cho một mô-đun. Trong mỗi thư mục mô-đun, mã và tài nguyên được sắp xếp tương tự như của một tệp APK thông thường.

Hình 1. Nội dung của Android App Bundle có 1 mô-đun cơ sở (base module), 2 mô-đun tính năng (feature module) và 2 gói tài sản (asset pack).

Danh sách sau đây mô tả chi tiết hơn về một số tệp và thư mục của gói ứng dụng:

  • base/, feature1/ và feature2/: Mỗi thư mục cấp cao nhất đại diện cho một mô-đun riêng của ứng dụng. Mô-đun cơ sở cho ứng dụng của bạn luôn nằm trong thư mục base của gói ứng dụng. Tuy nhiên, tên của thư mục cho mỗi mô-đun tính năng là do thuộc tính split chỉ định trong tệp kê khai của mô-đun. Để tìm hiểu thêm, hãy đọc tệp kê khai mô-đun tính năng.
  • asset_pack_1/ và asset_pack_2/: Đối với các ứng dụng hoặc trò chơi có dung lượng lớn và đòi hỏi đồ hoạ cao, bạn có thể mô-đun hoá tài sản thành các gói tài sản. Gói tài sản là lựa chọn lý tưởng cho các trò chơi do có giới hạn kích thước lớn. Bạn có thể tuỳ chỉnh cách thức và thời điểm tải mỗi gói tài sản xuống thiết bị theo 3 chế độ phân phối: khi cài đặt (install-time), tiếp nối nhanh (fast-follow) và theo yêu cầu (on-demand). Tất cả gói tài sản được Google Play lưu trữ và phân phối. Để tìm hiểu thêm về cách thêm gói tài sản vào gói ứng dụng, hãy xem nội dung tổng quan về Play Asset Delivery.
  • BUNDLE-METADATA/: Thư mục này bao gồm các tệp siêu dữ liệu chứa thông tin hữu ích cho các công cụ hoặc cửa hàng ứng dụng. Các tệp siêu dữ liệu đó có thể bao gồm tệp liên kết ProGuard và danh sách đầy đủ các tệp DEX của ứng dụng. Các tệp trong thư mục này không được đóng gói thành tệp APK cho ứng dụng.
  • Tệp Mô-đun vùng đệm giao thức (*.pb): Các tệp này cung cấp siêu dữ liệu giúp mô tả nội dung của từng mô-đun ứng dụng cho cửa hàng ứng dụng (chẳng hạn như Google Play). Ví dụ: BundleConfig.pb cung cấp thông tin về chính gói đó, chẳng hạn như phiên bản công cụ xây dựng được dùng để tạo gói ứng dụng; native.pbresources.pb mô tả mã và tài nguyên trong mỗi mô-đun vốn hữu ích khi Google Play tối ưu hoá tệp APK cho nhiều cấu hình thiết bị.
  • manifest/: Không giống như tệp APK, gói ứng dụng lưu trữ tệp AndroidManifest.xml của từng mô-đun trong thư mục riêng này.
  • dex/: Không giống như tệp APK, gói ứng dụng lưu trữ các tệp DEX cho từng mô-đun trong thư mục riêng này.
  • res/, lib/ và assets/: Các thư mục này giống với các thư mục trong một tệp APK thông thường. Khi tải gói ứng dụng lên, Google Play sẽ chỉ kiểm tra các tệp trong thư mục và gói đáp ứng được cấu hình thiết bị mục tiêu, đồng thời giữ lại đường dẫn tệp.
  • root/: Thư mục này lưu trữ các tệp mà sau này được chuyển vào thư mục gốc của bất mọi APK có chứa mô-đun của thư mục này. Ví dụ: thư mục base/root/ của gói ứng dụng có thể bao gồm các tài nguyên viết bằng Java mà ứng dụng tải bằng Class.getResource(). Các tệp đó sau đó được chuyển đến thư mục gốc của tệp APK cơ sở của ứng dụng cũng như mọi tệp APK nhiều phiên bản mà Google Play tạo ra. Các đường dẫn trong thư mục này cũng được giữ nguyên. Tức là các thư mục (và thư mục con của chúng) cũng được chuyển vào thư mục gốc của tệp APK.

Tổng quan về tệp APK phân tách

Một thành phần cơ bản để phân phát ứng dụng được tối ưu hoá là cơ chế tệp APK phân tách (split APK) có trên Android 5.0 (API cấp 21) trở lên. Tệp APK phân tách rất giống với tệp APK thông thường ở chỗ cả hai đều có mã byte DEX được biên dịch, tài nguyên và tệp kê khai Android. Tuy nhiên, nền tảng Android có thể xem tệp APK phân tách đã cài đặt như là một ứng dụng. Tức là bạn có thể cài đặt nhiều tệp APK phân tách có quyền truy cập vào mã và tài nguyên chung và chúng sẽ xuất hiện dưới dạng một ứng dụng duy nhất được cài đặt trên thiết bị.

Lợi ích của tệp APK phân tách là khả năng chia nhỏ một tệp APK nguyên khối (tức là một tệp APK chứa mã và tài nguyên cho tất cả tính năng và cấu hình thiết bị mà ứng dụng của bạn hỗ trợ) thành các gói nhỏ và riêng biệt được cài đặt trên thiết bị của người dùngtheo yêu cầu.

Ví dụ: một tệp APK phân tách có thể bao gồm mã và tài nguyên cho một tính năng bổ sung mà chỉ một vài người dùng cần, trong khi một tệp APK phân tách khác chỉ chứa tài nguyên cho một ngôn ngữ hoặc mật độ màn hình cụ thể. Từng tệp APK phân tách trong số này được tải xuống và cài đặt khi người dùng hoặc thiết bị yêu cầu.

Phần sau đây mô tả các loại tệp APK có thể được cài đặt cùng nhau trên một thiết bị để mang lại trải nghiệm ứng dụng trọn vẹn. Bạn sẽ tìm hiểu cách định cấu hình dự án ứng dụng để hỗ trợ các tệp APK này ở phần sau trên trang này.

  • Tệp APK cơ sở: tệp APK này chứa mã và tài nguyên mà tất cả tệp APK phân tách khác đều có thể truy cập và cung cấp chức năng cơ bản cho ứng dụng. Khi người dùng yêu cầu tải ứng dụng xuống, tệp APK này sẽ được tải xuống và cài đặt trước. Lý do là vì tệp kê khai của tệp APK cơ sở chứa đầy đủ thông tin khai báo về các dịch vụ, nhà cung cấp nội dung, quyền, yêu cầu về phiên bản nền tảng và các phần phụ thuộc vào tính năng của hệ thống. Google Play tạo tệp APK cơ sở cho ứng dụng từ mô-đun ứng dụng (hoặc cơ sở) của dự án. Nếu bạn lo ngại về việc giảm kích thước tải xuống ban đầu của ứng dụng, hãy nhớ rằng tất cả mã và tài nguyên có trong mô-đun này đều nằm trong tệp APK cơ sở của ứng dụng.
  • Tệp APK cấu hình: Mỗi tệp APK này bao gồm thư viện gốc và tài nguyên về mật độ màn hình, kiến trúc CPU hoặc ngôn ngữ cụ thể. Khi người dùng tải ứng dụng xuống, thiết bị của họ sẽ chỉ tải xuống và cài đặt các tệp APK cấu hình dành cho thiết bị của họ. Mỗi tệp APK cấu hình là một phần phụ thuộc của tệp APK cơ sở hoặc tệp APK mô-đun tính năng. Tức là các tệp APK cấu hình sẽ được tải xuống và cài đặt cùng với tệp APK mà tệp APK cấu hình này cung cấp mã và tài nguyên cho tệp APK đó. Không giống như mô-đun cơ sở và tính năng, bạn không tạo một mô-đun riêng cho tệp APK cấu hình. Nếu bạn sử dụng các phương pháp tiêu chuẩn để sắp xếp các tài nguyên thay thế, dành riêng cho cấu hình cho các mô-đun cơ sở và tính năng, thì Google Play sẽ tự động tạo các tệp APK cấu hình.
  • Tệp APK mô-đun tính năng: Mỗi tệp APK này chứa mã và tài nguyên cho một tính năng của ứng dụng mà bạn mô-đun hoá bằng các mô-đun tính năng. Sau đó, bạn có thể tuỳ chỉnh cách thức và thời điểm tải tính năng đó xuống thiết bị. Ví dụ: bằng cách sử dụng Thư viện Play Core, bạn có thể cài đặt các tính năng theo yêu cầu sau khi tệp APK cơ sở được cài đặt trên thiết bị để cung cấp thêm chức năng cho người dùng. Một ví dụ là ứng dụng nhắn tin: Ứng dụng này sẽ tải và cài đặt tính năng chụp và gửi ảnh chỉ khi người dùng yêu cầu sử dụng chức năng đó. Vì các mô-đun tính năng có thể không có sẵn tại thời điểm cài đặt nên bạn cần phải thêm tất cả mã và tài nguyên dùng chung trong tệp APK cơ sở. Tức là mô-đun tính năng phải giả định rằng chỉ có mã và tài nguyên của tệp APK cơ sở có sẵn tại thời điểm cài đặt. Google Play đảm nhiệm việc tạo tệp APK mô-đun tính năng cho ứng dụng từ các mô-đun tính năng của dự án.

Hãy thử xét trường hợp một ứng dụng có 3 mô-đun tính năng và hỗ trợ nhiều cấu hình thiết bị. Hình 1 bên dưới minh hoạ cây phụ thuộc cho các tệp APK của ứng dụng. Hãy lưu ý rằng tệp APK cơ sở tạo thành phần ngọn của cây và tất cả tệp APK khác đều phụ thuộc vào tệp APK cơ sở. (Nếu bạn muốn biết cách mô-đun của các tệp APK này được biểu thị trong Android App Bundle ra sao, hãy xem nội dung Định dạng Android App Bundle.)

Tệp APK cơ sở nằm ở ngọn cây, còn các tệp APK mô-đun tính năng thì phụ thuộc vào tệp APK cơ sở đó. Các tệp APK cấu hình bao gồm mã và tài nguyên về cấu hình thiết bị cho tệp APK cơ sở và mỗi tệp APK mô-đun tính năng, tạo thành các nút lá của cây phụ thuộc.

Hình 1. Cây phụ thuộc của ứng dụng được phân phát bằng tệp APK phân tách

Lưu ý rằng bạn không cần tự xây dựng các tệp APK này. Google Play sẽ làm việc này cho bạn bằng cách sử dụng một gói ứng dụng đã ký mà bạn tạo bằng Android Studio. Để tìm hiểu thêm về định dạng gói ứng dụng và cách tạo một gói ứng dụng, hãy xem nội dung Tạo, triển khai và tải Android App Bundle lên.

Thiết bị chạy Android 4.4 (API cấp 19) trở xuống

Vì các thiết bị chạy Android 4.4 (API cấp 19) trở xuống không hỗ trợ việc tải và cài đặt các tệp APK phân tách nên Google Play phân phát một tệp APK duy nhất cho các thiết bị đó, tệp này được gọi là tệp APK đa phiên bản (multi-APK) được tối ưu hoá cho cấu hình của thiết bị. Tức là tệp APK đa phiên bản cũng sẽ mang lại trải nghiệm ứng dụng trọn vẹn nhưng không bao gồm mã và các tài nguyên không cần thiết, chẳng hạn như mã và tài nguyên về mật độ màn hình và kiến trúc CPU khác.

Tuy nhiên, các tài nguyên này vẫn chứa tất cả ngôn ngữ mà ứng dụng hỗ trợ. Điều này cho phép người dùng thay đổi tuỳ chọn cài đặt ngôn ngữ của ứng dụng theo ý thích mà không cần phải tải xuống một tệp APK đa phiên bản khác.

Tệp APK đa phiên bản không có tính năng tải các mô-đun tính năng xuống theo yêu cầu. Để đưa một mô-đun tính năng vào tệp APK này, bạn phải tắt chế độ phân phối Theo yêu cầu hoặc bật tuỳ chọn Kết hợp (Fusing) khi tạo mô-đun tính năng.

Lưu ý rằng với gói ứng dụng, bạn không cần xây dựng, ký, tải lên và quản lý tệp APK cho từng cấu hình thiết bị mà ứng dụng hỗ trợ. Bạn vẫn sẽ phải tạo và tải một gói ứng dụng duy nhất lên cho toàn bộ ứng dụng. Google Play sẽ xử lý phần còn lại cho bạn. Vì vậy, cho dù bạn có định hỗ trợ thiết bị chạy Android 4.4 trở xuống hay không, Google Play đều cung cấp cơ chế phân phát linh hoạt cho cả bạn và người dùng.

Thay đổi ngôn ngữ người dùng

Với gói ứng dụng, thiết bị chỉ cần tải mã và tài nguyên cần thiết xuống để chạy ứng dụng. Vì vậy, đối với tài nguyên ngôn ngữ, thiết bị của người dùng chỉ tải xuống tài nguyên ngôn ngữ của ứng dụng mà khớp với một hoặc nhiều ngôn ngữ hiện được chọn trong phần cài đặt của thiết bị.

Khi người dùng chuyển đổi ngôn ngữ trong phần cài đặt của thiết bị Google Play có thể cần tải xuống và cài đặt thêm một số tệp APK phân tách trước khi ứng dụng có thể hiển thị bằng ngôn ngữ mới.

Google Play sẽ cố tải xuống các ngôn ngữ bổ sung ngay sau khi chuyển đổi ngôn ngữ thiết bị. Nếu thiết bị của người dùng không có kết nối mạng, quá trình tải xuống không thành công hoặc tài nguyên quá lớn, Google Play sẽ thử tải lại ở chế độ nền khi thiết bị trong điều kiện lý tưởng hơn. Khi chạy trên một thiết bị Android 9.0 (API cấp 28) trở xuống, nếu ứng dụng đang chạy trên nền trước trong quá trình cài đặt các tệp APK phân tách ngôn ngữ mới, thì ứng dụng đó sẽ bị buộc dừng.

Nếu ứng dụng bắt buộc phải luôn có tất cả ngôn ngữ trên thiết bị, bạn có thể tắt tính năng phân tách ngôn ngữ trong cấu hình xây dựng.

Nếu ứng dụng của bạn yêu cầu tải xuống riêng một số ngôn ngữ bổ sung bên cạnh ngôn ngữ mà người dùng chọn trong phần cài đặt của thiết bị (ví dụ: triển khai bộ chọn ngôn ngữ trong ứng dụng), thì bạn có thể sử dụng thư viện Play Core để tải xuống theo yêu cầu.