⼀⽂搞懂移动设备ID的那些事⼉
在移动数字⼴告领域,设备ID是⽤来追踪⽤户⾏为的最重要的标识。
对于开发者⽽⾔,设备ID的稳定性(尤其对于开放的安卓系统来说)以及统计分析和业务应⽤(变现和追踪等)扮演了⾮常关键的⾓⾊。
作为⼀个肤浅的产品经理,我们这次主要介绍的设备ID包括:IMEI,MAC,IDFA,Android ID,OAID,UUID,openUDID,GAID,Serial Number等这些⽆论是国内和海外⽐较主流的移动设备的唯⼀标识码或曾扮演重要⾓⾊的设备ID。
知道什么是设备ID不是最重要的,重要的是应⽤的场景,应⽤⽬的,以及如何应⽤,所以这次,我把设备ID分成国外主流和国内主流使⽤的场景,来分别介绍。
⼀、什么是设备ID?
设备ID是唯⼀的匿名标识符,由与单个特定移动设备或⽤户相对应的数字和字母组成。
全球所有智能⼿机和平板电脑都有唯⼀的设备ID,该ID直接存储在移动设备本⾝上。
设备ID可以通过任何已安装的应⽤程序检索,并⽤于准确衡量单个⽤户采取的操作,即⽤于统计。
设备ID在⽤户旅程和体验的所有阶段都发挥着重要作⽤,包括安装归因,应⽤内个性化,受众体细分和整体应⽤性能。
户籍所在地填什么⼆、海外的主流设备ID
海外的设备ID⽐较统⼀,⽆论是programmatic advertising市场还是performance advertising市场,⽆论⽬的是targeting audience还是tracking user的后续⾏为和效果,都是这个标准的。
Android – Google⼴告ID(GAID):Google Advertising ID是由Google Play服务提供的⽤户可重置的唯⼀⼴告ID。
iOS –⼴告商⾝份(IDFA):Identifier For Advertising,iOS独有的⼴告标识符。
要么是传了以上的两种设备ID根据响应的设备类型,要么是不传,也就是为空,再或者,是因为⽤户选择了don't track⽽展⽰的以0填充的设备ID(当然也有可能是假量导致的,各种各样的fraud花样,我们可以有时间再单独聊)。
三、国内设备ID的应⽤现状
国内的设备ID可以说五花⼋门,因为媒体传的各式各样,⾄今也没有⼀个统⼀的机构对设备ID进⾏规范。
总体上,国内的⼴告主偏向使⽤硬件地址或者稳定不变且不会被重置的设备ID。我们可以按照设备ID被在线⼴告市场接受程度(唯⼀性和稳定性)去对市⾯上的设备ID排个优先级。
Android:
IMEI:International Mobile Equipment Identity,国际移动设备⾝份码的缩写。是由15位数字组成的“电⼦串号”,它与每台⼿机⼀⼀对应,每个IMEI在世界上都是唯⼀的。
MAC地址:硬件标识符,包括WiFi mac地址和蓝⽛mac地址。Android 6.0之后被禁⽌。被禁⽌后开发者在APP端收集到的mac是乱码或者02:00:00:00:00类似样式的数据。
当然这个Mac地址可能会被不法分⼦通过线下收集处在打开WiFi情况下被探针的⽅式收集,然后匹配数据库⾥的IMEI甚⾄⼿机号等个⼈信息,所以通过WIFI上⽹或WIFI AP探针SSID⼴播都可以获取到MAC地址。
Android ID是每⼀个新设备系统都会随机的分配⼀个Andriod_ID,为64位数字。如果将设备恢复出⼚设置、刷机,则会⽣成⼀个新的ID。通过Settings.Secure.ANDROID_ID获取.
OAID: Open Anonymous Device Identifier, 由中国移动安全联盟(MSA)最近开发,它代替了中国不受⽀持的Google Advertising ID,并取代了⽬前为⽌使⽤的IMEI / MEID,但还没有被⼴泛应⽤,希望
可以⽤OAID取代现有的硬件相关的设备ID,使安卓设备的设备ID可以统⼀。
与GAID是对应的,所以可以重置OAID甚⾄完全禁⽤OAID,这是国内准备迈向隐私保护的第⼀步。
OAID⽀持的终端范围:
截图_20200427191413.png
对于不⽀持的版本,按原有逻辑⾛。
iOS:
IDFA:Identifier For Advertising,是Apple分配给⽤户设备的随机设备标识符。因为iOS设备封闭性⽐较好,⽆法取得其他硬件标识码,所以这块国内国外都⽐较统⼀。
另外,国内有很多做法是将⼀些获取到的设备ID(IMEI,MAC等)做哈希,以表⽰我没有获取到⽤户的隐私,所以衍⽣出来了IMEI MD5,IMEI SHA-1,MAC MD5,甚⾄是IDFA MD5,在我看来,就有点内味⼉了,你⾃⼰感受⼀下。
其他:
除了上⾯主流的这些,还有下⾯这些设备ID,对于我这样付钱的PM来讲,遇到的⽐较少,不过我也罗列下,以免你碰到不认识。
UDID:原苹果设备的唯⼀识别ID,它是40个字符组成。在IOS旧版本可以使⽤,但在IOS7.0以后版本苹果停⽤了此ID,新版都⽆法获取。
IDFV :是苹果设备给单个APP⾃⾝⽤于追踪⽤户的唯⼀ID,这个IDFV在⼀个APP内是唯⼀的,跨APP就不唯⼀了,因此只能⽤于单个APP⾃⾝⽤于追踪⽤户⾏为。
UUID:Universally Unique Identifier,通⽤唯⼀识别码。由于Andriod体系ID的复杂性,所以还有⼚商会根据UUID⽣成标准在APP中⽣成UUID来使⽤,听说微软会⽤这个。
MEID:(Mobile Equipment Identifier) 移动设备识别码是CDMA⼿机的⾝份识别码,也是每台CDMA⼿机或通讯平板唯⼀的识别码。
Device ID:可以⽤系统提供的TelephonyManager服务来获取,具有唯⼀性。其中⼜包括IMEI 和 MEID/ESN。具有通话功能Android设备才有,平板等设备没有;
Serial Number:设备序列号,通过android.os.Build.SERIAL获得。不稳定的唯⼀标识,依赖⼚商的实现。
杨幂刘恺威的电视剧
注:IMEI是联通、移动⼿机的标识,MEID是电信⼿机的标识,但实际上,肤浅的⼩编并没见过MEID,猜测可能是都传在IMEI哈希过字段⾥了。
四、如何获取设备ID
上⾯已经说过,设备ID主要⽤于统计数据和归因,那么可能我们需要的设备ID需要具有唯⼀性和稳定性。
讲⼀下国内外主流的⼏个设备ID的获取⽅法:
GAID:
adb shell setprop log.tag v & adb shell stop & adb shell start
2.打开get_gaid.bat⽂件。内容如下:
adb logcat -s tag GAID
3.打开核⼼即可获取GAID```
OAID:
OAID的获取其实在MSA的官⽹上根据官⽹的指导和邮件对⽅索取SDK就可以,⽬前最新的版本是2020年2⽉6⽇ miit_mdid_sdk_1.0.13,⾥⾯已经⾮常详细了。
1)下载:
www.msa-alliance/col.jsp?id=120
2)安装
把 miit_aar 拷贝到项的 libs ⽬录,并设置依赖,其中 x.x.x 代表版本号。
将 supplierconfig.json 拷贝到项⽬ assets ⽬录下,并修改⾥边对应内容,特别是需要设置 appid 的部分。需要设置 appid 的部分需要去对应⼚商的应⽤商店⾥注册⾃⼰的 app。3)设置依赖。
```implementation files(‘libs/miit_aar’)```
4)混淆设置。
```-keep class com.** {*;}```
5)设置 gradle 编译选项,这块可以根据⾃⼰对平台的选择进⾏合理配置。
```ndk {
abiFilters 'armeabi-v7a', 'x86', 'arm64-v8a', 'x86_64', 'armeabi'
}
packagingOptions {
doNotStrip "*/armeabi-v7a/*.so"
doNotStrip "*/x86/*.so"
谢娜个人资料简介doNotStrip "*/arm64-v8a/*.so"
doNotStrip "*/x86_64/*.so"
doNotStrip "armeabi.so"
}```
5)初始化。
```public class APP extends Application {
@Override
protected void attachBaseContext(Context base) {
黄贯中个人资料super.attachBaseContext(base);
JLibrary.InitEntry(base);
}
}```
6)设置回调
```public interface AppIdsUpdater {
void OnValidId(@NonNull JSONObject ids);
}```
7)设置调⽤类
```public class MiIdHelper implements IIdentifierListener {
private boolean isSupport;
private String oaid, vaid, aaid;
public JSONObject getDeviceIds(Context cxt) {
long startTime = System.currentTimeMillis();
int code = CallFromReflect(cxt);
long endTime = System.currentTimeMillis();
long time = endTime - startTime;
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("description", descriptionCode(code));
jsonObject.put("description", descriptionCode(code));
jsonObject.put("code", code);
jsonObject.put("time", time);
jsonObject.put("isSupport", isSupport);
jsonObject.put("oaid", oaid);
jsonObject.put("vaid", vaid);
jsonObject.put("aaid", aaid);
} catch (Exception e) {
e.printStackTrace();
}
return jsonObject;
}
private int CallFromReflect(Context cxt) {
return MdidSdkHelper.InitSdk(cxt, true, this);
}
@Override
public void OnSupport(boolean isSupport, IdSupplier _supplier) {
this.isSupport = isSupport;
if (_supplier != null) {
this.oaid = _OAID();
this.vaid = _VAID();
this.aaid = _AAID();
_supplier.shutDown();
}
裴涩琪电影
}
private String descriptionCode(int code) {
switch (code) {
case ErrorCode.INIT_ERROR_DEVICE_NOSUPPORT:
迟帅出柜return "DEVICE_NOSUPPORT";
case ErrorCode.INIT_ERROR_LOAD_CONFIGFILE:
return "LOAD_CONFIGFILE";
case ErrorCode.INIT_ERROR_MANUFACTURER_NOSUPPORT:
return "MANUFACTURER_NOSUPPORT";
case ErrorCode.INIT_ERROR_RESULT_DELAY:
return "RESULT_DELAY";
case ErrorCode.INIT_HELPER_CALL_ERROR:
return "HELPER_CALL_ERROR";
default:
return "SUCCESS";
}
}
}```
8)获取OAID
```  MiIdHelper miIdHelper = new MiIdHelper();
JSONObject DeviceIds(getApplicationContext());```
9)效果展⽰
```{
"description":"SUCCESS",
"code":0,
"time":49,
"isSupport":true,
"oaid":"cf8cc008bb5adf96",
"vaid":"f8239c19f92836f1",
"aaid":"0115d997-c845-4e86-8fed-58c4fb246827"
}```
>来源:juejin.im/post/5df854745188251280061d3f
idfa:
``` #include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_dl.h>
#import <AdSupport/AdSupport.h>
- (NSString *)zx_idfaString
{
NSBundle *adSupportBundle = [NSBundle bundleWithPath:@"/System/Library/Frameworks/AdSupport.framework"];