Tạo nhiều APK cho các kết cấu GL khác nhau

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.

Khi phát triển ứng dụng Android để tận dụng nhiều tệp APK trên Google Play, bạn cần áp dụng một số phương pháp hay ngay từ đầu và ngăn chặn những vấn đề không cần thiết trong quá trình phát triển. Bài học này sẽ hướng dẫn bạn cách tạo nhiều tệp APK cho ứng dụng, mỗi tệp APK hỗ trợ một tập hợp con định dạng hoạ tiết OpenGL. Bạn cũng sẽ có được một số công cụ cần thiết để việc duy trì nhiều cơ sở mã APK suôn sẻ nhất có thể.

Xác nhận rằng bạn cần nhiều tệp APK

Khi cố gắng tạo một ứng dụng hoạt động trên tất cả thiết bị chạy Android có sẵn, hiển nhiên là bạn muốn ứng dụng của mình trông đẹp nhất trên từng thiết bị riêng lẻ, bất kể tất cả các ứng dụng đó không hỗ trợ cùng một bộ hoạ tiết GL. Ngay từ đầu, có vẻ như giải pháp tốt nhất là hỗ trợ nhiều tệp APK, nhưng thường không phải như vậy. Mục Sử dụng một tệp APK thay thế trong hướng dẫn cho nhà phát triển nhiều tệp APK cung cấp một số thông tin hữu ích về cách hoàn thành việc này bằng một tệp APK duy nhất, bao gồm cả cách phát hiện định dạng kết cấu được hỗ trợ trong thời gian chạy. Tuỳ thuộc vào tình huống của bạn, việc nhóm tất cả định dạng với ứng dụng có thể dễ dàng hơn và chỉ cần chọn một định dạng để sử dụng trong thời gian chạy.

Nếu bạn có thể quản lý ứng dụng đó, việc giới hạn ứng dụng trong một tệp APK duy nhất sẽ có một số lợi ích như sau:

  • Xuất bản và thử nghiệm dễ dàng hơn
  • Chỉ có một cơ sở mã duy nhất
  • Ứng dụng của bạn có thể thích ứng với các thay đổi về cấu hình thiết bị
  • Tính năng khôi phục ứng dụng trên các thiết bị vẫn hoạt động
  • Bạn không phải lo lắng về mức độ ưu tiên của thị trường, hành vi từ việc "nâng cấp" từ APK này lên APK tiếp theo hay APK nào sẽ đi kèm với loại thiết bị nào

Phần còn lại của bài học này giả định rằng bạn đã nghiên cứu chủ đề, chuyên sâu nghiên cứu tài liệu trong các tài nguyên được liên kết và xác định rằng nhiều APK là đường dẫn phù hợp cho ứng dụng của bạn.

Lập biểu đồ các yêu cầu của bạn

Hướng dẫn cho nhà phát triển Android cung cấp tài liệu tham khảo hữu ích về một số kết cấu được hỗ trợ phổ biến trên trang supports-gl-texture. Trang này cũng chứa một số gợi ý về việc điện thoại nào (hoặc dòng điện thoại) hỗ trợ các định dạng hoạ tiết cụ thể. Lưu ý: Nhìn chung, bạn nên sử dụng một trong các tệp APK hỗ trợ ETC1, vì định dạng kết cấu đó được tất cả thiết bị chạy Android hỗ trợ thông số kỹ thuật OpenGL ES 2.0.

Vì hầu hết thiết bị chạy Android đều hỗ trợ nhiều định dạng kết cấu, nên bạn cần thiết lập thứ tự ưu tiên. Tạo một biểu đồ bao gồm tất cả các định dạng mà ứng dụng của bạn sẽ hỗ trợ. Ô ở ngoài cùng bên trái sẽ có mức độ ưu tiên thấp nhất (Có thể sẽ là ETC1, một chế độ mặc định thực sự vững chắc về hiệu suất và khả năng tương thích). Sau đó, hãy tô màu trong biểu đồ sao cho mỗi ô đại diện cho một tệp APK.

ETC1 ATI Công nghệ thực tế ảo (PowerVR)

Việc tô màu trong biểu đồ không chỉ giúp hướng dẫn này bớt đơn sắc hơn – Hướng dẫn này còn có cách giao tiếp nội bộ trong nhóm dễ dàng hơn – Giờ đây, bạn chỉ cần gọi mỗi APK là "xanh dương", "xanh lục" hoặc "đỏ", thay vì "Tệp hỗ trợ định dạng hoạ tiết ETC1", v.v.

Đặt tất cả mã và tài nguyên phổ biến vào dự án thư viện

Cho dù bạn đang sửa đổi một ứng dụng Android hiện có hay tạo một ứng dụng từ đầu, đây là việc đầu tiên bạn nên làm đối với cơ sở mã và là điều quan trọng nhất. Bạn chỉ cần cập nhật mọi thứ trong dự án thư viện một lần (ví dụ: các chuỗi được bản địa hoá theo ngôn ngữ, giao diện màu, lỗi được sửa trong mã dùng chung), giúp cải thiện thời gian phát triển và giảm khả năng xảy ra lỗi.

Lưu ý: Mặc dù chi tiết triển khai về cách tạo và thêm dự án thư viện nằm ngoài phạm vi của bài học này, nhưng bạn có thể tăng tốc bằng cách đọc nội dung Tạo thư viện Android.

Nếu bạn đang chuyển đổi một ứng dụng hiện có để sử dụng tính năng hỗ trợ nhiều APK, hãy tìm kiếm cơ sở mã của mọi tệp chuỗi đã bản địa hoá, danh sách giá trị, màu giao diện, biểu tượng trình đơn và bố cục không thay đổi trong các tệp APK rồi đưa tất cả vào dự án thư viện. Mã không thay đổi nhiều cũng sẽ được đưa vào dự án thư viện. Có thể bạn sẽ phải mở rộng các lớp này để thêm một hoặc hai phương thức từ APK sang APK.

Mặt khác, nếu bạn đang tạo ứng dụng từ đầu, hãy cố gắng viết mã trong dự án thư viện trước tiên nhiều nhất có thể, sau đó chỉ chuyển mã xuống một APK riêng lẻ nếu cần. Điều này sẽ dễ quản lý về lâu dài hơn nhiều so với việc thêm blob này vào một, rồi đến một lần khác, rồi nhiều tháng sau đó cố gắng tìm hiểu xem liệu blob này có thể được di chuyển lên phần thư viện mà không cần sửa đổi bất cứ điều gì hay không.

Tạo dự án APK mới

Nên có một dự án Android riêng cho từng APK mà bạn sẽ phát hành. Để dễ dàng sắp xếp, hãy đặt dự án thư viện và tất cả dự án APK liên quan vào cùng một thư mục mẹ. Ngoài ra, hãy nhớ rằng mỗi tệp APK cần có cùng tên gói, mặc dù các tệp APK này không nhất thiết phải chia sẻ tên gói với thư viện. Nếu bạn có 3 tệp APK theo lược đồ được mô tả trước đó, thì thư mục gốc của bạn có thể có dạng như sau:

alexlucas:~/code/multi-apks-root$ ls
foo-blue
foo-green
foo-lib
foo-red

Sau khi tạo các dự án, hãy thêm dự án thư viện đó làm tệp tham chiếu đến từng dự án APK. Nếu có thể, hãy xác định Hoạt động bắt đầu trong dự án thư viện và mở rộng Hoạt động đó trong dự án APK. Việc xác định hoạt động khởi động trong dự án thư viện sẽ giúp bạn có thể đưa tất cả hoạt động khởi chạy ứng dụng của mình vào cùng một nơi để mỗi tệp APK riêng lẻ không phải triển khai lại các tác vụ "chung" như khởi chạy Analytics, chạy các bước kiểm tra giấy phép và mọi quy trình khởi chạy khác không thay đổi nhiều từ APK sang APK.

Điều chỉnh tệp kê khai

Khi người dùng tải một ứng dụng sử dụng nhiều tệp APK thông qua Google Play, hệ thống sẽ chọn đúng tệp APK cần dùng bằng một số quy tắc đơn giản:

  • Tệp kê khai phải cho thấy rằng APK cụ thể đó đủ điều kiện
  • Trong số các APK đủ điều kiện, số phiên bản cao nhất sẽ chiến thắng
  • Nếu bất kỳ định dạng hoạ tiết nào liệt kê trong APK của bạn được thiết bị trên thị trường hỗ trợ, thì thiết bị đó sẽ được coi là đủ điều kiện

Đối với Kết cấu GL, quy tắc cuối cùng đó rất quan trọng. Ví dụ: điều này có nghĩa là bạn nên rất cẩn thận khi sử dụng các định dạng GL khác nhau trong cùng một ứng dụng. Nếu bạn sử dụng PowerVR 99% thời gian, nhưng lại sử dụng ETC1 cho, giả sử, màn hình chờ... Sau đó, tệp kê khai của bạn phải cho thấy sự hỗ trợ cho cả hai định dạng. Một thiết bị chỉ hỗ trợ ETC1 sẽ được coi là tương thích, ứng dụng của bạn sẽ tải ứng dụng xuống và người dùng sẽ thấy một số thông báo sự cố ly kỳ. Trường hợp phổ biến là nếu bạn đang sử dụng nhiều APK để nhắm mục tiêu đến các thiết bị khác nhau dựa trên hỗ trợ kết cấu GL, thì đó sẽ là một định dạng kết cấu cho mỗi APK.

Điều này thực sự khiến hỗ trợ kết cấu hơi khác một chút so với hai kích thước APK khác, cấp độ API và kích thước màn hình. Mỗi thiết bị nhất định chỉ có một cấp độ API và một kích thước màn hình. APK có hỗ trợ một loạt các cấp độ đó hay không. Với kết cấu, APK thường sẽ hỗ trợ một kết cấu và thiết bị sẽ hỗ trợ nhiều kết cấu. Thường sẽ có sự chồng chéo khi một thiết bị hỗ trợ nhiều tệp APK, nhưng giải pháp thì giống nhau: Mã phiên bản.

Ví dụ: hãy lấy một vài thiết bị và xem có bao nhiêu tệp APK được xác định trước đó phù hợp với từng thiết bị.

Điện thoại Nexus S Evo
ETC1 ETC1 ETC1
Công nghệ thực tế ảo (PowerVR) TC ATI

Giả sử cả hai định dạng PowerVR và ATI đều được ưu tiên hơn ETC1 khi có sẵn, hơn so với quy tắc "số phiên bản cao nhất chiến thắng", nếu chúng ta đặt thuộc tính versionCode trong mỗi APK sao cho màu đỏ ≥ màu xanh lục ≥ màu xanh dương, thì cả màu đỏ và màu xanh lục sẽ luôn được chọn thay vì màu xanh dương trên các thiết bị hỗ trợ, và nếu có thiết bị hỗ trợ cả màu đỏ và màu xanh lục, thì màu đỏ sẽ được chọn.

Để đảm bảo tất cả tệp APK của bạn luôn nằm trên "kênh phát hành" riêng biệt, bạn phải có một lược đồ mã phiên bản phù hợp. Bạn có thể tìm thấy mã phiên bản được đề xuất trên phần Mã phiên bản trong hướng dẫn cho nhà phát triển của chúng tôi. Vì tập hợp tệp APK mẫu chỉ xử lý một trong 3 chiều có thể có, nên bạn chỉ cần phân tách từng tệp APK thêm 1.000 rồi tăng dần từ đó. Mã này có thể có dạng như sau:

Màu xanh dương: 1001, 1002, 1003, 1004...
Màu xanh lục: 2001, 2002, 2003, 2004...
Màu đỏ:3001, 3002, 3003, 3004...

Kết hợp tất cả lại với nhau, tệp kê khai Android của bạn có thể sẽ có dạng như sau:

Màu lam:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1001" android:versionName="1.0" package="com.example.foo">
    <supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
    ...

Màu lục:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="2001" android:versionName="1.0" package="com.example.foo">
    <supports-gl-texture android:name="GL_AMD_compressed_ATC_texture" />
    ...

Màu đỏ:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="3001" android:versionName="1.0" package="com.example.foo">
    <supports-gl-texture android:name="GL_IMG_texture_compression_pvrtc" />
    ...

Xem danh sách kiểm tra trước khi ra mắt

Trước khi tải lên Google Play, hãy kiểm tra kỹ các mục sau. Hãy nhớ rằng các thử nghiệm này liên quan cụ thể đến nhiều APK và không hề đại diện cho danh sách kiểm tra hoàn chỉnh cho tất cả ứng dụng được tải lên Google Play.

  • Tất cả APK phải có cùng tên gói
  • Tất cả APK đều phải được ký bằng cùng một chứng chỉ
  • Kiểm tra kỹ bộ lọc tệp kê khai của bạn để tìm thông tin xung đột (APK chỉ hỗ trợ cupcake trên màn hình XLARGE sẽ không hiển thị cho bất kỳ ai)
  • Tệp kê khai của mỗi tệp APK phải là duy nhất trên ít nhất một trong số các phiên bản màn hình, hoạ tiết OpenGL hoặc nền tảng được hỗ trợ
  • Thử thử nghiệm từng tệp APK trên ít nhất một thiết bị. Ngoài ra, bạn còn có một trong những trình mô phỏng thiết bị dễ tuỳ chỉnh nhất trên cỗ máy phát triển. Câu đố thôi!

Bạn cũng nên kiểm tra APK đã biên dịch trước khi phát hành ra thị trường, để đảm bảo không có bất kỳ sự bất ngờ nào có thể ẩn ứng dụng của bạn trên Google Play. Việc này thực sự khá đơn giản bằng cách sử dụng công cụ "aapt". Aapt (Công cụ đóng gói tài nguyên Android) là một phần của quy trình xây dựng để tạo và đóng gói ứng dụng Android, đồng thời cũng là công cụ rất tiện dụng để kiểm tra chúng.

>aapt dump badging
package: name='com.example.hello' versionCode='1' versionName='1.0'
sdkVersion:'11'
uses-permission:'android.permission.SEND_SMS'
application-label:'Hello'
application-icon-120:'res/drawable-ldpi/icon.png'
application-icon-160:'res/drawable-mdpi/icon.png'
application-icon-240:'res/drawable-hdpi/icon.png'
application: label='Hello' icon='res/drawable-mdpi/icon.png'
launchable-activity: name='com.example.hello.HelloActivity'  label='Hello' icon=''
uses-feature:'android.hardware.telephony'
uses-feature:'android.hardware.touchscreen'
main
supports-screens: 'xlarge'
supports-any-density: 'true'
locales: '--_--'
densities: '120' '160' '240'

Khi bạn kiểm tra đầu ra aapt, hãy nhớ kiểm tra để chắc chắn rằng bạn không có các giá trị xung đột cho màn hình hỗ trợ và màn hình tương thích, đồng thời không có các giá trị "uses-feature" ngoài ý muốn được thêm vào do các quyền bạn đặt trong tệp kê khai. Trong ví dụ trên, APK sẽ không hiển thị với hầu hết, nếu không phải tất cả thiết bị.

Tại sao? Bằng cách thêm quyền bắt buộc GỬI_SMS, yêu cầu tính năng của android.hardware.telephony đã được hoàn toàn thêm vào. Vì hầu hết (nếu không phải tất cả) các thiết bị cực lớn đều là máy tính bảng không có phần cứng điện thoại, nên Google Play sẽ lọc ra tệp APK này trong những trường hợp này, cho đến khi các thiết bị trong tương lai xuất hiện, cả hai đều đủ lớn để báo cáo là có kích thước màn hình cực lớn và có phần cứng điện thoại.

Rất may là bạn có thể dễ dàng khắc phục vấn đề này bằng cách thêm đoạn mã sau vào tệp kê khai:

<uses-feature android:name="android.hardware.telephony" android:required="false" />

Yêu cầu android.hardware.touchscreen cũng được thêm ngầm. Nếu muốn APK của mình hiển thị trên TV là thiết bị không phải màn hình cảm ứng, bạn nên thêm đoạn mã sau vào tệp kê khai:

<uses-feature android:name="android.hardware.touchscreen" android:required="false" />

Sau khi bạn hoàn tất danh sách kiểm tra trước khi phát hành, hãy tải APK của bạn lên Google Play. Có thể mất một chút thời gian để ứng dụng xuất hiện khi duyệt Google Play, nhưng khi ứng dụng xuất hiện, hãy kiểm tra lần cuối. Tải ứng dụng xuống bất kỳ thiết bị thử nghiệm nào mà bạn có thể phải thực hiện để đảm bảo rằng các APK đang nhắm mục tiêu đến các thiết bị mục tiêu. Xin chúc mừng, bạn đã hoàn tất!