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 đối tượng. Để thành công trên mọi thiết bị, ứng dụng của bạn phải chịu được sự thay đổi tính năng và cung cấp giao diện người dùng linh hoạt thích ứng với nhiều cấu hình màn hình.

Để giúp đảm bảo 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 theo cấu hình cụ thể ở dạng các tệp tĩnh, chẳng hạn như các bố cục XML khác nhau cho nhiều kích thước màn hình. 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 thiết kế ứng dụng cũng như 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 cũng như kiểm soát loại thiết bị có thể cài đặt ứng dụng của bạn qua 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ị nào 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" có nghĩa là gì?

Trong quá trình phát triển Android, có 2 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 của ứ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ỉ "tương thích với Android" khi 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 của môi trường thực thi Android được xác định bằng 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 lo lắng về việc liệu 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 cân nhắc 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 chỉ tương thích với các 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; còn một số tính năng phụ thuộc vào phiên bản nền tảng. Không phải mọi thiết bị đều 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 của ứ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 cách sử dụng một 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ư bố cục riêng 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 đây 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ã 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 tất cả các thiết bị. Ví dụ: mã tính năng cho cảm biến la bàn là FEATURE_SENSOR_COMPASS và mã tính năng cho các 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 này 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 hoạt động không hợp lý 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 theo 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 yêu cầu, thì người dùng 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 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 của ứng dụng không dù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ả các bộ lọc mà bạn có thể dùng để kiểm soát phạm vi cung cấp của ứ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

Mỗi thiết bị có thể chạy phiên bản nền tảng Android riêng, 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 nhóm 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 các 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 sau này khi sử dụng các API Android được ghi trong tài liệu.

Tuy nhiên, nếu ứng dụng của bạn sử dụng API được thêm vào một phiên bản nền tảng mới hơn, nhưng không đòi hỏi những 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 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ị thuộ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 2 đặc điểm cho từng thiết bị: kích thước màn hình (kích thước vật lý của màn hình) và mật độ màn hình (mật độ vật lý của các pixel trên màn hình, được gọi là DPI). Để đơn giản hoá nhiều cấu hình, Android tổng quát hoá các biến thể này thành các nhóm giúp dễ 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 độ chung: 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 nếu cần cho mỗi 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 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ế 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 thiết bị 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 hữu í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 loại màn hình và cách hạn chế ứng dụng của bạn ở một số kích thước màn hì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 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 sử dụng của ứng dụng dựa trên các đặc điểm của thiết bị, có thể bạn cần phải hạn chế khả năng sử dụng của ứng dụng vì lý do kinh doanh hoặc pháp lý. Đối với loại tình huống 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 khả năng sử dụng của ứng dụng vì những 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 về 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, quá trình lọc vì các 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ấu trúc của các ứng dụng Android để 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 những cấu hình thiết bị cụ thể.
Bộ lọc trên Google Play
Thông tin về những cách Cửa hàng Google Play có thể ngăn việc 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 thông qua hệ thống quản lý quyền yêu cầu sự đồng ý của người dùng để ứng dụng sử dụng những API đó.