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