识别用户唯一性,是每个做应用所遇到的问题之一。通常我们会希望有一个唯一的字符,去识别关联我们的用户。
Android 操作系统提供了多种具有不同行为特性的 ID。我们应该使用何种 ID 取决于以下特性适合我们用例的程度。然而,这些特性还涉及到隐私权,因此我们必须要了解这些特性彼此之间是如何互动的。
标识符作用域说明了哪些系统可以访问标识符。Android 标识符的作用域一般分为三种:
重置性和持久性定义了标识符的生命周期并说明了如何对其进行重置。常见的重置触发器包括:应用内重置、通过系统设置重置、启动时重置以及安装时重置。Android 标识符具有不同的生命周期,但生命周期通常与 ID 的重置方式有关:
唯一性可以确定发生冲突的可能性;而发生冲突是指在关联作用域内存在完全相同的标识符。在最高级别,全局唯一标识符永远不会有冲突项,即使在其他设备/应用上也是如此。唯一性级别取决于标识符的熵和用来创建标识符的随机性来源。例如,带有安装日期(例如 2019-03-01)的随机标识符的冲突几率要比带有 Unix 安装时间戳(例如 1551414181)的标识符高得多。
一般而言,我们可以将用户帐号标识符视为具有唯一性。也就是说,每个设备/帐号组合都有一个唯一 ID。另一方面,标识符在某一群体内的唯一性越低,隐私保护效果就越好,因为它用于跟踪单个用户的有用性会降低。
我们可以使用难以仿冒或重播的标识符证明关联的设备或帐号具有某些属性。例如,我们可以证明设备并非被垃圾内容发布者利用的虚拟设备。难以仿冒的标识符还能提供不可否认性。如果设备用密钥对一条消息进行了签名,就难以辩称这条消息是由他人的设备发出的。不可否认性可能是用户需要的(例如,进行付款身份验证),也可能成为令人讨厌的属性(例如,用户会后悔发送某条消息)。
那么目前android的唯一标识id 大致有 IMEI,SSAID,MAC,OAID,GUID,GAID。
首先说明一下,每一个id及其含义。
它是 International Mobile Equipment Identity( 国际移动设备身份) 的简称,就像是手机的身份证,是用来帮助辨别手机身份真伪的。每个手机都只有唯一一个串号,不会重复。
Android ID最大的变化是从Android8.0开始,在andorid 8.0之前安装的应用,在系统ota升级至8.0后,当卸载安装或升级安装后,SSAID将重新生成一次(因升级算法)
至此,android将根据签名不同,创建生成一个SSAID,也就是说,同样的手机相同的签名的APP获取到的SSAID将完全一样。(可跨app识别用户)
MAC 地址具有全局唯一性,无法由用户重置,在恢复出厂设置后也不会变化。因此,Google一般不建议使用 MAC 地址进行任何形式的用户标识。搭载 Android 10(API 级别 29)及更高版本的设备会报告不是设备所有者应用的所有应用的随机化 MAC 地址。
在 Android 6.0(API 级别 23)到 Android 9(API 级别 28)中,本地设备 MAC 地址(如 WLAN 和蓝牙)无法通过第三方 API 使用。WifiInfo.getMacAddress() 方法和 BluetoothAdapter.getDefaultAdapter().getAddress() 方法都会返回 02:00:00:00:00:00。
在重置广告 ID 时始终尊重用户的意愿。在未经用户同意的情况下,请勿使用其他标识符或指纹将后续广告 ID 关联起来,对用户重置进行桥接。
也就是说,用户重置ID后,Google默认认为两个ID就是两个用户,且在用户不同意创建用户画像的情况下,不允许按照兴趣推荐广告。
String uniqueID = UUID.randomUUID().toString();
在10.0以前设备ID的这些值还能获取到,Mac地址6.0之后通过api是获取不到的,通过扫描硬件端口还能获取。
Android 10(API 级别 29)对不可重置的标识符(包括 IMEI 和序列号)添加了限制。我们的应用必须是设备或个人资料所有者应用,具有特殊运营商权限或具有 READ_PRIVILEGED_PHONE_STATE 特许权限,才能访问这些标识符。
所以目前来讲,唯一标识的最佳做法为利用GUID以及GAID去做相关内容。
相关链接:https://developer.android.com/training/articles/user-data-ids#scope