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