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, ứng dụng phải chấp nhận sự đa dạng về tính năng và cung cấp giao diện người dùng linh hoạt sao cho phù hợp với đa dạng cấu hình màn hình.

Để hỗ trợ khả năng tương thích với thiết bị, Android cung cấp một khung ứng dụng linh động, trong đó bạn có thể cung cấp tài nguyên ứng dụng theo cấu hình cụ thể 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 phù hợp dựa trên cấu hình thiết bị hiện tại. Nếu cân nhắc kỹ lưỡng về thiết kế ứng dụng và các tài nguyên bổ sung của ứng dụng, 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 loại thiết bị nào 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 bạn và cách chuẩn bị ứng dụng để tiếp cận đúng đối tượng.

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

Liên quan đến việc 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ị và 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ể tạo ra 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 có thể chạy đúng cách 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 trong Chương trình tương thích của Android. Mỗi thiết bị phải vượt qua Bộ kiểm tra tính tương thích (CTS) để được coi là tương thích.

Là nhà phát triển ứng dụng, bạn không cần 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 từ Cửa hàng Google Play, thì tức là 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 liệu ứ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 không có trên tất cả 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 phải sử dụng 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 các 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ố tính năng dựa trên phần mềm, chẳng hạn như tiện ích ứng dụng; và một số tính năng 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.

Để ứng dụng của bạn đạt được cơ sở người dùng lớn nhất có thể, 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 trường hợp, bạn có thể làm như vậ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 có các lựa chọn thay thế cho nhiều cấu hình, chẳng hạn như nhiều bố cục cho nhiều kích thước màn hình. Nếu cần, bạn có thể hạn chế phạm vi cung cấp ứng dụng 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 của ứng dụng dựa trên các tính năng của thiết bị, Android xác định mã 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 khi thiết bị của họ không cung cấp 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 không hoạt động được trên một thiết bị không có 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 của bạn yêu cầu với các tính năng có sẵn trên thiết bị của từng người dùng để xác định xem ứng dụng của bạn 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 của bạn.

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 của thiết bị, hãy đặt thuộc tính required thành "false" và kiểm tra tính năng của thiết bị trong thời gian chạy. Nếu tính năng của ứng dụng không có trên thiết bị hiện tại, hãy xuống cấp nhẹ tính năng tương ứng của ứng dụng. Ví dụ: bạn có thể truy vấn xem một tính năng có sẵn 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ể 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 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 khác nhau của nền tảng Android, 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 tập hợp 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à cấp độ API 31 và Android 13 là cấp độ API 33.

Bạn phải chỉ định các giá trị minSdkVersion và targetSdkVersion 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(36)
        ...
    }
}

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 36
        ...
    }
}

Để 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 xây dựng 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 tương thích với các phiên bản Android trong tương lai khi sử dụng 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à xuống 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 của 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:

  • Bốn kích thước tổng quát: 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 (rất 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 của 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 ả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 nhiều nhất có thể. 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ế linh hoạt cho các 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ử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 nhiều màn hình và cách hạn chế ứng dụng ở 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 trên 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 đ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 để bạn kiểm soát phạm vi cung cấp ứng dụng vì các lý do phi 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 theo 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 của bạn. Tuy nhiên, việc lọc vì lý do phi kỹ thuật (chẳng hạn như ngôn ngữ đị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ấu trúc ứng dụng Android để tách biệt 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 khác nhau mà Cửa hàng Google Play có thể ngăn ứng dụng của bạn được cài đặt trên các thiết bị khác nhau.
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 ý cho ứng dụng của bạn sử dụng các API đó.