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à tránh 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 của ứng dụng, mỗi tệp APK 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ụ cần thiết để giúp việc duy trì nhiều cơ sở mã APK trở nên dễ dàng 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 nhiều thế hệ nền tảng Android, 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à không làm mất khả năng tương thích ngược. Ngay từ đầu, bạn có thể thấy rằng khả năng hỗ trợ nhiều tệp 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 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ả 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ư nội dung phản chiếu trong bài viết này.
Nếu bạn có thể quản lý tệp APK này, việc giới hạn ứng dụng của bạn ở một tệp APK duy nhất sẽ có một số lợi ích như sau:
- Dễ dàng phát hành và kiểm thử 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 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 từ việc "nâng cấp" từ tệp APK này sang tệp APK tiếp theo, hoặc tệp APK nào đ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ủ đề 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 của bạn
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 bạn cần và phạm vi API mà mỗi APK bao gồm. Để tham khảo nhanh, 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 tương đối của các thiết bị đang hoạt động chạy một phiên bản nhất định của nền tảng Android. Ngoài ra, mặc dù thoạt nghe có vẻ dễ dàng, nhưng việc theo dõi nhóm cấp độ API mà mỗi APK sẽ nhắm đến sẽ nhanh chóng trở nên khó khăn, đặc biệt là nếu có một số cấp độ trùng lặp (thường là có). 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ó thể tham khảo sau này.
Để tạo nhiều biểu đồ 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. Gửi thêm một ô vào cuối để biểu thị các phiên bản Android trong tương lai.
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 tệp APK. Dưới đây là một ví dụ về cách bạn có thể áp dụng từng tệp 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. Hoạt động giao tiếp củ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ì thế nào, à, bạn biết đấy, phiên bản 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?"
Đặ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. Bạn chỉ cần cập nhật mọi nội dung trong dự án thư viện một lần (ví dụ: các chuỗi được bản địa hoá cho ngôn ngữ, chủ đề màu sắc, lỗi được khắc phục trong mã dùng chung). Điều này giúp cải thiện thời gian phát triển và giảm khả năng xảy ra 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 nhiều tính năng hỗ trợ APK, hãy tìm kiếm cơ sở mã của bạn để tìm 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 trên các tệp APK, đồng thời đưa tất cả vào dự án thư viện. Đoạ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 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, bạn có thể quản lý việc này dễ dàng hơn nhiều so với việc thêm vào một trong hai, rồi đến một tài sản khác, rồi hàng tháng sau đó cố gắng tìm hiểu xem liệu blob này có thể được di chuyển đến phần thư viện mà không cần làm gì khác hay 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 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 tuân theo lược đồ đã mô tả trước đó, thì 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ể, hãy 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 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 qua Google Play, tệp APK phù hợp sẽ được chọn bằng 2 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 tệp APK được mô tả trước đó và giả định rằng chúng ta chưa đặt cấp độ API tối đa cho bất kỳ tệp APK nào. Nếu xem riêng lẻ, phạm vi có thể có của mỗi APK 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ì bắt buộc là APK có minSdkVersion cao hơn cũng phải có mã phiên bản cao hơn, nên chúng tôi biết rằng theo giá trị versionCode, màu đỏ ≥ xanh lục ≥ xanh dương. 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 trong hướng dẫn dành cho nhà phát triển Android có toàn bộ danh sách các nguyên nhân có thể gây ra vấn đề. 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à kết hợp máy ảnh mặt trước với chức năng mới thú vị đượ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! Kinh dị thật!
May mắn thay, nếu người dùng đang duyệt xem Google Play trên một thiết bị như vậy, Google Play sẽ xem tệp kê khai, thấy rằng Red liệt kê máy ảnh mặt trước là một yêu cầu và âm thầm bỏ qua yêu cầu đó, vì đã xác định rằng Red và thiết bị đó không phù hợp với nhau. Sau đó, bạn sẽ thấy rằng Green 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), mà còn không quan tâm đến việc có máy ảnh trước hay không! 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ố với camera trước, nhưng vẫn có một tệp APK hỗ trợ cấp độ API cụ thể đó.
Để giữ tất cả tệp APK trên các "đường dẫn" riêng biệt, bạn cần có một lược đồ mã phiên bản tốt. Bạn có thể tìm thấy mã đượ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 ví dụ về tệp APK chỉ xử lý một trong 3 nhóm kích thước có thể có, nên bạn chỉ cần tách mỗi tệp APK theo 1000, đặt hai chữ số đầu tiên thành minSdkVersion cho tệp APK cụ thể đó và tăng dần từ đó. Thông tin này có thể có dạng như sau:
Xanh lam: 03001, 03002, 03003, 03004...
Màu 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 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. Xin lưu ý rằng những điều này liên quan cụ thể đế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ả tệp APK phải được ký bằng cùng một chứng chỉ
- Nếu các APK trùng lặp về phiên bản nền tảng, thì tệp APK có minSdkVersion cao hơn phải có mã phiên bản cao hơn
- 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ợ cupcake trên màn hình XLARGE)
- 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 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 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 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 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à 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: 'small' 'normal' 'large' '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 để đảm bảo 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, cũng như không có giá trị "uses-feature" ngoài ý muốn được thêm vào do các quyền bạn thiết lập trong tệp kê khai. Trong ví dụ trên, APK sẽ không hiển thị cho rất 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á 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 tệp APK này trong mọi trường hợp, cho đến khi các thiết bị trong tương lai có cấp độ API cao hơ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 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 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 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, hãy thực hiện một lần kiểm tra cuối cùng. 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!