在 Android 6 及更高版本中,限制 Wi-Fi 服務提供商和數據包分析器通過 Wi-Fi 堆棧從網絡請求中檢索設備的出廠 MAC 地址。從 Android 10 開始,實施了額外的限制,將對設備標識符 (ID) 的訪問限制為具有特權權限級別的應用。這可以保護設備 ID,例如
- 電話 IMEI、MEID、ESN 和 IMSI 號碼。
- 版本號、SIM 或 USB 序列號。
誰可以訪問設備 ID
設備 ID 在所有 Android 10 設備上都受到限制,即使應用面向 Android 9 或更低版本也是如此。設備 ID 可以通過以下方式訪問
- 默認短信應用。
- 應用程序在
Manifest.permission
類中具有READ_PRIVILEGED_PHONE_STATE
權限,並在privapp-permission.xml
文件中列入白名單。這些也必須加載到priv-app
目錄中。 - 具有UICC 運營商特權中定義的運營商特權的應用程序。
- 具有在
Manifest.permission
類中授予的READ_PHONE_STATE
權限的設備所有者或配置文件所有者。 (不需要列入白名單。)
特權包訪問
包必須具有訪問設備 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 地址。
調用設備 ID API 的應用
調用設備 ID API 的應用程序必須滿足 Android 10 要求。否則,當他們嘗試訪問設備 ID 時,將返回以下內容:
- 面向 Android 10 的應用
- 從設備 ID API 引發
SecurityException
。 - 面向 Android 9 或更早版本的應用
- 如果他們具有
READ_PHONE_STATE
權限,則返回null
響應或占位符數據。 - 如果不滿足,設備 ID API 會引發
SecurityException
,其中包含所調用方法的名稱,以及調用應用程序不滿足訪問所請求 ID 的要求的指示。
有關不可變設備 ID 的更多信息,請參閱不可重置設備標識符和唯一標識符的最佳實踐。
測試
必須阻止應用程序訪問設備序列號,並在適用的情況下訪問 IMEI/MEID、SIM 序列號和訂閱者 ID。有權訪問這些 ID 的應用程序還必須滿足誰可以訪問設備 ID下列出的條件之一。