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, thì bạn cần áp dụng một số phương pháp hay ngay từ đầu và tránh những cơn đau đầu không cần thiết vào 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 APK ứng dụng, mỗi ứng dụng bao gồm một lớp kích thước màn hình 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 APK
Khi cố gắng tạo một ứng dụng hoạt động trên hàng loạt nền tảng Android trên các thiết bị, đương 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ạn muốn tận dụng không gian của màn hình lớn nhưng vẫn hoạt động trên màn hình nhỏ, để sử dụng các tính năng API Android mới hoặc kết cấu hình ảnh có trên các thiết bị tiên tiến nhưng không bỏ qua các tính năng cũ. Có thể dường như ngay từ đầu, mặc dù hỗ trợ nhiều APK là giải pháp tốt nhất, nhưng điều này thường không phải là trường hợp. Phần Sử dụng Phần một APK thay vì trong hướng dẫn về nhiều APK cung cấp một số thông tin hữu ích về cách thực hiện tất cả những việc này chỉ bằng một APK, bao gồm cả việc sử dụng thư viện hỗ trợ của chúng tôi, và đường liên kết đến các tài nguyên trong suốt Hướng dẫn cho nhà phát triển Android.
Nếu bạn có thể quản lý APK này, việc giới hạn ứng dụng của bạn trong một APK duy nhất có một số lợi thế: bao gồm:
- Xuất bản và kiểm thử dễ dàng hơn
- Chỉ có một cơ sở mã cần 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 nhiều thiết bị chỉ hoạt động
- Bạn không phải lo lắng về lựa chọn ưu tiên về thị trường, hành vi khi "nâng cấp" từ một APK sang tiếp theo hoặc APK nào đi 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 đã tìm hiểu kỹ về chủ đề này 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 .
Lập biểu đồ các yêu cầu
Hãy bắt đầu bằng cách tạo một biểu đồ đơn giản để nhanh chóng xác định số lượng APK và màn hình mà bạn cần kích thước mà mỗi APK bao gồm. Thật may là bạn có thể dễ dàng lập biểu đồ các yêu cầu của mình một cách nhanh chóng, dễ dàng và để có tài liệu tham khảo dễ sử dụng sau này. Giả sử bạn muốn phân tách tệp APK theo hai phương diện, API và kích thước màn hình. Tạo một bảng có một hàng và cột cho mỗi cặp giá trị và màu sắc có thể có trong một số "blobs", mỗi màu đại diện cho một APK.
3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | + | |
nhỏ | |||||||||||
bình thường | |||||||||||
lớn | |||||||||||
xlarge |
Trên đây là ví dụ với 4 tệp APK. Màu xanh dương là dành cho thiết bị có màn hình nhỏ/bình thường, màu xanh lục là dành cho màn hình lớn thiết bị màn hình và Red dành cho các thiết bị có màn hình cực lớn, tất cả đều có phạm vi API từ 3 đến 10. Màu tím là trường hợp đặc biệt, vì nó dành cho mọi kích thước màn hình, nhưng chỉ dành cho API 11 trở lên. Quan trọng hơn, chỉ bằng cách chỉ cần nhìn vào biểu đồ này là bạn đã biết ngay tệp APK nào áp dụng cho mọi tổ hợp API/kích thước màn hình. Người nhận khởi động, bạn cũng có các tên mã đẹp cho mỗi máy, vì "Chúng tôi đã kiểm tra màu đỏ trên chưa?" rất nhiều dễ dàng hỏi cubie của bạn hơn là "Chúng tôi đã thử nghiệm APK từ 3 đến 10 cực đại so với Xoom chưa?" In hình này lập biểu đồ và cung cấp cho mọi người đang xử lý cơ sở mã của bạn. Cuộc sống nay đã dễ dàng hơn rất nhiều.
Đặt tất cả mã và tài nguyên chung vào một dự án thư viện
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, việc đầu tiên bạn nên làm đối với cơ sở mã và cho đến nay là việc quan trọng nhất. Hiện mọi thông tin đi vào dự án thư viện chỉ cần được cập nhật một lần (ví dụ: chuỗi được bản địa hoá ngôn ngữ, chủ đề 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 sai lầm mà có thể dễ dàng tránh được.
Lưu ý:Trong khi triển khai chi tiết về cách tạo và bao gồm các dự án thư viện nằm ngoài phạm vi của bài học này, bạn có thể nắm bắt nhanh chóng 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, rà soát cơ sở mã của bạn để tìm mọi tệp chuỗi, danh sách giá trị, giao diện đã bản địa hoá màu sắc, biểu tượng trình đơn và bố cục không thay đổi giữa các APK và đặt tất cả đều có trong dự án thư viện. Những đoạn mã không có nhiều thay đổi thì nên cũng thực hiện trong dự án thư viện. Bạn có thể sẽ thấy mình mở rộng phạm vi để thêm một hoặc hai phương thức từ APK vào APK.
Mặt khác, nếu bạn đang tạo ứng dụng từ đầu, hãy thử như viết mã trong dự án thư viện trước, sau đó chỉ chuyển mã xuống 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ư viện, sau đó thêm vào một thư viện khác, rồi thêm vào một thư viện 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
Mỗi tệp APK mà bạn sẽ phát hành nên có một dự án Android riêng. Dễ sắp xếp, hãy đặt dự án thư viện và tất cả dự án APK có liên quan vào cùng một thư mục mẹ. Ngoài ra, hãy nhớ rằng mỗi APK cần có cùng một tên gói, mặc dù các APK không nhất thiết phải dùng chung tên gói với thư viện. Nếu bạn có 3 APK theo lược đồ này mô tả trước đó, thư mục gốc có thể có dạng như sau:
alexlucas:~/code/multi-apks-root$ ls foo-blue foo-green foo-lib foo-purple 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. Khi xác định một hoạt động bắt đầu trong dự án thư viện, bạn sẽ có cơ hội đặt tất cả việc khởi chạy ứng dụng ở cùng một nơi để mỗi APK riêng lẻ không phải triển khai lại chế độ cài đặt "phổ quát" như khởi chạy Analytics, chạy kiểm tra giấy phép, v.v. quy trình khởi chạy không thay đổi nhiều giữa các tệp APK và tệp APK.
Điều chỉnh tệp kê khai
Khi người dùng tải xuống một ứng dụng sử dụng nhiều APK qua Google Play, thì Tệp APK để sử dụng được chọn bằng hai quy tắc đơn giản:
- Tệp kê khai phải cho thấy rằng một tệp APK cụ thể đủ điều kiện
- Trong số các APK đủ điều kiện, APK có số phiên bản cao nhất sẽ giành chiến thắng.
Ví dụ: hãy lấy tập hợp nhiều APK được mô tả trước đó và giả định rằng mỗi APK Tệp APK đã được thiết lập để hỗ trợ tất cả các kích thước màn hình lớn hơn "mục tiêu" của tệp APK kích thước màn hình. Hãy cùng xem biểu đồ mẫu trước đó:
3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | + | |
nhỏ | |||||||||||
bình thường | |||||||||||
lớn | |||||||||||
xlarge |
Do phạm vi bao phủ có thể trùng lặp nên chúng ta có thể mô tả khu vực được bao phủ bởi từng APK như nên:
- Màu xanh dương bao phủ tất cả các màn hình, minSDK 3.
- Màu xanh lục bao phủ Màn hình lớn trở lên, minSDK 3.
- Màu đỏ bao gồm màn hình rất lớn (thường là máy tính bảng), minSDK là 9.
- Màu tím bao phủ tất cả màn hình, minSDK là 11.
Lưu ý rằng có rất nhiều trường hợp trùng lặp trong các quy tắc đó. Ví dụ: một Thiết bị rất lớn có API 11 có thể chạy được bất kỳ tệp APK nào trong số 4 tệp APK được chỉ định. Tuy nhiên, bằng cách sử dụng quy tắc "số phiên bản cao nhất sẽ thắng", chúng ta có thể đặt thứ tự ưu tiên như sau:
Tím ≥ Đỏ ≥ Xanh lục ≥ Xanh dương
Tại sao bạn nên cho phép toàn bộ các trường hợp trùng lặp? Giả sử APK màu tím có một số yêu cầu về việc 2 người còn lại thì không. Trang Bộ lọc trên Google Play trong Hướng dẫn cho nhà phát triển Android có một danh sách toàn bộ các nguyên nhân có thể có. Ví dụ: giả sử Tím yêu cầu máy ảnh mặt trước. Trên thực tế, toàn bộ mục đích của Tím là sử dụng tính năng giải trí bằng camera trước! Nhưng hoá ra không phải tất cả các thiết bị có API từ 11 trở lên thậm chí CÓ camera mặt trước! Thật kinh hoàng!
May mắn là nếu người dùng đang duyệt Google Play từ một thiết bị như vậy, Google Play sẽ xem xét tệp kê khai, hãy thấy rằng Tím liệt kê camera mặt trước là yêu cầu rồi lặng lẽ bỏ qua, khi xác định được rằng Purple và thiết bị đó không phải là một điều phù hợp cho thiên đường kỹ thuật số. Sau đó, bạn sẽ thấy rằng Red không chỉ tương thích với các thiết bị xlarge mà còn không quan tâm đến việc có máy ảnh mặt trước hay không! Người dùng vẫn có thể tải ứng dụng xuống từ Google Play, bởi vì mặc dù toàn bộ sự cố xảy ra với camera trước, nhưng vẫn có một APK hỗ trợ Cấp độ API.
Để giữ tất cả các APK của bạn trên các "kênh phát hành" riêng biệt, bạn phải có một mã phiên bản tốt hệ thống. Bạn có thể tìm thấy mã phiên bản được đề xuất trên khu vực Mã phiên bản của hướng dẫn dành cho nhà phát triển của chúng tôi. Bạn nên đọc toàn bộ phần này, nhưng tóm lại, đối với bộ APK này, chúng ta sẽ sử dụng 2 chữ số để biểu thị minSDK, 2 chữ số để biểu thị kích thước màn hình tối thiểu/tối đa và 3 chữ số để biểu thị số bản dựng. Theo cách đó, khi thiết bị nâng cấp lên phiên bản Android mới, (ví dụ: từ 10 đến 11), mọi APK hiện đủ điều kiện và được ưu tiên hơn so với APK hiện đã cài đặt thiết bị sẽ coi là một "bản nâng cấp". Lược đồ số phiên bản, khi áp dụng cho ví dụ có thể có dạng như sau:
Xanh lam: 0304001, 0304002, 0304003...
Xanh lục: 0334001, 0334002, 0334003
Đỏ: 0344001, 0344002, 0344003...
Tím: 1104001, 1104002, 1104003...
Khi kết hợp tất cả những điều này, 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="0304001" android:versionName="1.0" package="com.example.foo"> <uses-sdk android:minSdkVersion="3" /> <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" /> ...
Màu lục:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="0334001" android:versionName="1.0" package="com.example.foo"> <uses-sdk android:minSdkVersion="3" /> <supports-screens android:smallScreens="false" android:normalScreens="false" android:largeScreens="true" android:xlargeScreens="true" /> ...
Màu đỏ:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="0344001" android:versionName="1.0" package="com.example.foo"> <uses-sdk android:minSdkVersion="3" /> <supports-screens android:smallScreens="false" android:normalScreens="false" android:largeScreens="false" android:xlargeScreens="true" /> ...
Tía:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1104001" android:versionName="1.0" package="com.example.foo"> <uses-sdk android:minSdkVersion="11" /> <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" /> ...
Lưu ý rằng về mặt kỹ thuật, nhiều APK sẽ hoạt động với thẻ màn hình hỗ trợ hoặc thẻ màn hình tương thích. Bạn nên sử dụng tính năng hỗ trợ màn hình và không nên sử dụng cả hai tính năng này. Việc này sẽ khiến mọi thứ trở nên phức tạp và tăng khả năng xảy ra lỗi. Ngoài ra, hãy lưu ý rằng thay vì tận dụng các giá trị mặc định (nhỏ và bình thường luôn là đúng theo mặc định), tệp kê khai sẽ đặt giá trị rõ ràng cho từng kích thước màn hình. Nhờ đó, bạn có thể tiết kiệm công việc không mấy dễ dàng – Ví dụ: tệp kê khai có SDK mục tiêu là < 9 sẽ có rất lớn tự động đặt thành false, vì kích thước đó chưa tồn tại. Vì vậy, hãy nói rõ ràng!
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 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ả APK phải có cùng tên gói.
- Tất cả APK phải được ký bằng cùng một chứng chỉ.
- Nếu các tệp APK trùng lặp trong phiên bản nền tảng, thì phiên bản có minSdkVersion cao hơn phải có mã phiên bản cao hơn.
- Mọi kích thước màn hình bạn muốn APK hỗ trợ, được đặt thành true trong tệp kê khai. Mọi kích thước màn hình mà bạn muốn tránh, đặt thành false.
- Kiểm tra kỹ bộ lọc tệp kê khai của bạn để biết thông tin xung đột (APK chỉ hỗ trợ cupcake trên màn hình XLARGE sẽ không được hiển thị cho bất cứ ai)
- Tệp kê khai của mỗi APK phải là duy nhất trên ít nhất một trong số các màn hình, hoạ tiết OpenGL hoặc phiên bản nền tảng.
- Hãy cố gắng kiểm thử từng tệp APK trên ít nhất một thiết bị. Theo đó, bạn có một trong những các trình mô phỏng thiết bị có thể tuỳ chỉnh trong doanh nghiệp trên máy phát triển của bạn. Chúc bạn thành công!
Bạn cũng nên kiểm tra APK đã biên dịch trước khi tung ra thị trường để đảm bảo không có mọi điều bất ngờ có thể ẩn ứng dụng của bạn trên Google Play. Điều này thực sự khá đơn giản bằng cách sử dụng "aapt" . Aapt (Công cụ đóng gói tài nguyên Android) là một phần trong 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 lợi để 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 kết quả aapt, hãy nhớ kiểm tra để đảm bảo rằng bạn không có các giá trị xung đột cho hỗ trợ màn hình và màn hình tương thích và bạn không có "tính năng sử dụng" ngoài ý muốn giá trị được thêm vào nhờ những quyền bạn đặt trong tệp kê khai. Trong ví dụ trên, tệp APK sẽ không hiển thị với hầu hết (hoặc 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 SEND_SMS, yêu cầu về tính năng của android.hardware.telephony được ngầm thêm vào. 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 để báo cáo là kích thước màn hình cực lớn và sở hữu 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 ngầm thêm vào. 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 bạn hoàn tất danh sách kiểm tra trước khi phát hành, hãy tải các 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 thiết bị thử nghiệm bất kỳ mà bạn có thể phải đảm bảo rằng APK đang nhắm đến các thiết bị dự định. Xin chúc mừng, bạn đã hoàn tất!