Kể từ ngày 27 tháng 3 năm 2025, bạn nên sử dụng android-latest-release
thay vì aosp-main
để xây dựng và đóng góp cho AOSP. Để biết thêm thông tin, hãy xem phần Thay đổi đối với AOSP.
Mã thiết bị không thể thay đổi
Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Trong Android 6 trở lên, các nhà cung cấp dịch vụ Wi-Fi và trình phân tích gói bị hạn chế truy xuất địa chỉ MAC ban đầu của thiết bị thông qua ngăn xếp Wi-Fi từ các yêu cầu mạng. Kể từ Android 10, chúng tôi đã áp dụng thêm các quy định hạn chế để giới hạn quyền truy cập vào giá trị nhận dạng (ID) của thiết bị cho các ứng dụng có
cấp độ quyền
đặc quyền. Việc này giúp bảo vệ mã thiết bị, chẳng hạn như
- số IMEI, MEID, ESN và IMSI của điện thoại.
- số sê-ri của bản dựng, SIM hoặc USB.
Ai có thể truy cập vào mã thiết bị
Mã thiết bị bị hạn chế trên tất cả thiết bị Android 10, ngay cả khi ứng dụng nhắm đến Android 9 trở xuống. Mã thiết bị có thể được truy cập bằng:
Quyền truy cập vào gói đặc quyền
Gói phải có đặc quyền truy cập vào mã thiết bị. Tệp này phải có quyền
READ_PRIVILEGED_PHONE_STATE
trong lớp Manifest.permission
và được đưa vào danh sách cho phép trong tệp privapp-permission.xml
. Để biết thông tin về quy trình đưa vào danh sách cho phép, hãy xem phần Đưa quyền đặc quyền vào danh sách cho phép.
Để biết thông tin về cách lấy mã nhận dạng duy nhất cho một gói không đặc quyền, hãy tham khảo
Các trường hợp sử dụng phổ biến và giá trị nhận dạng thích hợp để sử dụng.
Mã thiết bị bị hạn chế và địa chỉ MAC được tạo ngẫu nhiên
Để hạn chế thêm mã thiết bị, tất cả thiết bị trên Android 10 đều truyền địa chỉ MAC ngẫu nhiên theo mặc định cho cả yêu cầu thăm dò và yêu cầu liên quan, đồng thời phải có một địa chỉ MAC ngẫu nhiên khác nhau cho mỗi SSID. Không sử dụng địa chỉ MAC của nhà sản xuất thiết bị ở chế độ ứng dụng, điểm truy cập mềm (AP) hoặc trường hợp sử dụng Wi-Fi Direct. API này phải luôn ẩn khỏi các API có thể truy cập công khai không phải là ứng dụng đặc quyền. Các ứng dụng đặc quyền yêu cầu trả về địa chỉ MAC ban đầu phải có quyền LOCAL_MAC_ADDRESS
.
Người dùng có thể chọn giữ lại địa chỉ MAC ngẫu nhiên mặc định được chỉ định cho từng SSID.
Bạn có thể xem tuỳ chọn này trong phần Quyền riêng tư trong mục Cài đặt > Chi tiết mạng. Để tìm hiểu về cách lấy địa chỉ MAC ngẫu nhiên, hãy xem bài viết
Địa chỉ MAC ngẫu nhiên.
Hình 1. Địa chỉ MAC hiển thị dưới dạng ngẫu nhiên trong phần Quyền riêng tư trong phần Thông tin chi tiết về mạng.
Ứng dụng gọi API mã thiết bị
Các ứng dụng gọi API mã thiết bị phải đáp ứng các yêu cầu của Android 10. Nếu không, khi họ cố gắng truy cập vào mã thiết bị, hệ thống sẽ trả về kết quả sau:
- Ứng dụng nhắm đến Android 10
- Ứng dụng nhắm đến Android 9 trở xuống
- Nếu họ có quyền
READ_PHONE_STATE
, hệ thống sẽ trả về phản hồi null
hoặc dữ liệu phần giữ chỗ.
- Nếu không, các API mã thiết bị sẽ gửi
SecurityException
chứa tên của phương thức được gọi và thông báo cho biết ứng dụng gọi không đáp ứng các yêu cầu để truy cập vào mã nhận dạng được yêu cầu.
Để biết thêm về mã thiết bị không thể thay đổi, hãy xem bài viết Mã thiết bị không thể đặt lại và các phương pháp hay nhất cho giá trị nhận dạng duy nhất.
Thử nghiệm
Ứng dụng phải bị ngăn truy cập vào số sê-ri thiết bị và (nếu có) IMEI hoặc MEID, số sê-ri SIM và mã nhận dạng người đăng ký. Các ứng dụng có quyền truy cập vào mã nhận dạng này cũng phải đáp ứng một trong các tiêu chí được liệt kê trong phần Ai có thể truy cập vào mã nhận dạng thiết bị.
Nội dung và mã mẫu trên trang này phải tuân thủ các giấy phép như mô tả trong phần Giấy phép nội dung. Java và OpenJDK là nhãn hiệu hoặc nhãn hiệu đã đăng ký của Oracle và/hoặc đơn vị liên kết của Oracle.
Cập nhật lần gần đây nhất: 2025-07-27 UTC.
[[["Dễ hiểu","easyToUnderstand","thumb-up"],["Giúp tôi giải quyết được vấn đề","solvedMyProblem","thumb-up"],["Khác","otherUp","thumb-up"]],[["Thiếu thông tin tôi cần","missingTheInformationINeed","thumb-down"],["Quá phức tạp/quá nhiều bước","tooComplicatedTooManySteps","thumb-down"],["Đã lỗi thời","outOfDate","thumb-down"],["Vấn đề về bản dịch","translationIssue","thumb-down"],["Vấn đề về mẫu/mã","samplesCodeIssue","thumb-down"],["Khác","otherDown","thumb-down"]],["Cập nhật lần gần đây nhất: 2025-07-27 UTC."],[],[],null,["# Immutable device IDs\n\nIn Android 6 and higher, Wi-Fi service providers and packet analyzers have\nbeen restricted from retrieving a device's factory MAC address through the\nWi-Fi stack from network requests. Starting in Android 10, additional restrictions are in place that limit access to device\nidentifiers (IDs) to apps with the [privileged](/docs/core/permissions/perms-allowlist)[permission\nlevel](https://developer.android.com/reference/android/R.attr.html#protectionLevel). This protects device IDs such as\n\n- telephony IMEI, MEID, ESN, and IMSI numbers.\n- build, SIM, or USB serial numbers.\n\n### Who can access device IDs\n\nDevice IDs are restricted on all Android 10\ndevices, even if apps target Android 9 or lower. Device IDs can be accessed by:\n\n- The default SMS app.\n- Apps with both [READ_PRIVILEGED_PHONE_STATE](/docs/core/permissions/perms-allowlist#customizing-allowlists) permission in the `\n `[Manifest.permission](https://developer.android.com/reference/android/Manifest.permission) class, and allowlisting in the `privapp-permission.xml` file. These must also be loaded in the `priv-app` directory.\n- Apps with carrier privileges as defined in [UICC Carrier\n Privileges](/docs/core/connect/uicc).\n- A device owner or profile owner with [READ_PHONE_STATE](https://developer.android.com/reference/android/Manifest.permission.html#READ_PHONE_STATE) permission granted in the [Manifest.permission](https://developer.android.com/reference/android/Manifest.permission) class. (Allowlisting isn't required.)\n\n#### Privileged packages access\n\nA package must be privileged to access device IDs. It must have\n[READ_PRIVILEGED_PHONE_STATE](/docs/core/permissions/perms-allowlist#customizing-allowlists) permission in the\n`Manifest.permission` class, and be allowlisted in the\n`privapp-permission.xml` file. For information on the allowlist\nprocess, see [Privileged\nPermission Allowlisting](/docs/core/permissions/perms-allowlist).\n\nFor information on getting a unique ID for a *nonprivileged* package,\nrefer to [Common use cases and the appropriate identifier to use](https://developer.android.com/training/articles/user-data-ids#common-use-cases).\n\n#### Restricted device IDs and randomized MAC addresses\n\nTo further restrict device IDs, all devices on Android 10 transmit randomized MAC addresses by default for both\nprobe and associated requests, and must have a different randomized MAC address\nfor each SSID. Don't use the device factory MAC address in client mode, soft\naccess point (AP), or Wi-Fi Direct use cases. It must remain hidden from\npublicly accessible APIs that aren't privileged apps. Privileged apps that\nrequire the factory MAC address to be returned are required to have\n`LOCAL_MAC_ADDRESS` permission.\n\nUsers have the option to keep the *default randomized* MAC address that's assigned to each SSID.\nThe option is viewable under **Privacy** in\n**Settings** \\\u003e **Network details** . To learn about\nobtaining a randomized MAC address see [Randomized MAC addresses](https://developer.android.com/about/versions/10/privacy/changes#data-ids).\n\n**Figure 1.**MAC address shows as randomized under Privacy in Network details.\n\n#### Apps that invoke device ID APIs\n\nApps that invoke device ID APIs must meet the Android 10 requirements. Otherwise, when they try to access\ndevice IDs the following is returned:\n\n- Apps targeting Android 10\n - [SecurityException](https://developer.android.com/reference/java/lang/SecurityException) is thrown from the device ID APIs.\n- Apps targeting Android 9 or earlier\n - If they have the [READ_PHONE_STATE](https://developer.android.com/reference/android/Manifest.permission.html#READ_PHONE_STATE) permission, either a `null` response or placeholder data is returned.\n - If they don't, the device ID APIs throw [SecurityException](https://developer.android.com/reference/java/lang/SecurityException) that contains the name of the method called, and an indication that the calling app doesn't meet the requirements to access the requested ID.\n\nFor more on immutable device IDs see [Nonresettable\ndevice identifiers](https://developer.android.com/about/versions/10/privacy/changes#data-ids) and [best practices\nfor unique identifiers](https://developer.android.com/training/articles/user-data-ids).\n\n### Testing\n\nApps *must* be prevented from accessing the device serial number and,\nwhere applicable, IMEI or MEID, SIM serial number, and subscriber ID. Apps with\npermission to access these IDs must also meet one of the criteria listed under\n[Who can access device IDs](#who-access)."]]