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. Nhiều loại thiết bị mang đến cho ứng dụng một lượng rất lớn đối tượng tiềm năng. Để ứng dụng thành công trên tất cả các thiết bị, ứng dụng phải thích ứng được với nhiều tính năng và cung cấp một 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 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ể trong 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 phù hợp dựa trên cấu hình hiện tại của thiết bị. Khi cân nhắc về 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 loại 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ị 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 đối tượng phù hợp.

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

Đối với 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 của 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 bất kỳ nhà sản xuất phần cứng nào cũng có thể xây dựng một thiết bị chạy hệ điều hành Android. Tuy nhiên, 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 về môi trường thực thi của 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 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ỉ có Cửa hàng Google Play mới có những thiết bị tương thích với Android. 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, 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 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 sẽ 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 trên 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ố 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.

Để có đượ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 duy nhất. 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 với các lựa chọn thay thế cho nhiều cấu hình, chẳng hạn như bố cục khác nhau 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 thiết bị sau:

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 sẽ 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ã tính năng cho cảm biến la bàn là FEATURE_SENSOR_COMPASS và mã 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 một tính năng cần thiết bằng cách khai báo tính năng này thông qua 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 phù hợp 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 sẽ 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ó sẵn 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 ứng dụng của bạn 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 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 cần có 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ó 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ả cá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 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 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 tập hợp API nào hiện có, 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 của bạn.

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 của các phiên bản nền tảng trước. Nhờ đó, ứng dụng của bạn sẽ tương thích với các phiên bản Android sau này trong khi vẫn sử dụng các API Android đã nêu.

Tuy nhiên, nếu ứng dụng của bạn 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 cần đến 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 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, chẳng hạn 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òn gọi là DPI). Để đơn giản hoá các cấu hình khác nhau, Android sẽ khái quát những biến thể này thành các nhóm để bạn dễ dàng nhắm mục tiêu hơn:

  • Bốn 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 (rất cao), xxhdpi (cực 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 tất cả kích thước và mật độ màn hình, vì hệ thống sẽ điều chỉnh bố cục và tài nguyên hình ảnh của giao diện người dùng nếu cần 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 nhất có thể. Khi có cá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. Việc 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 các màn hình khác nhau và cách giới hạn ứng dụng ở một số kích thước màn hình nhất định khi cần, hãy đọc 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 của ứng dụng có 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 phải giới hạn phạm vi cung cấp ứ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 để bạn có thể kiểm soát phạm vi cung cấp 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 để đảm bảo 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 vì các lý do không liên quan đến 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 ứ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 cấu hình thiết bị cụ thể.
Bộ lọc trên Google Play
Thông tin về những cách mà 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 bằng một hệ thống quản lý quyền yêu cầu phải có sự đồng ý của người dùng thì ứng dụng mới có thể sử dụng những API đó.