不可变的设备 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 部分列出的条件之一。