Tạo nhiều APK cho các cấp độ API 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 sẽ có các cấp độ API hơi khác nhau. Bạn cũng sẽ nhận được một số công cụ để đảm bảo việc duy trì nhiều cơ sở mã APK ít gây đau đớn 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 qua nhiều thế hệ Android tự nhiên, bạn muốn ứng dụng của mình tận dụng các tính năng mới trên thiết bị mới, mà vẫn đảm bảo khả năng tương thích ngược. Có vẻ như ban đầu, bạn có thể sử dụng nhiều APK hỗ trợ là giải pháp tốt nhất, nhưng thường không phải vậy. 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 APK sẽ có 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 có thể tìm hiểu cách viết mã chỉ chạy ở một số cấp độ API nhất định trong một tệp APK mà không cần dùng đến các kỹ thuật tính toán tốn kém như phản chiếu từ bài viết này.

Nếu bạn có thể quản lý chiến lược này, việc giới hạn ứng dụng của bạn vào một APK duy nhất sẽ có nhiều 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 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à API mà bạn cần phạm vi mà mỗi APK bao gồm. Để tiện tham khảo, hãy truy cập trang Phiên bản nền tảng của Trang web dành cho nhà phát triển Android cung cấp dữ liệu về số lượng thiết bị đang hoạt động tương đối đang chạy một ứng dụng cụ thể phiên bản nền tảng Android. Ngoài ra, mặc dù lúc đầu nghe có vẻ dễ dàng nhưng việc theo dõi những cấp độ API mà mỗi APK sẽ nhắm đến sẽ gặp khó khăn khá nhanh, đặc biệt nếu có trùng lặp (thường có). May mắn là, bạn có thể nhanh chóng vạch ra các yêu cầu của mình, một cách dễ dàng và có thể tham khảo dễ dàng về sau.

Để tạo biểu đồ nhiều tệp APK, hãy bắt đầu với một hàng ô đại diện cho các cấp độ API khác nhau của nền tảng Android. Ném thêm một ô vào cuối để thể hiện tương lai các phiên bản Android khác nhau.

3 4 5 6 7 8 9 10 11 12 13 +

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à một ví dụ về cách bạn có thể áp dụng từng APK cho một phạm vi cấp độ API nhất định.

3 4 5 6 7 8 9 10 11 12 13 +

Sau khi bạn tạo biểu đồ này, hãy phân phối biểu đồ này cho nhóm của mình. Giao tiếp giữa nhóm về dự án của bạn trở nên đơn giản hơn ngay lập tức, vì thay vì hỏi "APK dành cho API cấp 3 đến 6 thế nào, v.v. Android 1.x. Kết quả tìm kiếm thế nào rồi?" Bạn chỉ cần nói "APK màu xanh dương sắp ra mắt như thế nào không?"

Đặ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. 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ễ 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ẹ. Đồng thời, 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 cần chia sẻ 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-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ể, xác định Hoạt động bắt đầu của bạn trong dự án thư viện và mở rộng Hoạt động đó trong APK của bạn dự án. 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, số phiên bản cao nhất 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 chúng ta chưa đặt cấp độ API tối đa cho mọi tệp APK. Nếu được thực hiện riêng lẻ, phạm vi có thể có của mỗi APK sẽ sẽ có dạng như sau:

3 4 5 6 7 8 9 10 11 12 13 +
3 4 5 6 7 8 9 10 11 12 13 +
3 4 5 6 7 8 9 10 11 12 13 +

Vì theo yêu cầu, APK có minSdkVersion cao hơn cũng phải có mã phiên bản cao hơn, chúng ta biết rằng theo các giá trị versionCode, màu đỏ ≥ xanh lục ≥ xanh lam. Do đó, chúng ta có thể thu gọn biểu đồ như sau một cách hiệu quả:

3 4 5 6 7 8 9 10 11 12 13 +

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. Trang Bộ lọc trên Google Play của 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ó. Đối với giả sử màu đỏ đòi hỏi camera mặt trước. Trên thực tế, toàn bộ điểm quan trọng APK màu đỏ là để kết hợp máy ảnh mặt trước với tính năng mới ngọt ngào đã được thêm vào API 11. Nhưng hoá ra không phải tất cả thiết bị hỗ trợ API 11 đều CÓ máy ảnh mặt trước! Chiến lược phát hành đĩa đơn kinh dị!

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 chuyển tiếp với các thiết bị có API 11 (vì không có maxSdkVersion nào được xác định), nhưng cũng không quan tâm có máy ảnh mặt trước hay không! Bạn vẫn có thể tải ứng dụng này xuống từ Google Play, bởi vì mặc dù toàn bộ sự cố xảy ra với camera trước, vẫn còn Tệp APK hỗ trợ cấp độ API cụ thể đó.

Để 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 bằng 1.000, đặt hai chữ số đầu tiên thành minSdkVersion cho tệp APK cụ thể đó rồi tăng dần từ đó. Thông tin này có thể có dạng như sau:

Xanh lam: 03001, 03002, 03003, 03004...
Xanh lục: 07001, 07002, 07003, 07004...
Đỏ:11001, 11002, 11003, 11004...

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="03001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="3" />
    ...

Màu lục:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="07001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="7" />
    ...

Màu đỏ:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="11001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="11" />
    ...

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 tệp này liên quan cụ thể đến nhiều tệp APK và không bao giờ là danh sách kiểm tra hoàn chỉnh cho tất cả ứng dụng đang đượ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
  • Kiểm tra kỹ bộ lọc tệp kê khai để biết 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 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 được hỗ trợ
  • Hãy cố gắng 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 cho doanh nghiệp trên máy phát triển của mình. 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: 'small' 'normal' 'large' '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 nhiều 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ì API 11 là Honeycomb (phiên bản Android được tối ưu hoá dành riêng cho máy tính bảng) và không có thiết bị Honeycomb nào có phần cứng điện thoại, nên Google Play sẽ lọc ra APK này trong mọi trường hợp, cho đến khi các thiết bị trong tương lai xuất hiện ở cấp độ API cao hơ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 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 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ể có để đảm bảo rằng tệp APK đang nhắm đến các thiết bị dự định. Xin chúc mừng, bạn đã hoàn tất!