一文搞懂移動(dòng)設(shè)備ID的那些事兒

在移動(dòng)數(shù)字廣告領(lǐng)域锚沸,設(shè)備ID是用來(lái)追蹤用戶行為的最重要的標(biāo)識(shí)跋选。
對(duì)于開(kāi)發(fā)者而言,設(shè)備ID的穩(wěn)定性(尤其對(duì)于開(kāi)放的安卓系統(tǒng)來(lái)說(shuō))以及統(tǒng)計(jì)分析和業(yè)務(wù)應(yīng)用(變現(xiàn)和追蹤等)扮演了非常關(guān)鍵的角色哗蜈。

作為一個(gè)膚淺的產(chǎn)品經(jīng)理前标,我們這次主要介紹的設(shè)備ID包括:IMEI,MAC,IDFA,Android ID距潘,OAID炼列,UUID,openUDID音比,GAID俭尖,Serial Number等這些無(wú)論是國(guó)內(nèi)和海外比較主流的移動(dòng)設(shè)備的唯一標(biāo)識(shí)碼或曾扮演重要角色的設(shè)備ID。
知道什么是設(shè)備ID不是最重要的洞翩,重要的是應(yīng)用的場(chǎng)景稽犁,應(yīng)用目的,以及如何應(yīng)用骚亿,所以這次已亥,我把設(shè)備ID分成國(guó)外主流和國(guó)內(nèi)主流使用的場(chǎng)景,來(lái)分別介紹来屠。

一虑椎、什么是設(shè)備ID震鹉?

設(shè)備ID是唯一的匿名標(biāo)識(shí)符,由與單個(gè)特定移動(dòng)設(shè)備或用戶相對(duì)應(yīng)的數(shù)字和字母組成捆姜。

全球所有智能手機(jī)和平板電腦都有唯一的設(shè)備ID传趾,該ID直接存儲(chǔ)在移動(dòng)設(shè)備本身上。

設(shè)備ID可以通過(guò)任何已安裝的應(yīng)用程序檢索娇未,并用于準(zhǔn)確衡量單個(gè)用戶采取的操作墨缘,即用于統(tǒng)計(jì)。

設(shè)備ID在用戶旅程和體驗(yàn)的所有階段都發(fā)揮著重要作用零抬,包括安裝歸因镊讼,應(yīng)用內(nèi)個(gè)性化,受眾群體細(xì)分和整體應(yīng)用性能平夜。

二蝶棋、海外的主流設(shè)備ID

海外的設(shè)備ID比較統(tǒng)一,無(wú)論是programmatic advertising市場(chǎng)還是performance advertising市場(chǎng)忽妒,無(wú)論目的是targeting audience還是tracking user的后續(xù)行為和效果玩裙,都是這個(gè)標(biāo)準(zhǔn)的。
Android – Google廣告ID(GAID):Google Advertising ID是由Google Play服務(wù)提供的用戶可重置的唯一廣告ID段直。

iOS –廣告商身份(IDFA):Identifier For Advertising吃溅,iOS獨(dú)有的廣告標(biāo)識(shí)符。

要么是傳了以上的兩種設(shè)備ID根據(jù)響應(yīng)的設(shè)備類型鸯檬,要么是不傳决侈,也就是為空,再或者喧务,是因?yàn)橛脩暨x擇了don't track而展示的以0填充的設(shè)備ID(當(dāng)然也有可能是假量導(dǎo)致的赖歌,各種各樣的fraud花樣,我們可以有時(shí)間再單獨(dú)聊)功茴。

三庐冯、國(guó)內(nèi)設(shè)備ID的應(yīng)用現(xiàn)狀

國(guó)內(nèi)的設(shè)備ID可以說(shuō)五花八門,因?yàn)槊襟w傳的各式各樣坎穿,至今也沒(méi)有一個(gè)統(tǒng)一的機(jī)構(gòu)對(duì)設(shè)備ID進(jìn)行規(guī)范展父。
總體上,國(guó)內(nèi)的廣告主偏向使用硬件地址或者穩(wěn)定不變且不會(huì)被重置的設(shè)備ID玲昧。我們可以按照設(shè)備ID被在線廣告市場(chǎng)接受程度(唯一性和穩(wěn)定性)去對(duì)市面上的設(shè)備ID排個(gè)優(yōu)先級(jí)犯祠。
Android:

IMEI:International Mobile Equipment Identity,國(guó)際移動(dòng)設(shè)備身份碼的縮寫酌呆。是由15位數(shù)字組成的“電子串號(hào)”衡载,它與每臺(tái)手機(jī)一一對(duì)應(yīng),每個(gè)IMEI在世界上都是唯一的隙袁。

MAC地址:硬件標(biāo)識(shí)符痰娱,包括WiFi mac地址和藍(lán)牙m(xù)ac地址弃榨。Android 6.0之后被禁止。被禁止后開(kāi)發(fā)者在APP端收集到的mac是亂碼或者02:00:00:00:00類似樣式的數(shù)據(jù)梨睁。

當(dāng)然這個(gè)Mac地址可能會(huì)被不法分子通過(guò)線下收集處在打開(kāi)WiFi情況下被探針的方式收集鲸睛,然后匹配數(shù)據(jù)庫(kù)里的IMEI甚至手機(jī)號(hào)等個(gè)人信息,所以通過(guò)WIFI上網(wǎng)或WIFI AP探針SSID廣播都可以獲取到MAC地址坡贺。

Android ID是每一個(gè)新設(shè)備系統(tǒng)都會(huì)隨機(jī)的分配一個(gè)Andriod_ID官辈,為64位數(shù)字。如果將設(shè)備恢復(fù)出廠設(shè)置遍坟、刷機(jī)拳亿,則會(huì)生成一個(gè)新的ID。通過(guò)Settings.Secure.ANDROID_ID獲取.

OAID: Open Anonymous Device Identifier, 由中國(guó)移動(dòng)安全聯(lián)盟(MSA)最近開(kāi)發(fā)愿伴,它代替了中國(guó)不受支持的Google Advertising ID肺魁,并取代了目前為止使用的IMEI / MEID,但還沒(méi)有被廣泛應(yīng)用隔节,希望可以用OAID取代現(xiàn)有的硬件相關(guān)的設(shè)備ID鹅经,使安卓設(shè)備的設(shè)備ID可以統(tǒng)一。

與GAID是對(duì)應(yīng)的怎诫,所以可以重置OAID甚至完全禁用OAID瘾晃,這是國(guó)內(nèi)準(zhǔn)備邁向隱私保護(hù)的第一步。

OAID支持的終端范圍:


微信截圖_20200427191413.png

對(duì)于不支持的版本幻妓,按原有邏輯走蹦误。

iOS:

IDFA:Identifier For Advertising,是Apple分配給用戶設(shè)備的隨機(jī)設(shè)備標(biāo)識(shí)符涌哲。因?yàn)閕OS設(shè)備封閉性比較好胖缤,無(wú)法取得其他硬件標(biāo)識(shí)碼尚镰,所以這塊國(guó)內(nèi)國(guó)外都比較統(tǒng)一阀圾。

另外,國(guó)內(nèi)有很多做法是將一些獲取到的設(shè)備ID(IMEI,MAC等)做哈希狗唉,以表示我沒(méi)有獲取到用戶的隱私初烘,所以衍生出來(lái)了IMEI MD5,IMEI SHA-1,MAC MD5,甚至是IDFA MD5,在我看來(lái)分俯,就有點(diǎn)內(nèi)味兒了肾筐,你自己感受一下。

其他:

除了上面主流的這些缸剪,還有下面這些設(shè)備ID吗铐,對(duì)于我這樣付錢的PM來(lái)講,遇到的比較少杏节,不過(guò)我也羅列下唬渗,以免你碰到不認(rèn)識(shí)典阵。

UDID:原蘋果設(shè)備的唯一識(shí)別ID,它是40個(gè)字符組成镊逝。在IOS舊版本可以使用,但在IOS7.0以后版本蘋果停用了此ID,新版都無(wú)法獲取假颇。

IDFV :是蘋果設(shè)備給單個(gè)APP自身用于追蹤用戶的唯一ID蛾狗,這個(gè)IDFV在一個(gè)APP內(nèi)是唯一的,跨APP就不唯一了座菠,因此只能用于單個(gè)APP自身用于追蹤用戶行為狸眼。

UUID:Universally Unique Identifier,通用唯一識(shí)別碼辈灼。由于Andriod體系ID的復(fù)雜性份企,所以還有廠商會(huì)根據(jù)UUID生成標(biāo)準(zhǔn)在APP中生成UUID來(lái)使用,聽(tīng)說(shuō)微軟會(huì)用這個(gè)巡莹。

MEID:(Mobile Equipment Identifier) 移動(dòng)設(shè)備識(shí)別碼是CDMA手機(jī)的身份識(shí)別碼司志,也是每臺(tái)CDMA手機(jī)或通訊平板唯一的識(shí)別碼。

Device ID:可以用系統(tǒng)提供的TelephonyManager服務(wù)來(lái)獲取降宅,具有唯一性骂远。其中又包括IMEI 和 MEID/ESN。具有通話功能Android設(shè)備才有腰根,平板等設(shè)備沒(méi)有激才;

Serial Number:設(shè)備序列號(hào),通過(guò)android.os.Build.SERIAL獲得额嘿。不穩(wěn)定的唯一標(biāo)識(shí)瘸恼,依賴廠商的實(shí)現(xiàn)。

注:IMEI是聯(lián)通册养、移動(dòng)手機(jī)的標(biāo)識(shí)东帅,MEID是電信手機(jī)的標(biāo)識(shí),但實(shí)際上球拦,膚淺的小編并沒(méi)見(jiàn)過(guò)MEID靠闭,猜測(cè)可能是都傳在IMEI哈希過(guò)字段里了。

四坎炼、如何獲取設(shè)備ID

上面已經(jīng)說(shuō)過(guò)愧膀,設(shè)備ID主要用于統(tǒng)計(jì)數(shù)據(jù)和歸因,那么可能我們需要的設(shè)備ID需要具有唯一性和穩(wěn)定性谣光。

講一下國(guó)內(nèi)外主流的幾個(gè)設(shè)備ID的獲取方法:

GAID:

adb shell setprop log.tag v & adb shell stop & adb shell start
2.打開(kāi)get_gaid.bat文件。內(nèi)容如下:
adb logcat -s tag GAID
3.打開(kāi)核心即可獲取GAID```

OAID:

OAID的獲取其實(shí)在MSA的官網(wǎng)上根據(jù)官網(wǎng)的指導(dǎo)和郵件對(duì)方索取SDK就可以萄金,目前最新的版本是2020年2月6日 miit_mdid_sdk_1.0.13蟀悦,里面已經(jīng)非常詳細(xì)了碳柱。

1)下載:

http://www.msa-alliance.cn/col.jsp?id=120

2)安裝

把 miit_mdid_x.x.x.aar 拷貝到項(xiàng)的 libs 目錄,并設(shè)置依賴熬芜,其中 x.x.x 代表版本號(hào)莲镣。

將 supplierconfig.json 拷貝到項(xiàng)目 assets 目錄下,并修改里邊對(duì)應(yīng)內(nèi)容涎拉,特別是需要設(shè)置 appid 的部分瑞侮。需要設(shè)置 appid 的部分需要去對(duì)應(yīng)廠商的應(yīng)用商店里注冊(cè)自己的 app。

3)設(shè)置依賴鼓拧。

```implementation files(‘libs/miit_mdid_x.x.x.aar’)```

4)混淆設(shè)置半火。

```-keep class com.bun.miitmdid.core.** {*;}```

5)設(shè)置 gradle 編譯選項(xiàng),這塊可以根據(jù)自己對(duì)平臺(tái)的選擇進(jìn)行合理配置季俩。

```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)設(shè)置回調(diào)
```public interface AppIdsUpdater {
        void OnValidId(@NonNull JSONObject ids);
    }```
7)設(shè)置調(diào)用類
 ```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("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 = _supplier.getOAID();
            this.vaid = _supplier.getVAID();
            this.aaid = _supplier.getAAID();
            _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 result=miIdHelper.getDeviceIds(getApplicationContext());```
9)效果展示

```{
    "description":"SUCCESS",
    "code":0,
    "time":49,
    "isSupport":true,
    "oaid":"cf8cc008bb5adf96",
    "vaid":"f8239c19f92836f1",
    "aaid":"0115d997-c845-4e86-8fed-58c4fb246827"

}```
>來(lái)源:https://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"];
    [adSupportBundle load];
    
    if (adSupportBundle == nil)
    {
        return @"";
    }
    else
    {
        Class asIdentifierMClass = NSClassFromString(@"ASIdentifierManager");
        
        if(asIdentifierMClass == nil){
            return @"";
        }
        else
        {
            ASIdentifierManager *asIM = [[asIdentifierMClass alloc] init];
            
            if (asIM == nil) {
                return @"";
            }
            else{
                
                if(asIM.advertisingTrackingEnabled)
                {
                    return [asIM.advertisingIdentifier UUIDString];
                }
            }
        }
    }
}```
>來(lái)源:https://juejin.im/post/5bdbb926f265da391e58fa92


##總結(jié):

國(guó)內(nèi)設(shè)備ID統(tǒng)一任重而道遠(yuǎn);

國(guó)外用戶隱私倒是越來(lái)越嚴(yán)酌住。

無(wú)論是前些年實(shí)施的歐盟的'GDPR',還是加州的'CCPA','COPPA'店归,以及今年google逐步實(shí)施的三方cookie,可以說(shuō)都對(duì)對(duì)應(yīng)地區(qū)和用戶的用戶的隱私更加嚴(yán)格和個(gè)性化的保護(hù)酪我,反過(guò)來(lái)對(duì)在線廣告行業(yè)卻是一個(gè)挑戰(zhàn)消痛,行業(yè)需要升級(jí),所以總會(huì)找到兩者兼顧的方面去做改進(jìn)都哭。

也希望國(guó)內(nèi)的在線廣告的設(shè)備ID秩伞,包括OTT在內(nèi),逐漸走向在變現(xiàn)路上兼顧用戶隱私的正軌欺矫。
![image](https://upload-images.jianshu.io/upload_images/13766341-8ee60d86f2d6b265?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纱新,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子穆趴,更是在濱河造成了極大的恐慌脸爱,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毡代,死亡現(xiàn)場(chǎng)離奇詭異阅羹,居然都是意外死亡勺疼,警方通過(guò)查閱死者的電腦和手機(jī)教寂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)执庐,“玉大人酪耕,你說(shuō)我怎么就攤上這事」焯剩” “怎么了迂烁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵看尼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我盟步,道長(zhǎng)藏斩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任却盘,我火速辦了婚禮狰域,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘黄橘。我一直安慰自己兆览,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布塞关。 她就那樣靜靜地躺著抬探,像睡著了一般。 火紅的嫁衣襯著肌膚如雪帆赢。 梳的紋絲不亂的頭發(fā)上小压,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音椰于,去河邊找鬼场航。 笑死,一個(gè)胖子當(dāng)著我的面吹牛廉羔,可吹牛的內(nèi)容都是我干的溉痢。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼憋他,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼孩饼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起竹挡,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤镀娶,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后揪罕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體梯码,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年好啰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了轩娶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡框往,死狀恐怖鳄抒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤许溅,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布瓤鼻,位于F島的核電站,受9級(jí)特大地震影響贤重,放射性物質(zhì)發(fā)生泄漏茬祷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一并蝗、第九天 我趴在偏房一處隱蔽的房頂上張望牲迫。 院中可真熱鬧,春花似錦借卧、人聲如沸盹憎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)陪每。三九已至,卻和暖如春镰吵,著一層夾襖步出監(jiān)牢的瞬間檩禾,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工疤祭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盼产,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓勺馆,卻偏偏與公主長(zhǎng)得像戏售,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子草穆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345