设备ID,简单来说就是一串符号(或者数字),映射现实中硬件设备。
如果这些符号和设备是一一对应的,可称之为“唯一设备ID(Unique Device Identifier)”
不幸的是,对于Android平台而言,没有稳定的API可以让开发者获取到这样的设备ID。
开发者通常会遇到这样的困境:
随着项目的演进, 越来越多的地方需要用到设备ID;
然而随着Android版本的升级,获取设备ID却越来越难了。
加上Android平台碎片化的问题,获取设备ID之路,可以说是步履维艰。
二、设备ID的作用
关于设备ID的作用,大概可以分为下面几点:
- 统计需求
统计需求是设备ID最常见的用途,包括DAU, MAU的统计,行为统计,广告激活的统计等。
- 业务需求
设备ID通常也用于业务中。
比如结合行为统计做用户画像,以为用户提供个性化的服务,大家感受比较明显的就是新闻类和电商类的APP了。
这类操作,有利有弊,仁者见仁智者见智。
又如,定向推送,不一定是广告推送,错误修复,内测推送等也会用到设备ID。
还有是一些和特定业务结合的用途,比如构造分布式ID等。
- 风控需求
设备ID还可用于防刷单,反作弊等。
当然,风控需求仅靠设备ID是无法完成的,通常需要建立一套反作弊系统。
关于这方面的内容,难以一言以蔽之,这里我们不多作展开。
三、获取设备ID的API
获取设备标识的API屈指可数,而且都或多或少有一些问题。
常规的API有以下这些:
IMEI
IMEI本该最理想的设备ID,具备唯一性,恢复出厂设置不会变化(真正的设备相关)。
然而,获取IMEI需要 READ_PHONE_STATE 权限,估计大家也知道这个权限有多麻烦了。
尤其是Android 6.0以后, 这类权限要动态申请,很多用户可能会选择拒绝授权。
我们看到,有的APP不授权这个权限就无法使用, 这可能会降低用户对APP的好感度。
而且,Android 10.0 将彻底禁止第三方应用获取设备的IMEI, 即使申请了 READ_PHONE_STATE 权限。
所以,如果是新APP,不建议用IMEI作为设备标识;
如果已经用IMEI作为标识,要赶紧做兼容工作了,尤其是做新设备标识和IMEI的映射。