Hỗ trợ nhiều tệp APK

Nếu bạn phát hành ứng dụng lên Google Play thì bạn nên tạo và tải một Android App Bundle lên. Khi bạn làm như vậy, Google Play sẽ tự động tạo và phân phát các tệp APK được tối ưu hoá cho cấu hình thiết bị của mỗi người dùng, vì vậy, họ chỉ tải mã và tài nguyên mà họ cần để chạy ứng dụng. Việc phát hành nhiều tệp APK rất hữu ích nếu bạn hiện chưa phát hành ứng dụng lên Google Play, nhưng bạn phải tự xây dựng, ký và quản lý từng tệp APK.

Hỗ trợ nhiều tệp APK là một tính năng trên Google Play cho phép bạn phát hành các tệp APK khác nhau cho ứng dụng, mỗi APK được nhắm đến các cấu hình thiết bị khác nhau. Mỗi tệp APK là một phiên bản hoàn chỉnh và độc lập của ứng dụng, nhưng các tệp này chia sẻ cùng danh sách ứng dụng trên Google Play và phải chia sẻ cùng một tên gói và được ký bằng cùng một khoá phát hành. Tính năng này hữu ích trong các trường hợp ứng dụng không thể truy cập vào tất cả thiết bị mong muốn chỉ bằng một tệp APK.

Các thiết bị chạy Android có thể khác nhau theo một số cách và điều quan trọng đối với sự thành công của ứng dụng là bạn phải cung cấp ứng dụng đó cho nhiều thiết bị nhất có thể. Các ứng dụng Android thường chạy trên hầu hết thiết bị tương thích với một tệp APK duy nhất, bằng cách cung cấp tài nguyên thay thế cho các cấu hình khác nhau (ví dụ: nhiều bố cục cho các kích thước màn hình khác nhau) và hệ thống Android chọn tài nguyên thích hợp cho thiết bị trong thời gian chạy. Tuy nhiên, trong một vài trường hợp, một tệp APK không thể hỗ trợ tất cả cấu hình thiết bị, vì tài nguyên thay thế làm cho tệp APK quá lớn hoặc các sự cố kỹ thuật khác ngăn một tệp APK hoạt động trên tất cả thiết bị.

Để giúp bạn phát hành ứng dụng cho nhiều thiết bị nhất có thể, Google Play cho phép bạn phát hành nhiều tệp APK trong cùng một danh sách ứng dụng. Sau đó, Google Play sẽ cung cấp từng tệp APK cho các thiết bị phù hợp dựa trên cấu hình hỗ trợ mà bạn đã khai báo trong tệp kê khai của mỗi tệp APK.

Bằng cách phát hành ứng dụng với nhiều tệp APK, bạn có thể:

  • Hỗ trợ nhiều định dạng nén kết cấu OpenGL với từng tệp APK.
  • Hỗ trợ nhiều kích thước và mật độ màn hình với từng tệp APK.
  • Hỗ trợ nhiều bộ tính năng của thiết bị bằng mỗi tệp APK.
  • Hỗ trợ nhiều phiên bản nền tảng khác nhau cho từng tệp APK.
  • Hỗ trợ nhiều kiến trúc CPU tuỳ theo từng tệp APK (chẳng hạn như cho ARM hoặc x86), khi ứng dụng dùng Android NDK).
  • Tối ưu hoá cho các thiết bị cấp thấp chẳng hạn như các thiết bị chạy Android (phiên bản Go).

Hiện tại, đây là những đặc điểm thiết bị duy nhất mà Google Play hỗ trợ cho việc phát hành nhiều tệp APK trong cùng một ứng dụng.

Lưu ý: Để tìm hiểu về cách chuẩn bị và phát hành tệp APK trên Google Play, hãy xem bài viết hỗ trợ Chuẩn bị và ra mắt bản phát hành.

Cách hoạt động của nhiều tệp APK

Ý tưởng về việc sử dụng nhiều tệp APK trên Google Play là bạn chỉ có một mục nhập trong Google Play cho ứng dụng, nhưng các thiết bị khác nhau có thể tải xuống tệp APK khác nhau. Điều này có nghĩa là:

  • Bạn chỉ duy trì một bộ thông tin chi tiết sản phẩm (nội dung mô tả ứng dụng, biểu tượng, ảnh chụp màn hình, v.v.). Điều này cũng có nghĩa là bạn không thể tính giá khác nhau cho các tệp APK khác nhau.
  • Tất cả người dùng chỉ thấy một phiên bản của ứng dụng trên Google Play, vì vậy họ không bị nhầm lẫn với nhiều phiên bản mà bạn có thể đã phát hành là "dành cho máy tính bảng" hoặc "dành cho điện thoại".
  • Tất cả bài đánh giá của người dùng đều được áp dụng cho cùng một trang thông tin ứng dụng, mặc dù người dùng trên các thiết bị khác nhau có thể có các tệp APK khác nhau.
  • Nếu bạn phát hành nhiều tệp APK cho các phiên bản Android khác nhau (cho nhiều cấp độ API), thì khi thiết bị của người dùng nhận được bản cập nhật hệ thống có đủ điều kiện cho tệp APK khác bạn đã phát hành, Google Play sẽ cập nhật ứng dụng của người dùng lên tệp APK được thiết kế cho phiên bản Android cao hơn. Mọi dữ liệu hệ thống liên kết với ứng dụng đều được giữ lại (giống như đối với các bản cập nhật ứng dụng thông thường khi sử dụng một tệp APK).

Bộ lọc được hỗ trợ

Thiết bị nào nhận được tệp APK nào là do các bộ lọc của Google Play xác định theo các phần tử trong tệp kê khai của mỗi tệp APK. Tuy nhiên, Google Play chỉ cho phép bạn phát hành nhiều tệp APK khi mỗi tệp APK sử dụng các bộ lọc để hỗ trợ một biến thể của các đặc điểm sau đây của thiết bị:

  • Định dạng nén kết cấu OpenGL

    Định dạng này dựa trên (các) phần tử <supports-gl-texture> của tệp kê khai.

    Ví dụ: khi phát triển một trò chơi sử dụng OpenGL ES, bạn có thể cung cấp một tệp APK cho các thiết bị hỗ trợ nén kết cấu ATI và một tệp APK riêng cho các thiết bị hỗ trợ nén PowerVR (cùng với nhiều tệp APK khác).

  • Kích thước màn hình (và mật độ màn hình, không bắt buộc)

    Chính sách này dựa trên phần tử <supports-screens> hoặc <compatible-screens> của tệp kê khai. Bạn không được dùng cả hai thành phần này và chỉ nên dùng <supports-screens> khi có thể.

    Ví dụ: bạn có thể cung cấp một tệp APK hỗ trợ màn hình có kích thước nhỏ và bình thường, cùng với một tệp APK khác hỗ trợ màn hình có kích thước lớn và rất lớn. Để tìm hiểu thêm về cách tạo tệp APK riêng biệt dựa trên kích thước hoặc mật độ màn hình, hãy chuyển đến phần Tạo nhiều tệp APK.

    Hãy xem xét các phương pháp hay nhất sau đây để hỗ trợ tất cả kích thước màn hình:

    • Hệ thống Android hỗ trợ mạnh mẽ cho các ứng dụng hỗ trợ tất cả cấu hình màn hình trong khi chỉ có một tệp APK. Bạn nên tránh tạo nhiều tệp APK để hỗ trợ các màn hình khác nhau trừ khi thực sự cần thiết. Thay vào đó, hãy làm theo hướng dẫn Hỗ trợ nhiều màn hình để ứng dụng linh hoạt và có thể thích ứng với mọi cấu hình màn hình chỉ bằng một tệp APK.
    • Theo mặc định, tất cả thuộc tính kích thước màn hình trong phần tử <supports-screens> đều là "true" nếu bạn không khai báo các thuộc tính này. Tuy nhiên, do thuộc tính android:xlargeScreens đã được thêm vào Android 2.3 (API cấp 9), nên Google Play sẽ mặc định rằng thuộc tính này là "false" nếu ứng dụng không đặt là android:minSdkVersion hoặc android:targetSdkVersion đến "9" hoặc cao hơn.
    • Bạn không nên kết hợp cả hai phần tử <supports-screens><compatible-screens> trong tệp kê khai. Việc bạn dùng cả hai sẽ làm tăng khả năng gặp lỗi do xung đột giữa các phần tử. Để được trợ giúp trong việc quyết định nên dùng loại thiết bị nào, hãy đọc phần Phân phối tới Màn hình cụ thể. Nếu bạn không thể tránh dùng cả hai, hãy lưu ý rằng nếu có bất kỳ xung đột nào với thoả thuận giữa một kích thước cụ thể, thì giá trị "false" sẽ thắng.
  • Bộ tính năng thiết bị

    Điều này dựa trên (các) phần tử <uses-feature> của tệp kê khai.

    Ví dụ: bạn có thể cung cấp một tệp APK cho các thiết bị hỗ trợ cảm ứng đa điểm và một tệp APK khác cho các thiết bị không hỗ trợ cảm ứng đa điểm. Hãy xem Thông tin tham khảo về tính năng để biết danh sách các tính năng mà nền tảng hỗ trợ.

  • Android (phiên bản Go)

    Để nhắm đến các thiết bị chạy Android (phiên bản Go), tệp APK cần khai báo <uses-feature android:name="android.hardware.ram.low" android:required="true">, nhắm đến cấp độ API tối thiểu là 26 và có mã phiên bản cao hơn API không phải là tệp APK phiên bản Go.

  • Cấp độ API

    Điều này dựa trên phần tử <uses-sdk> của tệp kê khai. Bạn có thể dùng cả thuộc tính android:minSdkVersionandroid:maxSdkVersion để chỉ định mức độ hỗ trợ cho nhiều cấp độ API.

    Ví dụ: bạn có thể phát hành ứng dụng bằng một tệp APK hỗ trợ API cấp 16 – 19 (Android 4.1.x – 4.4.4) – chỉ dùng các API có sẵn từ API cấp 16 trở xuống và một tệp APK khác hỗ trợ API cấp 21 trở lên (Android 5.0 trở lên) — dùng các API có sẵn từ API cấp 21 trở xuống. Để tìm hiểu cách tạo tệp APK riêng biệt cho mỗi tệp APK nhắm đến một phạm vi API khác nhau, hãy chuyển đến phần Định cấu hình Phiên bản sản phẩm.

    Nếu bạn dùng đặc điểm này làm yếu tố để phân biệt nhiều tệp APK, thì tệp APK có giá trị android:minSdkVersion cao hơn phải có giá trị android:versionCode cao hơn. Điều này cũng đúng nếu hai tệp APK trùng lặp hỗ trợ thiết bị của chúng dựa trên bộ lọc được hỗ trợ khác nhau. Điều này đảm bảo rằng khi thiết bị nhận được bản cập nhật hệ thống, Google Play có thể cung cấp cho người dùng một bản cập nhật cho ứng dụng (vì các bản cập nhật dựa trên mức tăng trong mã phiên bản ứng dụng). Yêu cầu này được mô tả chi tiết hơn trong phần dưới đây về Quy tắc cho nhiều APK.

    Bạn nên tránh dùng android:maxSdkVersion nói chung, vì miễn là bạn đã phát triển ứng dụng đúng cách với các API công khai, thì ứng dụng đó sẽ luôn tương thích với các phiên bản Android trong tương lai. Nếu bạn muốn phát hành một tệp APK khác cho các cấp độ API cao hơn, thì bạn vẫn không cần phải chỉ định phiên bản cao nhất, vì nếu android:minSdkVersion"16" trong một tệp APK và "21" trong một tệp APK khác, thì các thiết bị hỗ trợ API cấp 21 trở lên sẽ luôn nhận được tệp APK thứ hai (vì mã phiên bản của tệp APK cao hơn, theo ghi chú trước).


  • Cấu trúc CPU (ABI)

    Một số thư viện gốc cung cấp các gói riêng biệt cho các cấu trúc CPU cụ thể hoặc Giao diện nhị phân của ứng dụng (ABI). Thay vì đóng gói tất cả thư viện hiện có vào một tệp APK, bạn có thể tạo một tệp APK riêng cho từng ABI và chỉ bao gồm các thư viện mà bạn cần cho ABI đó. Để tìm hiểu thêm về cách tạo các tệp APK riêng biệt dựa trên ABI mục tiêu, hãy chuyển đến phần Tạo nhiều tệp APK.

Các phần tử tệp kê khai khác hỗ trợ bộ lọc Google Play (nhưng không được liệt kê ở trên) vẫn được áp dụng cho từng tệp APK như bình thường. Tuy nhiên, Google Play không cho phép bạn phát hành các tệp APK riêng biệt dựa trên các biến thể của các đặc điểm đó của thiết bị. Do đó, bạn không thể phát hành nhiều tệp APK nếu các bộ lọc liệt kê ở trên là giống nhau cho mỗi tệp APK (nhưng các tệp APK khác nhau dựa trên các đặc điểm khác trong tệp kê khai hoặc tệp APK). Ví dụ: bạn không thể cung cấp các tệp APK khác nhau hoàn toàn về đặc điểm <uses-configuration>.

Quy tắc cho nhiều tệp APK

Trước khi phát hành nhiều tệp APK cho ứng dụng, bạn cần hiểu rõ các quy tắc sau:

  • Tất cả tệp APK bạn phát hành cho cùng một ứng dụng phải có cùng tên gói và được ký bằng cùng một khoá chứng chỉ.
  • Mỗi tệp APK phải có một mã phiên bản khác nhau, được chỉ định bằng thuộc tính android:versionCode.
  • Mỗi tệp APK không được khớp chính xác với hỗ trợ cấu hình của tệp APK khác.

    Điều này nghĩa là mỗi tệp APK phải khai báo hỗ trợ hơi khác đối với ít nhất một trong các bộ lọc được hỗ trợ trên Google Play (liệt kê ở trên).

    Thông thường, bạn sẽ phân biệt các tệp APK của mình dựa trên một đặc điểm cụ thể (chẳng hạn như các định dạng nén kết cấu được hỗ trợ). Do đó, mỗi tệp APK sẽ khai báo hỗ trợ cho các thiết bị khác nhau. Tuy nhiên, bạn có thể phát hành nhiều tệp APK trùng lặp một chút về khả năng hỗ trợ. Khi hai tệp APK chồng chéo lên nhau (các tệp APK này hỗ trợ một số cấu hình thiết bị giống nhau), một thiết bị nằm trong phạm vi chồng chéo đó sẽ nhận được tệp APK có mã phiên bản cao hơn (xác định bởi android:versionCode).

  • Bạn không thể kích hoạt một tệp APK mới có mã phiên bản thấp hơn mã của tệp APK mà nó thay thế. Ví dụ: giả sử bạn đang dùng một tệp APK đang hoạt động có kích thước màn hình nhỏ – bình thường với mã phiên bản 0400, sau đó thử thay thế tệp APK đó bằng một tệp APK cho cùng kích thước màn hình với mã phiên bản 0300. Phương thức này sẽ phát sinh lỗi vì người dùng tệp APK trước đó sẽ không thể cập nhật ứng dụng.
  • Tệp APK yêu cầu cấp độ API cao hơn phải có mã phiên bản cao hơn.

    Điều này chỉ đúng khi bạn dùng một trong hai định dạng này: tệp APK chỉ khác ở cấp độ API được hỗ trợ (không có các bộ lọc được hỗ trợ khác phân biệt các tệp APK với nhau) hoặc khi các tệp APK dùng một bộ lọc được hỗ trợ khác, nhưng có sự trùng lặp giữa các tệp APK trong bộ lọc đó.

    Điều này rất quan trọng vì thiết bị của người dùng chỉ nhận được bản cập nhật ứng dụng của Google Play khi mã phiên bản của tệp APK trên Google Play cao hơn mã phiên bản của tệp APK hiện tại trên thiết bị. Điều này đảm bảo rằng nếu thiết bị nhận được bản cập nhật hệ thống có đủ điều kiện để cài đặt tệp APK cho các cấp độ API cao hơn, thì thiết bị sẽ nhận được bản cập nhật ứng dụng do mã phiên bản tăng.

    Lưu ý: Kích thước của mã phiên bản tăng không liên quan; đơn giản chỉ là ứng dụng cần lớn hơn trong phiên bản hỗ trợ các cấp độ API cao hơn.

    Dưới đây là một số ví dụ:

    • Nếu tệp APK bạn đã tải lên cho API cấp 16 trở lên (Android 4.1.x+) có mã phiên bản là 0400, thì tệp APK cho API cấp 21 trở lên (Android 5.0 trở lên) phải là 0401 hoặc lớn hơn. Trong trường hợp này, cấp độ API là bộ lọc duy nhất được hỗ trợ, nên mã phiên bản phải tăng so với mức hỗ trợ cấp độ API cho từng tệp APK để người dùng nhận được bản cập nhật khi họ nhận được bản cập nhật hệ thống.
    • Nếu bạn có một tệp APK dành cho API cấp 16 (trở lên) màn hình nhỏ – lớn và một tệp APK khác dành cho API cấp 21 (trở lên) màn hình lớn – rất lớn, thì các mã phiên bản phải tăng tương quan với các cấp độ API. Trong trường hợp này, bộ lọc cấp API được dùng để phân biệt từng tệp APK, nhưng kích thước màn hình cũng vậy. Vì kích thước màn hình trùng nhau (cả hai tệp APK đều hỗ trợ màn hình lớn), mã phiên bản vẫn phải theo thứ tự. Điều này đảm bảo rằng một thiết bị màn hình lớn nhận được bản cập nhật hệ thống cho API cấp 21 sẽ nhận được bản cập nhật cho tệp APK thứ hai.
    • Nếu bạn có một tệp APK dành cho API cấp 16 (trở lên) màn hình nhỏ – bình thường và một APK khác dành cho API cấp 21 (trở lên) màn hình lớn – rất lớn, thì mã phiên bản không cần phải tăng tương quan với các cấp độ API. Vì không có sự trùng lặp trong bộ lọc kích thước màn hình, nên không có thiết bị nào có thể chuyển qua lại giữa hai tệp APK này, vì vậy, bạn không cần mã phiên bản tăng từ cấp API thấp hơn lên cấp API cao hơn.
    • Nếu bạn có một tệp APK dành cho API cấp 16 (trở lên) CPU ARMv7, và một tệp APK khác dành cho CPU cấp 21 (trở lên) CPU ARMv5TE, thì mã phiên bản phải tăng tương ứng với các cấp độ API. Trong trường hợp này, bộ lọc cấp độ API được dùng để phân biệt từng tệp APK, nhưng cấu trúc CPU cũng vậy. Vì một tệp APK có thư viện ARMv5TE tương thích với các thiết bị có CPU ARMv7, nên các tệp APK trùng lặp với đặc điểm này. Do đó, mã phiên bản của tệp APK hỗ trợ API cấp 21 trở lên phải cao hơn. Điều này đảm bảo rằng một thiết bị có CPU ARMv7 nhận được bản cập nhật hệ thống cho API cấp 21, sẽ nhận được bản cập nhật cho tệp APK thứ hai được thiết kế cho API cấp 21. Tuy nhiên, vì loại bản cập nhật này dẫn đến thiết bị ARMv7 sử dụng tệp APK không được tối ưu hoá hoàn toàn cho CPU của thiết bị đó, nên bạn cần cung cấp tệp APK cho cả cấu trúc ARMv5TE và ARMv7 ở mỗi cấp độ API để tối ưu hoá hiệu suất của ứng dụng trên mỗi CPU. Lưu ý: Điều này chỉ áp dụng khi so sánh tệp APK với thư viện ARMv5TE và ARMv7, chứ không áp dụng khi so sánh các thư viện gốc khác.

Việc không tuân thủ các quy tắc nêu trên sẽ dẫn đến lỗi trên Google Play Console khi bạn kích hoạt tệp APK, bạn sẽ không thể phát hành ứng dụng cho đến khi bạn khắc phục lỗi.

Có những xung đột khác có thể xảy ra khi bạn kích hoạt tệp APK, nhưng điều này sẽ dẫn đến cảnh báo thay vì lỗi. Cảnh báo có thể do các nguyên nhân sau gây ra:

  • Khi bạn sửa đổi một tệp APK để "thu hẹp" dịch vụ hỗ trợ cho các đặc điểm của thiết bị và không có tệp APK nào khác hỗ trợ các thiết bị sau đó nằm ngoài phạm vi được hỗ trợ. Ví dụ: nếu tệp APK hiện hỗ trợ màn hình có kích thước nhỏ và bình thường, đồng thời bạn thay đổi tuỳ chọn đó để chỉ hỗ trợ màn hình nhỏ, thì bạn đã thu nhỏ nhóm thiết bị được hỗ trợ và một số thiết bị sẽ không thấy ứng dụng của bạn trên Google Play nữa. Bạn có thể giải quyết vấn đề này bằng cách thêm một tệp APK khác có hỗ trợ màn hình kích thước thông thường để tất cả thiết bị được hỗ trợ trước đây vẫn được hỗ trợ.
  • Khi có sự "trùng lặp" giữa hai hoặc nhiều tệp APK. Ví dụ: nếu một tệp APK hỗ trợ các kích thước màn hình nhỏ, bình thường và lớn, trong khi một tệp APK khác hỗ trợ các kích thước lớn và rất lớn, thì sẽ có sự chồng chéo vì cả hai tệp APK đều hỗ trợ màn hình lớn. Nếu bạn không giải quyết vấn đề này, thì thiết bị đủ điều kiện cho cả hai tệp APK (ví dụ: thiết bị màn hình lớn) sẽ nhận được tệp APK nào có mã phiên bản cao nhất.

    Lưu ý: Nếu bạn đang tạo các tệp APK riêng biệt cho các cấu trúc CPU khác nhau, hãy lưu ý rằng tệp APK dành cho ARMv5TE sẽ chồng chéo với một tệp APK dành cho ARMv7. Điều này nghĩa là, một tệp APK được thiết kế cho ARMv5TE tương thích với thiết bị ARMv7, nhưng điều ngược lại không đúng (tệp APK chỉ có thư viện ARMv7 không tương thích với thiết bị ARMv5TE).

Khi các xung đột đó xảy ra, bạn sẽ thấy một thông báo cảnh báo, nhưng bạn vẫn có thể phát hành ứng dụng.

Tạo nhiều tệp APK

Sau khi quyết định phát hành nhiều tệp APK, bạn có thể cần tạo các dự án Android riêng cho từng tệp APK mà bạn dự định phát hành để có thể phát triển các tệp APK đó một cách riêng biệt. Bạn có thể thực hiện việc này bằng cách sao chép dự án hiện có và đặt tên mới cho dự án đó. (Ngoài ra, bạn có thể dùng một hệ thống xây dựng có thể tạo ra các tài nguyên khác nhau (chẳng hạn như kết cấu) dựa trên cấu hình bản dựng.)

Mẹo: Một cách để tránh trùng lặp phần lớn mã ứng dụng là sử dụng dự án thư viện. Dự án thư viện chứa mã và tài nguyên dùng chung để bạn có thể đưa vào các dự án ứng dụng thực tế.

Khi bạn tạo nhiều dự án cho cùng một ứng dụng, bạn nên xác định từng dự án bằng một tên cho biết các quy định hạn chế về thiết bị sẽ được áp dụng trên tệp APK đó. Nhờ đó, bạn có thể dễ dàng xác định được những dự án đó. Ví dụ: "HelloWorld_21" có thể là một tên hay cho ứng dụng được thiết kế cho API cấp 21 trở lên.

Lưu ý: Tất cả tệp APK bạn phát hành cho cùng một ứng dụng phải có cùng tên gói và được ký bằng cùng một khoá chứng chỉ. Hãy nhớ rằng bạn cũng hiểu rõ từng Quy tắc cho nhiều tệp APK.

Đang chỉ định mã phiên bản

Mỗi tệp APK cho cùng một ứng dụng phải có một mã phiên bản duy nhất, do thuộc tính android:versionCode chỉ định. Bạn phải cẩn thận trong việc chỉ định mã phiên bản khi phát hành nhiều tệp APK, vì mỗi tệp APK phải khác nhau, nhưng trong một số trường hợp, các tệp APK phải hoặc được xác định theo thứ tự cụ thể, dựa trên cấu hình mà mỗi tệp APK hỗ trợ.

Thứ tự mã phiên bản

Tệp APK yêu cầu cấp độ API cao hơn thường phải có mã phiên bản cao hơn. Ví dụ: nếu bạn tạo hai tệp APK để hỗ trợ các cấp API khác nhau, thì tệp APK cho các cấp API cao hơn phải có mã phiên bản cao hơn. Điều này đảm bảo rằng nếu thiết bị nhận được bản cập nhật hệ thống đáp ứng đủ điều kiện để cài đặt tệp APK cho các cấp độ API cao hơn, thì người dùng sẽ nhận được thông báo để cập nhật ứng dụng. Để biết thêm thông tin về cách áp dụng yêu cầu này, hãy xem phần ở trên về Quy tắc cho nhiều tệp APK.

Bạn cũng nên cân nhắc xem thứ tự mã phiên bản có thể ảnh hưởng đến tệp APK mà người dùng nhận được như thế nào do sự trùng lặp giữa mức độ phù hợp của các tệp APK khác nhau, hoặc các thay đổi bạn có thể thực hiện trong tương lai đối với tệp APK của mình.

Ví dụ: nếu bạn có nhiều tệp APK khác nhau dựa trên kích thước màn hình, chẳng hạn như một tệp APK cho kích thước nhỏ – bình thường và một tệp APK cho kích thước lớn – rất lớn, nhưng hãy dự đoán thời điểm bạn sẽ thay đổi các tệp APK thành một tệp cho kích thước nhỏ và một tệp cho kích thước thông thường – rất lớn, thì bạn nên tạo mã phiên bản cho tệp APK lớn – rất lớn. Bằng cách đó, thiết bị có kích thước thông thường sẽ nhận được bản cập nhật phù hợp khi bạn thực hiện thay đổi, vì mã phiên bản tăng từ tệp APK hiện có lên tệp APK mới hiện hỗ trợ thiết bị.

Ngoài ra, khi bạn tạo nhiều tệp APK khác nhau dựa trên việc hỗ trợ các định dạng nén kết cấu OpenGL khác nhau, hãy lưu ý rằng nhiều thiết bị hỗ trợ nhiều định dạng. Do một thiết bị nhận được tệp APK có mã phiên bản cao nhất khi có sự trùng lặp giữa hai tệp APK, bạn nên sắp xếp mã phiên bản giữa các tệp APK của mình để tệp APK có định dạng nén ưu tiên có mã phiên bản cao nhất. Ví dụ: bạn có thể muốn thực hiện các bản dựng riêng cho ứng dụng của mình bằng cách dùng các định dạng nén PVRTC, ATITC và ETC1. Nếu bạn thích các định dạng theo thứ tự chính xác này, thì tệp APK sử dụng PVRTC sẽ có mã phiên bản cao nhất, tệp APK sử dụng ATITC có mã phiên bản thấp hơn và phiên bản có ETC1 là thấp nhất. Do đó, nếu một thiết bị hỗ trợ cả PVRTC và ETC1, thì thiết bị sẽ nhận được tệp APK có PVRTC, vì thiết bị có mã phiên bản cao nhất.

Trong trường hợp Cửa hàng Google Play không thể xác định đúng tệp APK để cài đặt cho một thiết bị mục tiêu, bạn cũng có thể tạo một tệp APK chung bao gồm các tài nguyên cho tất cả biến thể của thiết bị mà bạn muốn hỗ trợ. Nếu bạn cung cấp một tệp APK chung, thì bạn nên chỉ định tệp APK này là versionCode thấp nhất. Do Cửa hàng Google Play cài đặt phiên bản ứng dụng vừa tương thích với thiết bị mục tiêu, vừa có versionCode cao nhất, nên việc gán versionCode thấp hơn cho tệp APK chung sẽ đảm bảo Cửa hàng Google Play cố gắng cài đặt một trong những tệp APK khác của bạn trước khi quay lại tệp APK chung lớn hơn.

Sử dụng lược đồ mã phiên bản

Để cho phép các tệp APK khác nhau cập nhật mã phiên bản của các tệp APK đó một cách độc lập với những tệp khác (ví dụ: khi bạn sửa lỗi chỉ trong một tệp APK, bạn không cần phải cập nhật tất cả tệp APK), bạn nên dùng một lược đồ cho các mã phiên bản cung cấp đủ không gian giữa mỗi tệp APK để bạn có thể tăng mã trong một tệp mà không yêu cầu tăng các mã khác. Bạn cũng nên bao gồm tên phiên bản thực tế trong mã (nghĩa là phiên bản hiển thị cho người dùng được chỉ định cho android:versionName), để bạn dễ dàng liên kết mã và tên phiên bản.

Lưu ý: Khi bạn tăng mã phiên bản cho một tệp APK, Google Play sẽ nhắc người dùng phiên bản trước đó cập nhật ứng dụng. Do đó, để tránh việc cập nhật không cần thiết, bạn không nên tăng mã phiên bản cho những tệp APK thực sự không bao gồm các thay đổi.

Bạn nên dùng mã phiên bản có ít nhất 7 chữ số: số nguyên đại diện cho các cấu hình được hỗ trợ ở thứ tự bit cao hơn và tên phiên bản (từ android:versionName) ở phía dưới số đơn đặt hàng. Ví dụ: khi tên phiên bản ứng dụng là 3.1.0, mã phiên bản cho API cấp 4 và tệp APK có API cấp 11 sẽ lần lượt như 0400310 và 1100310. Hai chữ số đầu tiên dành riêng cho cấp độ API (tương ứng là 4 và 11), hai chữ số ở giữa là dành cho kích thước màn hình hoặc định dạng kết cấu GL (không được dùng trong những ví dụ này) và ba chữ số cuối là tên phiên bản của ứng dụng (3.1.0). Hình 1 cho thấy 2 ví dụ được phân chia dựa trên cả phiên bản nền tảng (Cấp API) và kích thước màn hình.

Hình 1. Lược đồ đề xuất cho mã phiên bản, sử dụng hai chữ số đầu tiên cho cấp độ API, các chữ số thứ hai và thứ ba cho kích thước màn hình tối thiểu và tối đa (1 – 4 cho biết từng kích thước trong số bốn kích thước) hoặc để biểu thị định dạng kết cấu và 3 chữ số cuối cùng cho phiên bản ứng dụng.

Lược đồ dành cho mã phiên bản này chỉ là đề xuất về cách bạn nên thiết lập một mẫu có thể mở rộng khi ứng dụng phát triển. Cụ thể, giao thức này không minh hoạ giải pháp xác định các định dạng nén kết cấu khác nhau. Một tuỳ chọn có thể là xác định bảng của riêng bạn chỉ định một số nguyên khác nhau cho mỗi định dạng nén khác nhau mà ứng dụng hỗ trợ (ví dụ: 1 có thể tương ứng với ETC1 và 2 là ATITC, v.v.).

Bạn có thể dùng bất kỳ giao thức nào bạn muốn, nhưng bạn nên xem xét cẩn thận cách các phiên bản tương lai của ứng dụng sẽ cần tăng mã phiên bản của ứng dụng, cũng như cách các thiết bị có thể nhận được bản cập nhật khi cấu hình thiết bị thay đổi (ví dụ: do bản cập nhật hệ thống) hoặc khi bạn sửa đổi cấu hình hỗ trợ cho một hoặc nhiều tệp APK.