Tổng quan về khả năng tương thích của thiết bị

Android được thiết kế để chạy trên nhiều thiết bị, chẳng hạn như điện thoại, máy tính bảng và TV. Nhờ đó, ứng dụng của bạn có thể tiếp cận rất nhiều nhóm đối tượng. Để giúp cho ứng dụng thành công trên tất cả các thiết bị này, bạn nên đa dạng hoá một số tính năng và cung cấp trải nghiệm người dùng linh hoạt hơn sao cho phù hợp với nhiều cấu hình màn hình khác nhau.

Để giúp tăng khả năng tương thích với thiết bị, Android cung cấp một khung ứng dụng động trong đó bạn có thể cung cấp tài nguyên ứng dụng dành riêng cho cấu hình trong các tệp tĩnh, chẳng hạn như các bố cục XML khác nhau cho các kích thước màn hình khác nhau. Sau đó, Android sẽ tải các tài nguyên thích hợp dựa trên cấu hình thiết bị hiện tại. Sau khi xem xét kỹ thiết kế ứng dụng và các tài nguyên ứng dụng bổ sung, bạn có thể phát hành một gói ứng dụng (APK) duy nhất giúp tối ưu hoá trải nghiệm người dùng trên nhiều thiết bị.

Tuy nhiên, nếu cần, bạn có thể chỉ định các yêu cầu về tính năng của ứng dụng và kiểm soát những loại thiết bị có thể cài đặt ứng dụng của bạn từ Cửa hàng Google Play. Tài liệu này giải thích cách bạn có thể kiểm soát những thiết bị có quyền truy cập vào ứng dụng của mình và cách chuẩn bị ứng dụng để tiếp cận đúng đối tượng.

"Khả năng tương thích" có nghĩa là gì?

Đối với hoạt động phát triển Android, có hai loại khả năng tương thích: khả năng tương thích với thiết bịkhả năng tương thích với ứng dụng.

Vì Android là một dự án nguồn mở, nên mọi nhà sản xuất phần cứng đều có thể xây dựng một thiết bị chạy hệ điều hành Android. Tuy nhiên, một thiết bị chỉ được coi là "tương thích với Android" nếu thiết bị đó có thể chạy chính xác các ứng dụng được viết cho môi trường thực thi Android. Thông tin chi tiết chính xác về môi trường thực thi Android được xác định bởi chương trình tương thích với Android. Mỗi thiết bị phải vượt qua Bộ kiểm tra tính tương thích (CTS) để được xem là tương thích.

Là nhà phát triển ứng dụng, bạn không cần phải lo lắng về việc thiết bị có tương thích với Android hay không, vì chỉ những thiết bị tương thích với Android mới có Cửa hàng Google Play. Vì vậy, nếu người dùng cài đặt ứng dụng của bạn qua Cửa hàng Google Play, thì họ đang sử dụng một thiết bị tương thích với Android.

Tuy nhiên, bạn cần xem xét xem ứng dụng của mình có tương thích với từng cấu hình thiết bị tiềm năng hay không. Vì Android chạy trên nhiều cấu hình thiết bị nên một số tính năng chỉ có trên một số thiết bị. Ví dụ: Một số thiết bị có thể không có cảm biến la bàn. Nếu chức năng cốt lõi của ứng dụng cần có cảm biến la bàn, thì ứng dụng của bạn chỉ tương thích với những thiết bị có tính năng đó.

Kiểm soát phạm vi cung cấp ứng dụng cho các thiết bị

Android hỗ trợ nhiều tính năng mà ứng dụng của bạn có thể tận dụng thông qua API nền tảng. Một số tính năng dựa trên phần cứng, chẳng hạn như cảm biến la bàn; một số dựa trên phần mềm, chẳng hạn như tiện ích ứng dụng; và một số phụ thuộc vào phiên bản nền tảng. Không phải thiết bị nào cũng hỗ trợ mọi tính năng, vì vậy, bạn có thể cần kiểm soát phạm vi cung cấp ứng dụng cho các thiết bị dựa trên các tính năng bắt buộc của ứng dụng.

Để đạt được cơ sở người dùng lớn nhất có thể cho ứng dụng, hãy hỗ trợ nhiều cấu hình thiết bị nhất có thể bằng một tệp APK hoặc AAB. Trong hầu hết các trường hợp, bạn có thể thực hiện việc này bằng cách tắt các tính năng không bắt buộc trong thời gian chạy và cung cấp tài nguyên ứng dụng với các lựa chọn thay thế cho các cấu hình khác nhau, chẳng hạn như nhiều bố cục cho các kích thước màn hình khác nhau. Nếu cần, bạn có thể hạn chế phạm vi cung cấp ứng dụng của mình cho một số thiết bị nhất định thông qua Cửa hàng Google Play dựa trên các đặc điểm sau của thiết bị:

Tính năng của thiết bị

Để quản lý phạm vi cung cấp ứng dụng dựa trên các tính năng của thiết bị, Android xác định mã nhận dạng tính năng cho mọi tính năng phần cứng hoặc phần mềm có thể không có trên một số thiết bị. Ví dụ: mã nhận dạng tính năng cho cảm biến la bàn là FEATURE_SENSOR_COMPASS và mã nhận dạng tính năng cho tiện ích ứng dụng là FEATURE_APP_WIDGETS.

Nếu cần, bạn có thể ngăn người dùng cài đặt ứng dụng của bạn khi thiết bị của họ không cung cấp một tính năng cần thiết bằng cách khai báo tính năng đó bằng phần tử <uses-feature> trong tệp kê khai của ứng dụng.

Ví dụ: nếu ứng dụng của bạn không hoạt động trên một thiết bị thiếu cảm biến la bàn, thì bạn có thể khai báo cảm biến la bàn là một yêu cầu bằng thẻ tệp kê khai sau:

<manifest ... >
    <uses-feature android:name="android.hardware.sensor.compass"
                  android:required="true" />
    ...
</manifest>

Cửa hàng Google Play so sánh các tính năng mà ứng dụng yêu cầu với các tính năng có trên thiết bị của từng người dùng để xác định xem ứng dụng có tương thích với từng thiết bị hay không. Nếu thiết bị không có tất cả các tính năng mà ứng dụng của bạn yêu cầu, thì người dùng sẽ không thể cài đặt ứng dụng.

Tuy nhiên, nếu chức năng chính của ứng dụng không yêu cầu một tính năng thiết bị, hãy đặt thuộc tính required thành "false" và kiểm tra tính năng thiết bị trong thời gian chạy. Nếu tính năng ứng dụng không có trên thiết bị hiện tại, hãy hạ cấp nhẹ tính năng ứng dụng tương ứng. Ví dụ: bạn có thể truy vấn xem một tính năng có hoạt động hay không bằng cách gọi hasSystemFeature() như sau:

Kotlin

if (!packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
    // This device doesn't have a compass. Turn off the compass feature.
    disableCompassFeature()
}

Java

PackageManager pm = getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
    // This device doesn't have a compass. Turn off the compass feature.
    disableCompassFeature();
}

Để biết thông tin về tất cả bộ lọc mà bạn có thể sử dụng để kiểm soát phạm vi cung cấp ứng dụng thông qua Cửa hàng Google Play, hãy xem tài liệu về Bộ lọc trên Google Play.

Phiên bản nền tảng

Các thiết bị khác nhau có thể chạy các phiên bản nền tảng Android khác nhau, chẳng hạn như Android 12 hoặc Android 13. Mỗi phiên bản nền tảng kế tiếp thường bổ sung các API không có trong phiên bản trước đó. Để cho biết bộ API nào có sẵn, mỗi phiên bản nền tảng sẽ chỉ định một cấp độ API. Ví dụ: Android 12 là API cấp 31 và Android 13 là API cấp 33.

Bạn phải chỉ định giá trị minSdkVersiontargetSdkVersion trong tệp build.gradle:

Kotlin

android {
    defaultConfig {
        applicationId = "com.example.myapp"

        // Defines the minimum API level required to run the app.
        minSdkVersion(30)

        // Specifies the API level used to test the app.
        targetSdkVersion(33)
        ...
    }
}

Groovy

android {
    defaultConfig {
        applicationId 'com.example.myapp'

        // Defines the minimum API level required to run the app.
        minSdkVersion 30

        // Specifies the API level used to test the app.
        targetSdkVersion 33
        ...
    }
}

Để biết thêm thông tin về tệp build.gradle, hãy đọc bài viết Định cấu hình bản dựng.

Mỗi phiên bản Android kế tiếp đều cung cấp khả năng tương thích cho các ứng dụng được tạo bằng API từ các phiên bản nền tảng trước đó, vì vậy, ứng dụng của bạn sẽ tương thích với các phiên bản Android trong tương lai khi sử dụng các API Android được ghi nhận.

Tuy nhiên, nếu ứng dụng của bạn sử dụng các API được thêm vào phiên bản nền tảng mới hơn nhưng không yêu cầu các API đó cho chức năng chính, hãy kiểm tra cấp độ API trong thời gian chạy và hạ cấp nhẹ các tính năng tương ứng khi cấp độ API quá thấp. Trong trường hợp này, hãy đặt minSdkVersion thành giá trị thấp nhất có thể cho chức năng chính của ứng dụng, sau đó so sánh phiên bản hệ thống hiện tại SDK_INT với hằng số tên mã trong Build.VERSION_CODES tương ứng với cấp độ API mà bạn muốn kiểm tra, như trong ví dụ sau:

Kotlin

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
    // Running on something older than API level 11, so disable
    // the drag and drop features that use ClipboardManager APIs.
    disableDragAndDrop()
}

Java

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
    // Running on something older than API level 11, so disable
    // the drag and drop features that use ClipboardManager APIs.
    disableDragAndDrop();
}

Cấu hình màn hình

Android chạy trên các thiết bị có nhiều kích thước như điện thoại, máy tính bảng và TV. Để phân loại thiết bị theo loại màn hình, Android xác định hai đặc điểm cho mỗi thiết bị: kích thước màn hình (kích thước thực tế của màn hình) và mật độ màn hình (mật độ thực tế của các pixel trên màn hình, còn gọi là DPI). Để đơn giản hoá các cấu hình khác nhau, Android tổng quát hoá các biến thể này thành các nhóm giúp dễ dàng nhắm mục tiêu hơn:

  • 4 kích thước chung: nhỏ, bình thường, lớn và rất lớn
  • Một số mật độ tổng quát: mdpi (trung bình), hdpi (cao), xhdpi (cực cao), xxhdpi (siêu cao) và các mật độ khác

Theo mặc định, ứng dụng của bạn tương thích với mọi kích thước và mật độ màn hình, vì hệ thống sẽ điều chỉnh bố cục giao diện người dùng và tài nguyên hình ảnh khi cần thiết cho từng màn hình. Cung cấp hình ảnh bitmap được tối ưu hoá cho mật độ màn hình phổ biến.

Tối ưu hoá trải nghiệm người dùng bằng cách sử dụng bố cục linh hoạt càng nhiều càng tốt. Khi có bố cục cho các thay đổi lớn về cấu hình, chẳng hạn như dọc và ngang hoặc kích thước cửa sổ lớn so với nhỏ, hãy cân nhắc cung cấp bố cục thay thế có thể linh hoạt với những thay đổi nhỏ hơn trong cấu hình. Điều này giúp cải thiện trải nghiệm người dùng trên các kiểu dáng như máy tính bảng, điện thoại và thiết bị có thể gập lại. Điều này cũng giúp ích khi các cửa sổ thay đổi kích thước ở chế độ nhiều cửa sổ.

Để biết thông tin về cách tạo tài nguyên thay thế cho các màn hình khác nhau và cách hạn chế ứng dụng của bạn ở một số kích thước màn hình nhất định khi cần, hãy đọc bài viết tổng quan về khả năng tương thích với màn hình và xem nguyên tắc về chất lượng ứng dụng dành cho màn hình lớn.

Kiểm soát phạm vi cung cấp ứng dụng vì lý do kinh doanh

Ngoài việc hạn chế phạm vi cung cấp ứng dụng dựa trên các đặc điểm của thiết bị, bạn có thể cần hạn chế phạm vi cung cấp ứng dụng vì lý do kinh doanh hoặc pháp lý. Đối với trường hợp này, Cửa hàng Google Play cung cấp các tuỳ chọn lọc trong Play Console để cho phép bạn kiểm soát phạm vi cung cấp ứng dụng vì các lý do không liên quan đến kỹ thuật, chẳng hạn như ngôn ngữ của người dùng hoặc nhà mạng không dây.

Việc lọc để tìm khả năng tương thích kỹ thuật (chẳng hạn như các thành phần phần cứng bắt buộc) luôn dựa trên thông tin có trong tệp APK hoặc AAB. Tuy nhiên, việc lọc theo lý do không liên quan đến kỹ thuật (chẳng hạn như ngôn ngữ theo vị trí địa lý) luôn được xử lý trong Google Play Console.

Tài nguyên khác:

Tổng quan về tài nguyên ứng dụng
Thông tin về cách các ứng dụng Android được cấu trúc để tách tài nguyên ứng dụng khỏi mã ứng dụng, bao gồm cả cách bạn có thể cung cấp tài nguyên thay thế cho các cấu hình thiết bị cụ thể.
Bộ lọc trên Google Play
Thông tin về các cách mà Cửa hàng Google Play có thể ngăn người dùng cài đặt ứng dụng của bạn trên nhiều thiết bị.
Quyền trên Android
Cách Android hạn chế quyền truy cập của ứng dụng vào một số API nhất định bằng hệ thống cấp quyền yêu cầu người dùng đồng ý để ứng dụng của bạn sử dụng các API đó.