实现随机分配 MAC 地址

从 Android 8.0 开始,Android 设备在未连接到网络的情况下探测新网络时,会使用随机分配的 MAC 地址。在 Android 9 中,您可以启用一个开发者选项(默认处于停用状态),使设备在连接到 Wi-Fi 网络时使用随机分配的 MAC 地址。

在 Android 10 中,默认为客户端模式、SoftAp 和 WLAN 直连启用随机分配 MAC 地址功能。

随机分配 MAC 地址可防止监听器使用 MAC 地址来生成设备活动的历史记录,从而加强对用户隐私的保护。

此外,在 Wi-Fi 感知Wi-Fi RTT 操作中也会使用随机分配的 MAC 地址。

如需了解详情,请参阅随机分配 MAC 地址的行为

实现

要在设备上实现随机分配 MAC 地址,请执行以下操作:

  1. 与 WLAN 芯片供应商合作实现以下 HAL 方法:

    • IWifiStaIface#setMacAddress:配置接口的 MAC 地址。默认实现会关闭接口、更改 MAC 地址,然后重新启用接口。
    • IWifiStaIface#getFactoryMacAddress:使用 ioctl 调用获取 wlan0 的出厂 MAC 地址。
    • ISupplicantP2pIface#setMacRandomization:在客户端中开启/关闭点对点随机分配 MAC 地址功能。
  2. 在“设置”config.xml 中,将 config_wifi_connected_mac_randomization_supported 设置为 true(此步骤可在设备自定义叠加层中完成)。

    • 此标志用于控制是否启用客户端模式随机分配 MAC 地址功能。
  3. 在“设置”config.xml 中,将 config_wifi_p2p_mac_randomization_supported 设置为 true(此步骤可在设备自定义叠加层中完成)。

    • 此标志用于控制是否启用 Wi-Fi 直连随机分配 MAC 地址功能。
  4. 使用验证中所述的方法测试实现。

系统界面必须:

  • 提供为每个 SSID 启用或停用随机分配 MAC 地址功能的选项。
  • 默认为所有新添加的网络启用随机分配 MAC 地址功能。

使用设置界面的参考实现来实现新提示。

搭载 Android 9 或更低版本的设备可能不支持随机分配 WLAN MAC 地址的功能。将此类设备升级到 Android 10 时,可以通过在 WLAN 供应商 HAL make 文件中将 WIFI_HIDL_FEATURE_DISABLE_AP_MAC_RANDOMIZATION 标记设置为 true,停用随机分配 WLAN MAC 地址的功能。

验证

如需验证该功能是否按预期正常运行,需要运行一项集成测试 (ACTS) 和一项手动测试。

如需运行集成测试,请使用位于 tools/test/connectivity/acts_tests/tests/google/wifi 中的 ACTS 文件 WifiMacRandomizationTest.py,验证设备是否使用随机分配的 MAC 地址,以及是否正确存储了每个网络的随机分配 MAC 地址。

如需运行手动测试,请执行以下操作:

  1. 通过检查设备叠加层中的 config_wifi_connected_mac_randomization_supported 是否设置为 true,验证设备是否支持随机分配 MAC 地址功能。
  2. 连接到 WLAN 网络。
  3. 点按该网络,转到“网络详情”页面。验证随机分配 MAC 地址功能是否已开启。验证显示的 MAC 地址是否为随机分配的 MAC 地址。随机分配的 MAC 地址会将本地生成的位设置为 1,将多播位设置为 0。
  4. 关闭随机分配 MAC 地址功能。连接到同一网络并确认系统使用的是出厂 MAC 地址。
  5. 点按“网络详情”页面上的取消保存,删除该网络。
  6. 连接到同一网络并验证系统使用的是否是同一随机分配的 MAC 地址。

要在将要升级到 Android 10 或更高版本的预 Android 10 设备(能够支持随机分配 MAC 地址功能)上测试随机分配 MAC 地址功能,请执行以下操作:

  1. 在搭载 Android 9 或更低版本的设备上保存至少一个网络。
  2. 刷写 Android 10 系统映像。
  3. 在 WLAN 选择器中,确认是否已为保存的所有网络关闭随机分配 MAC 地址功能。
  4. 开启随机分配 MAC 地址功能。连接到同一网络并验证系统使用的是否是随机分配的 MAC 地址。