android獲取設(shè)備唯一ID(優(yōu)化方案)

最近慨菱,因公司產(chǎn)品及客戶需要燃箭,領(lǐng)導(dǎo)讓我研究免存儲(chǔ)設(shè)備ID,以及給出一個(gè)設(shè)備ID最佳的方案(可與存儲(chǔ)相結(jié)合)鸥咖。在研究過(guò)瀏覽器的fingerprient2js后燕鸽,頗有心得,并且看網(wǎng)上似乎木有完美的解決方案啼辣,于是寫(xiě)了這篇文章啊研,僅供需要的開(kāi)發(fā)者參考。(該算法暫未進(jìn)行驗(yàn)證鸥拧,這里先給出一個(gè)jar包党远,后期我會(huì)在SDK中加入調(diào)查接口,分兩個(gè)jar包(測(cè)試版和正式版)富弦,希望開(kāi)發(fā)者能支持測(cè)試版沟娱,穩(wěn)定后使用正式版。)
在產(chǎn)品中腕柜,首先肯定要盡量避免權(quán)限济似,其次考慮卸載APP后ID不一致的問(wèn)題,再就是盡量結(jié)合存儲(chǔ)盏缤,降低卸載或重裝app時(shí)砰蠢,設(shè)備ID改變的概率。最后唉铜,設(shè)計(jì)出合理方案台舱,對(duì)造成不利的因素進(jìn)行列舉。
A.android_id:
什么是android_id呢潭流?當(dāng)設(shè)備在第一次啟動(dòng)時(shí)竞惋,系統(tǒng)會(huì)隨機(jī)產(chǎn)生一個(gè)64位的數(shù)字,然后以16進(jìn)制的形式保存在設(shè)備上灰嫉,且API提供了獲取這一參數(shù)的方法:

Settings.System.getString(context.getContentResolver(), Settings.System.ANDROID_ID)拆宛;

這就是android_id,當(dāng)設(shè)備重新初始化或者刷機(jī)的時(shí)候,會(huì)被重置熬甫。
除此以外胰挑,android_id還有其他的bug,比如:
1.不同的設(shè)備可能會(huì)產(chǎn)生相同的android_id椿肩。
2.有的廠商設(shè)備無(wú)法獲取android_id,會(huì)返回null瞻颂。
3.對(duì)于CDMA的設(shè)備,ANDROID_ID和TelephonyManager.getDeviceId() 的值相同郑象。
4.不同的android系統(tǒng)版本穩(wěn)定性不同贡这。
B.硬件序列號(hào)(SERIAL)

Build.SERIAL

API給的解釋是:
A hardware serial number, if available.(一個(gè)硬件的序列碼,如果有效的話)
so厂榛,雖然我沒(méi)有用幾百臺(tái)手機(jī)測(cè)試盖矫,也能知道這個(gè)值有時(shí)候是無(wú)效的丽惭,說(shuō)的這么隱晦。
C.指紋
fingerprint:設(shè)備的唯一標(biāo)識(shí)辈双。由設(shè)備的多個(gè)信息拼接合成责掏。

Build.FINGERPRINT

也是在JavaScript才接觸到這個(gè)單詞”fingerprint“,這個(gè)詞也很生動(dòng)湃望,意思是能大概的標(biāo)識(shí)一個(gè)設(shè)備换衬,像指紋一樣,但不排除重復(fù)的可能性证芭。
理論上講用這個(gè)屬性是可以標(biāo)識(shí)一個(gè)設(shè)備的瞳浦,但是其實(shí)并不是,兩臺(tái)一摸一樣的新手機(jī)废士,這個(gè)值相同的可能性是很多的叫潦。為了更加進(jìn)一步的精確,后面還會(huì)介紹幾個(gè)屬性官硝,并把幾個(gè)屬性結(jié)合在一起矗蕊,生成一個(gè)接近100%的UUID。
D.android系統(tǒng)提供了獲取android系統(tǒng)版本號(hào)泛源,生產(chǎn)廠商拔妥,固件版本推出時(shí)間的API.
E.android系統(tǒng)提供了當(dāng)前android設(shè)備是12或24小時(shí)制顯示時(shí)間的API忿危,
F.android系統(tǒng)提供了當(dāng)前android設(shè)備的修訂版本列表达箍,顯示屏,主板等等參數(shù)铺厨。
G.可以允許用戶根據(jù)需求用自定義字符串去為FP做貢獻(xiàn)缎玫,比如IP地址等

方案:
在不需要用戶權(quán)限的前提下,網(wǎng)上最完美的方案是將android_id和硬件序列號(hào)解滓,如果其中任意一種失效就使用另外一種赃磨。受FingerPrint2js的啟發(fā),我看了Android獲取系統(tǒng)硬件相關(guān)的API洼裤,將所有不經(jīng)常變化且能代表一定用戶群體的屬性都取出來(lái)進(jìn)行MD5運(yùn)算邻辉,包含但不限于依據(jù)中所述的信息。準(zhǔn)確性還需進(jìn)一步驗(yàn)證腮鞍,但理論上要比FingerPrint2js準(zhǔn)確性高值骇,也在網(wǎng)上給出的比較好的方案基礎(chǔ)上進(jìn)一步縮小了FP可能重復(fù)的概率。
1.第一次進(jìn)入APP時(shí)移国,獲取系統(tǒng)相關(guān)配置信息生成FP吱瘩,存入SP。
2.每次訪問(wèn)迹缀,先從SP取使碾,沒(méi)有再通過(guò)相關(guān)配置信息生成FP蜜徽,存入SP。
3.封裝成jar票摇,只給用戶暴露出獲取ID的接口拘鞋、傳遞自定義信息構(gòu)建FP的接口以及第一次安裝時(shí)間戳的接口(或設(shè)置標(biāo)簽調(diào)用的接口)
單純對(duì)于FP而言,有兩個(gè)主要問(wèn)題需要解決矢门,一是FP重復(fù)的問(wèn)題掐禁,相同配置的新設(shè)備重復(fù)可能性極大,增多給FP貢獻(xiàn)的因素的數(shù)量颅和,可以有效降低重復(fù)率傅事。二是FP改變的問(wèn)題,貢獻(xiàn)FP的生成因素的其中一個(gè)如果改變峡扩,F(xiàn)P就會(huì)改變蹭越。所以如果FP的貢獻(xiàn)因素?cái)?shù)量過(guò)多,導(dǎo)致FP改變的概率也就變大教届,所以說(shuō)客戶要在兩者之間做一個(gè)很好的平衡响鹃。

對(duì)比:

   與之前直接將隨機(jī)生成的ID存儲(chǔ)到SP相比,現(xiàn)在的方案大大減小了用戶卸載重裝時(shí)案训,F(xiàn)P改變的概率买置。(只有在相關(guān)配置信息改變,且用戶又卸載重裝了app强霎,deviceID才會(huì)改變)

為android FP做貢獻(xiàn)的各配置參數(shù):(示例以6.0的華為榮耀8為例)

1.Android_ID:Settings.System.getString(context.getContentResolver(), Settings.System.ANDROID_ID) //低版本穩(wěn)定忿项,高版本不穩(wěn)定 示例:295a4fbf716094ee
2.Build.SERIAL 設(shè)備序列號(hào)(有的設(shè)備無(wú)法獲取) 示例:WTK7N16923005607
3.Build.FINGERPRINT 設(shè)備指紋(同樣的新設(shè)備該值應(yīng)該是一樣的) 示例:honor/FRD-AL00/HWFRD:6.0/HUAWEIFRD-AL00/C00B171:user/release-keys
4.Build.TIME 固件推出日期 示例:1477442228000
5.Build.VERSION.INCREMENTAL 源碼控制版本號(hào) 示例: C00B171
6.Build.getRadioVersion() 獲取無(wú)線電固件版本 示例:21.210.03.00.031,21.210.03.00.031
7.Build.HARDWARE 硬件名稱 示例:hi3650
8.Build.VERSION.SECURITY_PATCH 用戶可見(jiàn)安全補(bǔ)丁level(這里我得到的是日期城舞,可能是補(bǔ)丁修復(fù)的時(shí)間)示例:2016-10-01
9.當(dāng)前設(shè)備是12/24時(shí)制:Settings.System.getString(context.getContentResolver(), Settings.System.TIME_12_24) 示例:null(有的手機(jī)可以獲刃ァ)
10.Build.VERSION.SDK_INT SDK版本號(hào) (一般講是與系統(tǒng)版本號(hào)一一對(duì)應(yīng)的) 示例:23
11.Build.SUPPORTED_32_BIT_ABIS 支持32位ABIs的列表(數(shù)值)示例:[armeabi-v7a,armeabi]
12.Build.SUPPORTED_64_BIT_ABIS 支持64位ABIs的列表(數(shù)值)示例:[arm64-v8a]
13.Build.BOOTLOADER 系統(tǒng)啟動(dòng)程序版本號(hào) 示例:unknown
14.Build.VERSION.RELEASE 用戶可見(jiàn)版本 示例: 6.0

  1. Build.SUPPORTED_ABIS 支持ABIs的列表(數(shù)值)示例:[arm64-v8a,armeabi-v7a,armeabi]

16.Build.BOARD 主板 示例:FRD-AL00

17.Build.BRAND 系統(tǒng)定制商 示例:honor

  1. Build.CPU_ABI CPU指令集 示例:arm64-v8a
  2. Build.CPU_ABI2 CPU指令集2 示例:空值
  3. Build.DEVICE 設(shè)備參數(shù) 示例:HWFRD

21.Build.HOST 示例:huawei-RH2288H-V2-12L

  1. Build.ID 修訂版本列表 示例:HUAWEIFRD-AL00

23.Build.MANUFACTURER 產(chǎn)品/硬件的制造商 示例:HUAWEI

  1. Build.MODEL 示例:FRD-AL00

25.Build.PRODUCT 產(chǎn)品的名稱 示例:FRD-AL00

26.Build.TAGS 描述Build的標(biāo)簽(Comma-separated tags describing the build, like "unsigned,debug".) 示例:release-keys

  1. Build.TYPE 描述Build的類型(The type of build, like "user" or "eng".) 示例:user

28.Build.USER 描述Build的USER 示例:jslave

  1. Build.DISPLAY A build ID string meant for displaying to the user 示例:FRD-AL00C00B171
    30.Build.VERSION.CODENAME 當(dāng)前開(kāi)發(fā)代號(hào),或者字符串“REL”(如果是正式的發(fā)布版本) 示例: REL

31.Build.VERSION.BASE_OS 基帶版本 The base OS build the product is based on. 示例:空值

32.自定義字符串或自定義數(shù)組

最后編輯于
?著作權(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)店門(mé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

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理镀首,服務(wù)發(fā)現(xiàn)坟漱,斷路器,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,320評(píng)論 8 265
  • 2016年1月1日更哄,一個(gè)簡(jiǎn)單又普通的日子芋齿,我們結(jié)婚了。說(shuō)真的成翩,很開(kāi)心觅捆。經(jīng)歷那么多,也有過(guò)風(fēng)風(fēng)雨雨麻敌,有過(guò)坎坷...
    丁丁的貓1209閱讀 572評(píng)論 7 12
  • 糖果鏈接 項(xiàng)目 AAA Chain是一個(gè)獨(dú)立的公有鏈栅炒,致力于利用區(qū)塊鏈技術(shù)打造一個(gè)由海量垂直場(chǎng)景應(yīng)用組成的、 去中...
    財(cái)神叔叔閱讀 154評(píng)論 0 0