AndroidO引入了多项改进,以帮助用户控制标识符的使用。这些改进包括:使用不可重置的设备范围标识符限制对AndroidOWi-Fi堆栈的更新更改Pixel、PixelXL和Nexus5x手机上使用的Wi-Fi芯片组固件以随机化探测请求中的MAC地址更新应用程序请求accounts信息的方式,提供更多面向用户的控制设备标识符的变化以下是AndroidO中对设备标识符的一些变化:AndroidID在O中,对于设备上的每个应用程序和每个用户,AndroidID(设置.Secure.ANDROID_ID或SSAID)具有不同的值。需要使用设备范围标识符的开发人员应该改用可重置的标识符,例如广告ID,以便为用户提供更多控制权。AdvertisingID还提供面向用户的设置以限制广告跟踪。此外,在AndroidO中:只要包名和签名密钥相同,卸载或重新安装包时ANDROID_ID的值就不会改变。应用程序可以依赖此值在重新安装后保持不变。如果该应用程序安装在运行较早版本Android的设备上,则在设备更新到AndroidO后,该应用程序的AndroidID将保持不变,除非该应用程序被卸载并重新安装。仅当设备恢复出厂设置或签名密钥在卸载和重新安装事件期间轮换时,AndroidID的值才会更改。只有预装了GooglePlayServices和AdvertisingID的设备制造商才需要更改此值。其他设备制造商可能会提供备用可重置ID或继续提供ANDROIDID。Build.SERIALAndroid.os.Build.SERIAL已针对AndroidO或更新版本的应用弃用,以与访问IMEI所需的运行时权限保持一致。他们可以改用新的AndroidOAPIBuild.getSerial(),只要调用者拥有PHONE权限,它就会返回实际的序列号。在未来的Android版本中,针对AndroidO的应用会将Build.SERIAL查找为“UNKNOWN”。为避免破坏旧版应用程序,针对旧版Android的应用程序仍将像以前一样查询设备序列号。Net.HostnameNet.Hostname提供设备的网络主机名。在以前的Android版本中,网络主机名的默认值和DHCP主机名选项的值都包含Settings.Secure.ANDROID_ID。在AndroidO中,net.hostname为空,DHCP客户端在IETFRFC7844(匿名保护个人数据)之后不再发送主机名。WidevineID对于搭载O的新设备,Widevine客户端ID将为每个应用程序包名称和网络源(对于网络浏览器)返回不同的值。特殊系统和设置属性除了Build.SERIAL之外,还有其他设置和系统属性在AndroidO中不可用。这些包括:sensor.front_SN:相机序列号(在某些HTC设备上可用)保留。service.bdroid.bdaddr:蓝牙MAC地址属性Settings.Secure.bluetooth_address:设备蓝牙MAC地址。在O中,只有拥有LOCAL_MAC_ADDRESS权限的应用才能使用该属性。随机化Wi-Fi探测请求中的MAC地址我们与安全研究人员1合作,为GooglePixel和Nexus5X设备中的芯片组固件生成的Wi-Fi扫描流量设计了强大的MAC随机化。Android连接团队随后与制造商合作,为这些设备使用的Wi-Fi芯片组更新固件。AndroidO将这些固件更改集成到AndroidWi-Fi堆栈中,因此使用这些更新固件芯片组并运行AndroidO或更高版本的设备将利用这些更改。以下是我们对运行AndroidO及更高版本的Pixel、PixelXL和Nexus5x固件所做的一些更改:当Wi-Fi与接入点断开连接时,手机每次都会使用新的随机分配的Wi-Fi它会扫描Wi-Fi。MAC地址(设备是否处于待机状态)。每次扫描的初始数据包序列号也是随机生成的。删除了不必要的探测请求信息元素:所需的信息元素仅限于SSID和DS参数集。getAccountsAPI中的更改在AndroidO及更高版本中,拥有GET_ACCOUNTS权限不再足以访问设备上的注册帐户列表。应用程序必须使用管理特定帐户类型的应用程序提供的API,或者用户必须通过帐户选择器活动授予对此帐户的访问权限。例如,Gmail可以访问设备上注册的Google帐户,因为Google拥有Gmail应用程序,但用户可能需要授予Gmail访问设备上注册的其他帐户信息的权限。要获得帐户访问权限,面向AndroidO或更高版本的应用应使用AccountManager#newChooseAccountIntent()或特定于身份验证器的方法。针对早期SDK版本的应用程序仍然可以使用当前流程。在AndroidO中,应用程序还可以使用AccountManager.setAccountVisibility()/getVisibility()方法来管理这些应用程序拥有的帐户的可见性策略。此外,LOGIN_ACCOUNTS_CHANGED_ACTION广播已弃用,但在AndroidO中仍然有效。应用程序应使用addOnAccountsUpdatedListener()来获取应用程序指定的帐户类型列表的运行时帐户更新。