不可变的设备 ID

在 Android 6 及更高版本中,WLAN 服务提供商和数据包分析器已无法再使用 WLAN 堆栈通过网络请求检索设备的出厂 MAC 地址。从 Android 10 开始,系统增加了其他限制,只允许具有特许权限级别的应用访问设备标识符 (ID)。这可以保护下列设备 ID:

  • 电话 IMEI、MEID、ESN 和 IMSI 号码。
  • 版本号、SIM 卡号或 USB 序列号。

谁能访问设备 ID

对设备 ID 的访问在所有 Android 10 设备上都受限,即使应用以 Android 9 或更低版本为目标平台也不例外。可以通过以下方式访问设备 ID:

特权软件包访问权限

软件包必须具有特权才能访问设备 ID。它必须在 Manifest.permission 类中具有 READ_PRIVILEGED_PHONE_STATE 权限,并在 privapp-permission.xml 文件中列入白名单。如需了解列入白名单的流程,请参阅特许权限白名单

如需了解如何获取非特权软件包的唯一 ID,请参阅常见用例和适用的标识符

受限设备 ID 和随机分配的 MAC 地址

为了进一步限制设备 ID,搭载 Android 10 的所有设备默认都会为探测请求和相关请求传输随机分配的 MAC 地址,并且必须为每个 SSID 提供不同的随机分配 MAC 地址。请勿在客户端模式、软接入点 (AP) 或 WLAN 直连使用情形中使用设备的出厂 MAC 地址。它不允许提供给不是特权应用且可公开访问的 API。需要返回出厂 MAC 地址的特权应用必须具有 LOCAL_MAC_ADDRESS 权限。

用户可以选择保留分配给每个 SSID 的默认随机分配 MAC 地址。该选项可在设置 > 网络详情中的隐私权下找到。要了解如何获取随机分配的 MAC 地址,请参阅随机分配的 MAC 地址

显示设备 ID 是否使用随机分配的 MAC 地址来保护隐私的屏幕
图 1. 网络详情中的隐私权下随机显示的 MAC 地址

调用设备 ID API 的应用

调用设备 ID API 的应用必须满足 Android 10 的要求。否则,当它们尝试访问设备 ID 时,将返回以下内容:

  • 以 Android 10 为目标平台的应用
  • 以 Android 9 或更早版本为目标平台的应用
    • 如果它们具有 READ_PHONE_STATE 权限,则会返回 null 响应或占位符数据。
    • 如果不具有该权限,则设备 ID API 便会抛出 SecurityException,其中包含所调用的方法的名称,以及一条提示,表示发起调用的应用因不符合要求而无法访问所请求的 ID。

如需详细了解不可变的设备 ID,请参阅不可重置的设备标识符唯一标识符的最佳做法

测试

必须阻止应用访问设备序列号以及 IMEI/MEID、SIM 卡序列号和订阅者 ID(如果适用)。有权访问这些 ID 的应用还必须满足谁能访问设备 ID 这一部分列出的条件之一。