在 Android 6 及更高版本中,Wi-Fi 服务提供商和数据包分析器已被限制通过 Wi-Fi 堆栈从网络请求中检索设备的工厂 MAC 地址。从 Android 10 开始,实施了更多限制,以限制具有 特权权限级别的应用访问设备标识符 (ID)。这可以保护设备 ID,例如
- 电话 IMEI、MEID、ESN 和 IMSI 号码。
- 构建、SIM 卡或 USB 序列号。
谁可以访问设备 ID
设备 ID 在所有 Android 10 设备上都受到限制,即使应用以 Android 9 或更低版本为目标。设备 ID 可以通过以下方式访问:
- 默认短信应用。
- 应用同时具有
READ_PRIVILEGED_PHONE_STATE
权限(在Manifest.permission
类中)并在privapp-permission.xml
文件中加入许可名单。这些应用也必须加载到priv-app
目录中。 - 具有运营商权限的应用,如 UICC 运营商权限 中所定义。
- 设备所有者或个人资料所有者,在
READ_PHONE_STATE
权限已在Manifest.permission
类中获得授予的情况下。(无需加入许可名单。)
特权软件包访问权限
软件包必须具有特权才能访问设备 ID。它必须在 Manifest.permission
类中具有 READ_PRIVILEGED_PHONE_STATE
权限,并在 privapp-permission.xml
文件中加入许可名单。如需了解有关许可名单流程的信息,请参阅 特权权限许可名单。
如需了解如何获取非特权软件包的唯一 ID,请参阅常见用例和要使用的相应标识符。
受限的设备 ID 和随机 MAC 地址
为了进一步限制设备 ID,Android 10 上的所有设备默认都为探测请求和关联请求传输随机 MAC 地址,并且每个 SSID 都必须具有不同的随机 MAC 地址。请勿在客户端模式、软接入点 (AP) 或 Wi-Fi Direct 用例中使用设备出厂 MAC 地址。它必须对非特权应用的公开可访问 API 保持隐藏。需要返回出厂 MAC 地址的特权应用必须具有 LOCAL_MAC_ADDRESS
权限。
用户可以选择保留分配给每个 SSID 的默认随机 MAC 地址。该选项可在设置 > 网络详情中的隐私下查看。要了解如何获取随机 MAC 地址,请参阅随机 MAC 地址。

图 1.MAC 地址在“网络详情”中的“隐私”下显示为随机地址。
调用设备 ID API 的应用
调用设备 ID API 的应用必须满足 Android 10 要求。否则,当它们尝试访问设备 ID 时,将返回以下内容
- 以 Android 10 为目标平台的应用
- 将从设备 ID API 抛出
SecurityException
。 - 以 Android 9 或更低版本为目标平台的应用
- 如果它们具有
READ_PHONE_STATE
权限,则会返回null
响应或占位符数据。 - 如果它们没有该权限,则设备 ID API 将抛出
SecurityException
,其中包含调用的方法名称,并指示调用应用不符合访问所请求 ID 的要求。
有关不可变设备 ID 的更多信息,请参阅不可重置的设备标识符和唯一标识符的最佳实践。
测试
必须阻止应用访问设备序列号以及在适用的情况下访问 IMEI 或 MEID、SIM 卡序列号和订阅者 ID。有权访问这些 ID 的应用还必须满足谁可以访问设备 ID下列出的条件之一。