Android O中對設備標識符所做的變更
Android O 引入若干改進,幫助用戶控制標識符的使用。這些改進包括:
- 限制使用不可重置的設備范圍標識符
- 更新 Android O WLAN 堆棧,更改 Pixel、Pixel XL 和 Nexus 5x 手機所使用的 WLAN 芯片組固件,以便在探測請求中隨機分配 MAC 地址
- 更新應用請求帳號信息的方式,提供更多面向用戶的控制
設備標識符變更
以下是 Android O 中對設備標識符所做的部分變更:
Android ID
在 O 中,對于設備上的每個應用和每個用戶,Android ID(Settings.Secure.ANDROID_ID 或 SSAID)均有不同的值。需要使用設備范圍的標識符的開發者應改用可重置的標識符,例如廣告 ID,以便賦予用戶更多的控制權。廣告 ID 還提供了面向用戶的設置,用于限制廣告跟蹤。
此外,在 Android O 中:
- 只要軟件包名稱和簽名密鑰相同,在軟件包卸載或重新安裝時,ANDROID_ID 的值不會改變。應用可以依靠此值保持每次重新安裝之后的狀態。
- 如果應用安裝在運行更早版本 Android 的設備上,則除非卸載并重新安裝該應用,否則,在設備更新至 Android O 之后,應用的 Android ID 將保持不變。
- 只有在設備恢復出廠設置或者簽名密鑰在卸載和重新安裝事件期間輪換時,Android ID 的值才會改變。
- 只有預裝 Google Play 服務和廣告 ID 的設備制造商才需要更改此值。其他設備制造商可以提供一個替代的可重置 ID 或者繼續提供 ANDROID ID。
- Build.SERIAL
為了與訪問 IMEI 所需的運行時權限保持一致,對于針對 Android O 或更新版本的應用,現已棄用 android.os.Build.SERIAL。它們可以改為使用新的 Android O API,即Build.getSerial(),只要調用方擁有 PHONE 權限,該函數將返回實際序列號。在未來版本的 Android 中,針對 Android O 的應用所查詢到的 Build.SERIAL 將顯示為“UNKNOWN”。為避免中斷舊版應用的正常工作,針對以前版本 Android 的應用所查詢到的設備序列號仍和以前一樣。
Net.Hostname
Net.Hostname 提供設備的網絡主機名。在之前版本的 Android 中,網絡主機名的默認值和 DHCP 主機名選項的值均包含 Settings.Secure.ANDROID_ID。在 Android O 中,net.hostname 為空,DHCP 客戶端在 IETF RFC 7844 之后,不再發送主機名(匿名保護的個人資料)。
Widevine ID
對于搭載 O 的新設備,Widevine 客戶端 ID 將為每個應用軟件包名稱和網絡源(對于網絡瀏覽器)返回一個不同的值。
特殊的系統和設置屬性
除了 Build.SERIAL 之外,還有其他設置和系統屬性在 Android O 中不可用。這些包括:
- ro.runtime.firstboot:在上次滑屏或上次啟動之后第一次啟動的毫秒級時間戳
- htc.camera.sensor.front_SN:相機序列號(在某些 HTC 設備上可用)
- persist.service.bdroid.bdaddr:藍牙 MAC 地址屬性
- Settings.Secure.bluetooth_address:設備藍牙 MAC 地址。在 O 中,只有擁有 LOCAL_MAC_ADDRESS 權限的應用才可以使用此屬性。
在 WLAN 探測請求中,隨機分配 MAC 地址
我們攜手安全研究人員1 ,共同針對 Google Pixel 和 Nexus 5X 設備中的芯片組固件所產生的 WLAN 掃描流量設計了可靠的 MAC 地址隨機分配功能。隨后,Android Connectivity 團隊又與制造商合作,更新這些設備所使用的 WLAN 芯片組固件。
Android O 將這些固件變更集成到 Android WLAN 堆棧中,因此,使用這些更新過固件的芯片組并運行 O 或更高版本 Android 的設備將可以充分利用這些變更。
以下是我們對運行 O 及更高版本 Android 的 Pixel、Pixel XL 和 Nexus 5x 固件所做的一些變更:
- 在 WLAN 從接入點斷開時,每次掃描 WLAN 時,手機都會使用新的隨機分配的 MAC 地址(無論設備是否處于待機狀態)。
- 每次掃描的初始數據包序列號也是隨機生成的。
- 不必要的探測請求信息元素已被移除:所要求的信息元素僅限于 SSID 和 DS 參數集。
getAccounts API 中的變更
在 Android O 及更高版本中,擁有 GET_ACCOUNTS 權限不再足以獲取對設備上已注冊帳號列表的訪問權。應用必須使用管理特定帳號類型的應用所提供的 API,或者用戶必須通過帳號選擇器 Activity 授予訪問此帳號的權限。例如,Gmail 可以訪問設備上已注冊的 Google 帳號,這是因為 Google 擁有 Gmail 應用,但用戶可能需要授予 Gmail 對設備上注冊的其他帳戶信息的訪問權。
要獲得帳號訪問權限,針對 Android O 或更高版本的應用應使用 AccountManager#newChooseAccountIntent() 或特定于身份驗證器的方法。目標 SDK 版本較低的應用仍可使用當前的流程。
在 Android O 中,應用也可以使用 AccountManager.setAccountVisibility()/ getVisibility() 方法來管理這些應用所擁有的帳號的可見性策略。
此外,LOGIN_ACCOUNTS_CHANGED_ACTION 廣播已棄用,但在 Android O 中仍可工作。應用應使用 addOnAccountsUpdatedListener() 來獲取運行時帳戶的更新,以獲取應用指定的帳戶類型列表。