不可变的设备 ID

在 Android 6 及更高版本中,Wi-Fi 服务提供商和数据包分析器已被限制通过 Wi-Fi 堆栈从网络请求中检索设备的工厂 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) 或 Wi-Fi Direct 用例中使用设备出厂 MAC 地址。它必须对非特权应用的公开可访问 API 保持隐藏。需要返回出厂 MAC 地址的特权应用必须具有 LOCAL_MAC_ADDRESS 权限。

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

Screen shows if device ID uses a randomized MAC address for privacy

图 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下列出的条件之一。