作者:闲鱼技术-抚凌
业务背景
- 用户增长,是开源节流促成长的过程,是包含了有效用户增长、用户成长、用户变现、用户传播、防止用户流失等一整套增长流程,而非单纯数量上的增长。
- 在实践中,增长手段主要聚焦在如何获取用户和提升用户活跃度上。在用户获取成本不断升高的背景下,任何一种获取用户的方式都变得昂贵且效果难以评估,就好比我们都知道广告投出去有一半钱是浪费掉了,但却不知道是哪部分。
- 为了评估增长手段的有效性,首先需要一种能在各个渠道追踪用户行为的手段。一般会使用设备指纹技术来唯一标识用户,即通过一系列设备信息生成设备的唯一标识,用设备标识来替代用户标识作为追踪用户的手段。
问题定义
可以用于标识出该设备的设备特征或者独特的设备标识被称为设备。设备指纹因子通常包括计算机的操作系统类型,安装的各种插件,浏览器的语言设置及其时区 、设备的硬件ID,手机的IMEI,电脑的网卡Mac地址,字体设置等,通过某种Hash算法生产特征字符串来用作设备指纹。设备指纹服务有两个核心问题需要解决问题:
- 设备ID的有效性:无论使用单一还是多种信息来源,设备指纹的有效性取决于设备ID的有效性。存在两种可能无效情况,ID冲突和ID漂移。ID冲突指不同设备拥有了相同的ID,ID漂移指一台设备在不同环境或时间获取时获取到了不同的ID。
- 设备服务架构的扩展性和可靠性:不同的渠道可能会定义不同的设备ID组合作为设备指纹的来源,在多个渠道间交互时需要支持和兼容多种ID组合的查询和转化;设备服务需要广泛应用于增长手段的各个环节,服务的访问量会明显大于一般的产品链路服务,因此对可靠性也有较高要求。
我们针对这两个核心问题,在下文中分别给出对应的问题分析和解法。
设备指纹ID
Android设备可以获取的ID
- IMEI——国际移动设备识别码(International Mobile Equipment Identity),即通常所说的手机序列号、手机“串号”,用于在移动电话网络中识别每一部独立的手机等移动通信设备,相当于移动电话的身份证。几乎所有的设备都可以返回这个串号,并且唯一较好。它根据不同的手机设备返回IMEI,MEID或者ESN码。
- IMSI——国际移动用户识别码(IMSI:International Mobile Subscriber Identification Number)是区别移动用户的标志,储存在SIM卡中,可用于区别移动用户的有效信息。当手机上装有 Sim 卡并且可用时,返回该值,不同 Sim 卡的返回值不同。
- MAC——可以使用手机Wifi或蓝牙的MAC地址作为设备标识。 并不是所有的设备都有Wifi和蓝牙硬件,硬件不存在时获取不到。
- ANDROIDID——安卓ID,在设备第一次启动的时候生成并保存,并且可能会在恢复出厂设置后重置该值。理论上是大部分是重置的。通常被认为不可信,因为它有时为null。开发文档中说明了:这个ID会改变如果进行了出厂设置。并且,如果某个Andorid手机被Root过的话,这个ID也可以被任意改变。
iOS设备可以获取的ID
- IDFA——Identifier For Advertising。直译就是广告id, 在同一个设备上的所有App都会取到相同的值,是苹果专门给各广告提供商用来追踪用户而设的,iOS默认设置是允许追踪。用户可以在设置里重置此id的值,或限制此id的使用,故此id有可能会取不到值。iOS6及之后版本可以使用。
- IDFV——Identifier for Vendor,提供给APP供应商使用的ID。每个设备在所属同一个APP供应商的应用里,都有相同的值。iOS6及之后版本可以使用。
- UDID——Unique Device Identifier。设备的唯一设备识别符。UDID从iOS5开始被禁止使用。
- UUID——Universally Unique Identifier,通用唯一标识符。可以在应用启动时生成,它保证对在同一时空中的所有机器都是唯一的。但除非本地保存后获取本地址,每次调用生成的ID均不相同。
- MAC——同Android中的定义,iOS7开始只能获取一个固定值。
新一代的设备指纹技术
传统的设备识别手段主要依赖于单一的信息源,与此不同,新一代的设备指纹技术使用更多的信息来完成设备的识别。它通过网络收集终端设备的特征信息,并在分析与鉴别的基础上,对每一组从终端设备采集的特征信息组合赋予唯一的设备指纹ID,用以标识该终端设备。一般具有开发能力的厂商均有自己的一套生成方案,同时也有第三方的厂商提供解决方案以供使用。以下以阿里使用的UMID(唯一设备ID)为例,说明设备指纹ID在各平台上所具有的能力。
iOS上的能力
- 卸载重装App, UMID不变
- 跨App,UMID不变
- 限制广告跟踪,(采集不到IDFA),UMID不变
- 还原广告标识,(IDFA变更),UMID不
- 恢复出厂设置,UMID不变
- 备份恢复不会导致两个设备UMID一致
- 准确识别是否越狱
- 准确识别越狱之后是否被Hook
Android上的能力
- Android 6.0下无采集IMEI/MAC权限,UMID不变
- 修改IMEI/IMSI/MAC/aid,UMID不变
- Android 7.0跨APP,UMID不变
- 平行空间UMID不变
- 准确识别各种模拟器
- 准确识别是否Root
- 准确识别是否被Hook
设备指纹ID选型
- 比较好的设备指纹ID,需要保证尽可能少的出现ID冲突和ID漂移。并且,在权限限制、设备信息篡改,系统重装、APP重装情况下也需要保证尽可能不变化。
- 集团内部的设备指纹ID方案已经经受住了大量业务的考验,不仅适用于做用户行为的追踪,同时也具有一定的安全防刷能力。因此,闲鱼用户设备信息采用UMID作为唯一标识。同时对于多个数据来源(闲鱼用户历史设备登录记录,闲鱼用户历史安全设备记录,闲鱼用户设备采集记录)打通,水平扩展可以支持的IMEI,IMSI,MAC,IDFA,YunosUUID,Google广告ID等ID的查询。
架构设计
闲鱼用户设备服务架构设计
- MySQL——创建以umid为主键的闲鱼用户设备主表。一个用户可以有多个设备,一个设备仅记录最近使用的用户。数据量较大,需要做分库分表。
- HiStore——用于多维查询,数据从MySQL中同步。HiStore是阿里中间件技术团队研发的数据库产品,是一款基于独特的知识网格技术的列式数据库,定位于海量数据高压缩比列式存储,是低存储成本,低维护成本,海量数据OLAP存储引擎;有效的解决了海量数据存储的成本问题,以及在百亿数据场景下支持实时高效的多维度自由组合的检索。外部开源的解决方案有Infobright等。
- 实时读取——分布式key/value存储系统 Tair。Tair是一个Key/Value结构数据的解决方案,它默认支持基于内存和文件的两种存储方式,分别和我们通常所说的缓存和持久化存储对应。通过tair可以定制业务所需要的缓存,也可以作为持久化存储完整存储整个闲鱼用户设备表(以Umid为key)。外部开源产品可以选用Redis。
实践场景(广告投放)
OCPC/OCPA/OCPM:
OCPC是Optimized Cost per Click的缩写,即优化点击付费,本质还是按照cpc付费;OCPA是Optimized Cost per Action的缩写,即优化行为出价,本质还是按照cpa付费;Optimized Cost per Click的缩写,即优化点击付费,本质还是按照cpc付费;Optimized Cost per Mille的缩写,即优化千次展现出价,本质还是按照cpm付费。三种出价策略除了对应的优化目标不同,本质上都是采用更科学的转化率预估机制,帮助广告主在获取更多优质流量的同时提高转化完成率。系统会在广告主出价基础上,基于多维度、实时反馈及历史积累的海量数据,并根据预估的转化率以及竞争环境智能化的动态调整出价,进而优化广告排序,帮助广告主竞得最适合的流量,并降低转化成本。
- 广告投放的数据流示意图(以激活为例)
闲鱼和广告商的数据流交互图
流程说明
- 广告商在监测事件同步接口(接口一)中会同步点击数据给闲鱼。同步数据包含用户的设备信息(IDFA/IMEI/OS等)、业务信息(广告计划id/广告创意 id/点击时间等)和回调信息(回调地址或回调参数)
- 闲鱼接收到同步数据,根据OS将设备id设为key,将回调信息作为value存储在Tair中。
- 闲鱼用户激活或者注册时触发设备信息采集,经过清洗后更新至闲鱼用户设备表中。同时查询是否有可以匹配的回调信息,根据点击事件和转化目标,处理回调信息后回调用户转化目标数据给广告商。
- 广告商收到回调数据后,优化模型,更新出价,帮助闲鱼获取更适合转化的目标人群,降低转化成本。
总结
在目前的闲鱼用户增长实践中,广告投放优化已经给闲鱼带来了巨大的收益,有效的控制了广告投放的成本,使得增长团队可以进一步扩大广告投放的渠道和范围。除了用于广告投放优化,闲鱼设备服务还支撑了deeplink,智能投放和用户生命周期等一系列增长手段的尝试。未来,闲鱼技术团队还会进一步探索技术上的可能性,驱动闲鱼用户增长业务的发展。