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 APK trên Google Play, bạn cần áp dụng một số phương pháp hay ngay từ đầu để tránh những rắc rối không đáng có 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 của ứng dụng, mỗi tệp APK hỗ trợ một tập hợp con định dạng hoạ tiết OpenGL khác nhau. Bạn cũng sẽ có được một số công cụ cần thiết để duy trì cơ sở mã APK nhiều 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ả các thiết bị chạy Android hiện có, 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 thiết bị đó có hỗ trợ cùng một bộ kết cấu GL hay không. Lúc đầu, có vẻ như việc hỗ trợ nhiều APK là giải pháp tốt nhất, nhưng thường thì không phải vậy. Phần Sử dụng một tệp APK trong hướng dẫn dành cho nhà phát triển về nhiều tệp APK có một số thông tin hữu ích về cách thực hiện việc này bằng một tệp APK, bao gồm cả cách phát hiện các định dạng kết cấu được hỗ trợ trong thời gian chạy. Tuỳ thuộc vào trường hợp của bạn, bạn có thể dễ dàng đóng gói tất cả định dạng với ứng dụng và chỉ cần chọn định dạng nào sẽ sử dụng trong thời gian chạy.
Nếu bạn có thể quản lý tệp APK này, việc giới hạn ứng dụng trong một tệp APK duy nhất sẽ có một số ưu điểm, trong đó có:
- Xuất bản và kiểm thử dễ dàng hơn
- Chỉ có một cơ sở mã để duy trì
- Ứ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ị chỉ hoạt động
- Bạn không phải lo lắng về lựa chọn ưu tiên của thị trường, hành vi "nâng cấp" từ APK này sang APK khác hoặc APK nào phù hợp 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ủ đề này, tiếp thu tài liệu một cách hiệu quả trong các tài nguyên được liên kết, đồng thời xác định rằng nhiều tệp 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
Hướng dẫn dành cho nhà phát triển Android cung cấp tài liệu tham khảo hữu ích về một số hoạ tiết phổ biến được hỗ trợ trên trang supports-gl-texture. Trang này cũng chứa một số gợi ý về những điện thoại (hoặc dòng điện thoại) hỗ trợ các định dạng hoạ tiết cụ thể. Xin lưu ý rằng bạn nên hỗ trợ ETC1 cho một trong các tệp APK của mình, vì tất cả các thiết bị chạy Android hỗ trợ thông số kỹ thuật OpenGL ES 2.0 đều hỗ trợ định dạng kết cấu đó.
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ể là ETC1, một định dạng mặc định thực sự vững chắc về hiệu suất và khả năng tương thích). Sau đó, tô màu trong biểu đồ sao cho mỗi ô đại diện cho một tệp APK.
ETC1 | ATI | PowerVR |
Việc tô màu trong biểu đồ không chỉ giúp hướng dẫn này trở nên ít đơn sắc hơn mà còn giúp giao tiếp 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ì "APK hỗ trợ định dạng kết cấu ETC1", v.v.
Đặt tất cả mã và tài nguyên chung vào một dự án thư viện
Cho dù bạn đang sửa đổi một ứng dụng Android hiện có hay bắt đầu một ứng dụng từ đầu, đây là điều đầu tiên bạn nên làm với cơ sở mã và quan trọng nhất. Mọi nội dung đi vào dự án thư viện chỉ cần được cập nhật một lần (hãy nghĩ đến các chuỗi được bản địa hoá theo ngôn ngữ, giao diện màu sắc, lỗi được khắc phục trong mã dùng chung), giúp cải thiện thời gian phát triển và giảm khả năng mắc lỗi mà bạn có thể dễ dàng tránh được.
Lưu ý: Mặc dù thông tin chi tiết về cách triển khai để tạo và đưa các dự án thư viện vào nằm ngoài phạm vi của bài học này, nhưng bạn có thể nắm bắt nhanh bằng cách đọc bài viết 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 trong cơ sở mã của bạn 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 sẽ không thay đổi trên các APK, đồng thời đưa tất cả vào dự án thư viện. Mã không thay đổi nhiều cũng nên được đưa vào dự án thư viện. Bạn có thể sẽ thấy mình 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 nhiều nhất có thể, sau đó chỉ di chuyển mã xuống một tệp APK riêng lẻ nếu cần. Việc này sẽ dễ quản lý hơn nhiều về lâu dài so với việc thêm blob vào một thư mục, rồi thêm vào một thư mục khác, rồi thêm vào một thư mục khác, sau đó nhiều tháng sau mới tìm cách xem liệu blob này có thể được chuyển lên phần thư viện mà không làm hỏng bất kỳ nội dung nào không.
Tạo dự án APK mới
Bạn nên có một dự án Android riêng cho mỗi tệp APK mà bạn sắp 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 có liên quan trong 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ù 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 đồ mô tả ở trên, 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 tham chiếu cho 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 một hoạt động bắt đầu trong dự án thư viện sẽ giúp bạn có cơ hội đưa tất cả các hoạt động khởi chạy ứng dụng vào một nơi, nhờ đó, mỗi tệp APK riêng lẻ không phải triển khai lại các tác vụ "phổ quát" như khởi chạy Analytics, chạy quy trình 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 này sang APK khác.
Đ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 xuống thông qua Google Play, tệp APK chính xác để sử dụng sẽ được chọn theo 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 tệp APK đủ điều kiện, tệp có số phiên bản cao nhất sẽ chiến thắng
- Nếu bất kỳ định dạng kết cấu nào được liệt kê trong tệp APK của bạn được thiết bị trên thị trường hỗ trợ, thì thiết bị đó đượ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. Điều này có nghĩa là bạn nên rất cẩn thận khi sử dụng nhiều định dạng GL trong cùng một ứng dụng. Nếu bạn sử dụng PowerVR 99% thời gian, nhưng sử dụng ETC1 cho màn hình chờ, chẳng hạn như... Sau đó, tệp kê khai của bạn sẽ cho biết việc hỗ trợ 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 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 tệp APK để nhắm đến các thiết bị khác nhau dựa trên khả năng hỗ trợ kết cấu GL, thì mỗi tệp APK sẽ có một định dạng kết cấu.
Điều này thực sự khiến tính năng hỗ trợ kết cấu 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ị chỉ có một cấp độ API và một kích thước màn hình, còn việc hỗ trợ một loạt các cấp độ API và kích thước màn hình là tuỳ thuộc vào APK. 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ự trùng lặp về việc một thiết bị hỗ trợ nhiều APK, nhưng giải pháp vẫn 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ị.
FooPhone | Nexus S | Evo |
ETC1 | ETC1 | ETC1 |
Công nghệ cảm biến công suất | ATI TC |
Giả sử các định dạng PowerVR và ATI đều được ưu tiên hơn ETC1 khi có sẵn, theo quy tắc "số phiên bản cao nhất sẽ giành chiến thắng", nếu chúng ta đặt thuộc tính versionCode trong mỗi tệp APK sao cho màu đỏ ≥ xanh lục ≥ xanh dương, thì cả Đỏ và Xanh lục sẽ luôn được chọn thay vì Xanh dương trên thiết bị hỗ trợ các định dạng này. Nếu có thiết bị hỗ trợ cả Đỏ và Xanh lục thì màu đỏ sẽ được chọn.
Để giữ tất cả tệp APK của bạn trên các "kênh phát hành" riêng biệt, bạn cần có một lược đồ mã phiên bản hiệu quả. Bạn có thể tìm thấy mã được đề xuất trong 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ý 1 trong 3 kích thước có thể có, nên bạn chỉ cần phân tách từng tệp APK bằng 1.000 và tăng dần từ đó. Mã có thể như sau:
Xanh dương: 1001, 1002, 1003, 1004...
Xanh lục: 2001, 2002, 2003, 2004...
Đỏ: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 lại 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 những điều này chỉ liên quan đến nhiều tệp APK và không thể hiện danh sách kiểm tra đầy đủ cho tất cả ứng dụng được tải lên Google Play.
- Tất cả tệp APK phải có cùng tên gói
- Tất cả tệp APK phải được ký bằng cùng một chứng chỉ
- Kiểm tra kỹ bộ lọc tệp kê khai để tìm thông tin xung đột (không ai sẽ thấy tệp APK chỉ hỗ trợ bánh cupcake trên màn hình XLARGE)
- 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 các màn hình, kết cấu OpenGL hoặc phiên bản nền tảng được hỗ trợ
- Hãy thử kiểm thử từng tệp APK trên ít nhất một thiết bị. Ngoài ra, bạn có một trong những trình mô phỏng thiết bị dễ tuỳ chỉnh nhất trong doanh nghiệp trên máy phát triển của mình. Chúc bạn thành công!
Bạn cũng nên kiểm tra tệp APK đã biên dịch trước khi đẩy ra thị trường để đảm bảo không có điều gì bất ngờ 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 khi 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à một công cụ rất tiện dụng để kiểm tra các ứng dụ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 kiểm tra đầu ra aapt, hãy nhớ kiểm tra để đảm bảo 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, cũng như không có các giá trị "sử dụng tính năng" không mong muốn được thêm do các quyền bạn đặt trong tệp kê khai. Trong ví dụ trên, hầu hết các thiết bị (nếu không phải tất cả) sẽ không thấy tệp APK.
Tại sao? Bằng cách thêm quyền bắt buộc SEND_SMS, yêu cầu về tính năng của android.hardware.telephony đã được thêm ngầm ẩn. Vì hầu hết (nếu không phải tất 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, Google Play sẽ lọc ra 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 với kích thước đủ lớn để có thể báo cáo là có kích thước màn hình cực lớn và sở hữu phần cứng điện thoại.
May mắn là bạn có thể dễ dàng khắc phục vấn đề này bằng cách thêm nội dung 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. Nếu muốn tệp APK hiển thị trên TV không phải là thiết bị màn hình cảm ứng, bạn nên thêm nội dung sau vào tệp kê khai:
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
Sau khi hoàn tất danh sách kiểm tra trước khi phát hành, hãy tải tệp APK lên Google Play. Có thể mất một chút thời gian để ứng dụng xuất hiện khi bạn duyệt xem Google Play. Tuy nhiên, khi ứng dụng xuất hiện, hãy thực hiện bước 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 bạn có để đảm bảo rằng các tệp APK đang nhắm đến các thiết bị dự kiến. Xin chúc mừng, bạn đã hoàn tất!