不可變的設備 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下列出的條件之一。