首页 > 代码库 > 为什么说 MAC 是一个存在严重漂移的 ID ?

为什么说 MAC 是一个存在严重漂移的 ID ?

前两天友盟君发了一篇关于《移动应用统计的基本原理及 UMID 方案》的博文,里面提到Mac 是一个典型的存在严重漂移的 ID,本文就来和大家探讨下 Mac 地址漂移的问题。欢迎拍砖。

MAC 地址共48位(6个字节),以十六进制表示。前24位由 IEEE 决定如何分配,后24位由实际生产该网络设备的厂商自行指定。其中,ff:ff:ff:ff:ff:ff是广播地址,01:xx:xx:xx:xx:xx 是多播地址,01:00:5e:xx:xx:xx是 IPv4 多播地址。

如果各位经历过在某些网络上 Android 手机死活链接不上去的情况,那极有可能就是路由器设置了 MAC 地址过滤,变化后的 MAC 地址不在白名单上。

出乎很多人的意料,部分机型 MAC 地址确实会发生变化。可以参考 Android 官方代码库的 Issue:

Issue 23330: Galaxy Nexus (VZW/LTE) wifi MAC address changes with every reboot

看到了吗, 居然每次启动都会导致 MAC 地址的变动。为什么会这样呢? 有好事者解释说最初 Google 和三星不想掏钱买 Mac 地址,某个光芒四射的伟大的程序员同学就写了个函数,随机生成 MAC 地址的后六位

The offending kernel code: if ((tuna_mac_addr[4] == 0) && (tuna_mac_addr[5] == 0)) { srandom32((uint)jiffies); // rand_mac = random32(); // tuna_mac_addr[3] = (unsigned char)rand_mac; tuna_mac_addr[4] = (unsigned char)(rand_mac >> 8); tuna_mac_addr[5] = (unsigned char)(rand_mac >> 16); } memcpy(buf, tuna_mac_addr, IFHWADDRLEN);

这部分的 kernel code 估计有被别的厂家 copy 过去,造成别的手机也有同样的问题。

如果不考虑 spam 的影响,这部分数据应该和 ROM 及机型相关。如果某一机型的一个手机有问题,这一机型的所有手机都有类似问题。

另有  Android 开发者社区的调查也可以证明这个结论