Tạo nhiều APK cho các kích thước màn hình 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 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 nhiều kích thước của thiết bị Android, tất nhiên bạn muốn ứng dụng của mình tận dụng tất cả không gian có sẵn trên các thiết bị lớn hơn, mà không làm giảm khả năng tương thích hoặc khả năng hữu dụng trên các màn hình nhỏ hơn. Ngay từ đầu, bạn có thể cho rằng 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 đúng. Phần Sử dụng một APK Thay vào đó, trong hướng dẫn cho nhà phát triển về nhiều tệp APK, bạn sẽ thấy một số thông tin hữu ích về cách thực hiện điều này bằng một APK duy nhất, bao gồm cả việc sử dụng thư viện hỗ trợ của chúng tôi. Bạn cũng nên đọc hướng dẫn về cách hỗ trợ nhiều màn hình. Thậm chí, bạn có thể tải một thư viện hỗ trợ xuống bằng SDK Android để sử dụng các mảnh trên các thiết bị chạy trước Honeycomb (giúp hỗ trợ nhiều màn hình trong một tệp APK dễ dàng hơn nhiều).

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 vào một APK duy nhất có một số lợi thế: bao gồm:

  • Dễ dàng phát hành và kiểm thử 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 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 của bạn

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. May mắn thay, 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 và dễ dàng, đồng thời có tài liệu tham khảo sau này. Bắt đầu với một hàng gồm các ô đại diện cho nhiều kích thước màn hình đã có trên nền tảng Android.

nhỏ bình thường lớn xlarge

Bây giờ, chỉ cần tô màu trong biểu đồ sao cho mỗi màu đại diện cho một APK. Sau đây là ví dụ về cách có thể áp dụng từng APK cho một phạm vi kích thước màn hình nhất định.

nhỏ bình thường lớn xlarge

Tuỳ thuộc vào nhu cầu, bạn cũng có thể có hai tệp APK, "nhỏ và mọi thứ khác" hoặc "rất lớn và mọi thứ khác". Việc tô màu biểu đồ cũng giúp việc giao tiếp trong nhóm trở nên dễ dàng hơn. Bạn có thể giờ đây, chỉ cần gọi mỗi APK là "xanh dương", "xanh lục" hoặc "đỏ", cho dù có bao nhiêu loại màn hình nó bao gồm.

Đặ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. 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. 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 cố gắng viết mã trong dự án thư viện trước tiên, sau đó chỉ di chuyển mã đó xuống một tệp APK riêng lẻ nếu cần. Về lâu dài, việc này sẽ dễ quản lý hơn nhiều so với việc thêm nó vào một tiếp đến một lần nữa, rồi lại tiếp tục vài tháng rồi cố gắng tìm hiểu xem liệu blob này có thể được di chuyển lên không vào phần thư viện mà không làm hỏng gì cả.

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ễ 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 APK cần có cùng một tên gói, mặc dù các tệp APK này 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 tệp APK theo lược đồ đượ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. 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 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 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 tệp APK đủ điều kiện, tệp có số phiên bản cao nhất sẽ chiến thắng

Ví dụ: hãy lấy tập hợp nhiều tệp APK được mô tả ở trên và giả sử rằng mỗi tệp APK đã được thiết lập để hỗ trợ tất cả kích thước màn hình lớn hơn kích thước màn hình "mục tiêu" của tệp đó. Được chụp riêng, phạm vi có thể của mỗi APK sẽ như sau:

nhỏ bình thường lớn xlarge
nhỏ bình thường lớn xlarge
nhỏ bình thường lớn xlarge

Tuy nhiên, bằng cách sử dụng quy tắc "số phiên bản cao nhất sẽ 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ì biểu đồ sẽ thu gọn hiệu quả thành như sau:

nhỏ bình thường lớn xlarge

Bây giờ, hãy giả định thêm rằng APK Red có một số yêu cầu về nó mà hai APK còn lại thì không. Chiến lược phát hành đĩa đơn Trang Bộ lọc trên Google Play của Android Hướng dẫn cho nhà phát triển có một danh sách toàn bộ các nguyên nhân có thể có. Ví dụ: giả sử màu đỏ yêu cầu máy ảnh mặt trước. Trên thực tế, toàn bộ điểm quan trọng của APK màu đỏ là sử dụng thêm không gian màn hình còn trống để thực hiện các tính năng giải trí bằng máy ảnh mặt trước đó. Nhưng hoá ra, không phải tất cả thiết bị cực lớn thậm chí đều CÓ máy ảnh mặt trước! Kinh dị thật!

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, thấy rằng Red liệt kê camera mặt trước là yêu cầu và lặng lẽ bỏ qua nó, xác định rằng Red và thiết bị đó không phải là một trong hai "thiên đường kỹ thuật số". Sau đó, ứng dụng sẽ thấy Màu xanh lục không chỉ tương thích với các thiết bị cực lớn mà còn không quan tâm đến việc có camera trước! Người dùng vẫn có thể tải ứng dụng xuống từ Google Play 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ợ màn hình cụ thể đó kích thước.

Để 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. Vì tập hợp APK ví dụ chỉ xử lý một trong 3 khả năng thì chỉ cần phân tách từng APK 1000 và tăng dần từ đó là đủ. Mã này có thể có dạng như sau:

Xanh lam: 1001, 1002, 1003, 1004...
Màu xanh lá cây: 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ể trông giố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-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="2001" android:versionName="1.0" package="com.example.foo">
    <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="3001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="false"
        android:xlargeScreens="true" />
    ...

Lưu ý rằng về mặt kỹ thuật, nhiều APK sẽ hoạt động với các màn hình hỗ trợ hoặc thẻ màn hình tương thích. Hỗ trợ màn hình thường được ưu tiên, và nói chung bạn không nên sử dụng cả hai thẻ trong cùng một tệp kê khai. Nó làm cho mọi thứ trở nên phức tạp một cách không cần thiết và tăng khả năng xảy ra lỗi. Cũng xin lưu ý rằng thay vì tận dụng các giá trị mặc định (nhỏ và thông thường luôn đúng theo mặc định), tệp kê khai đã đặt giá trị rõ ràng cho từng kích thước màn hình. Điều này có thể giúp bạn bớt đau đầu. Ví dụ: tệp kê khai có SDK mục tiêu của < 9 sẽ được tự động đặt thành false (vô cùng lớn), vì kích thước đó chưa tồn tại. Vì vậy, hãy nêu rõ!

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 đây là có liên quan cụ thể đến nhiều APK và không hề trình bày danh sách kiểm tra hoàn chỉnh cho tất cả ứng dụng khác đang được tải lên Google Play.

  • Tất cả 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ỉ
  • Đặt mọi kích thước màn hình mà bạn muốn APK hỗ trợ 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ỹ các 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)
  • Mỗi tệp kê khai của APK phải là duy nhất trên ít nhất một trong số các màn hình, kết cấu 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. Cố lên!

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 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 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 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 nhìn 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 ngầm thêm vào. Vì hầu hết (nếu không phải tất cả) thiết bị xlarge đề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, vừa đủ lớn để báo cáo là kích thước màn hình xlarge và có phần cứng điện thoại.

Rất may là vấn đề này có thể dễ dàng được khắc phục 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 bạn muốn APK của mình hiển thị trên TV là thiết bị không có 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 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 duyệt qua Google Play, nhưng khi ứng dụng xuất hiện, thực hiện 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 tệp APK đang nhắm đến các thiết bị mục tiêu.

Để biết thêm thông tin về cách phát hành nhiều APK trên Google Play, hãy đọc bài viết Hỗ trợ nhiều APK.