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