除了IMEI、Android_ID、WLAN Mac和蓝牙地址之外,设备的完美唯一标识是什么?

14

目标:

我正在寻找一种方法来查找安卓设备的唯一标识符

背景:

我将在登录请求有效载荷中使用ID,由于我的应用程序是基于许可证的服务应用程序,所以在正常情况下ID不应更改。

现有方法:

iOS 中有一些iOS 的唯一标识符解决方案,例如CFUUIDidentifierForVendorKeychain、广告标识符等可以达到预期效果。

但在 Android 中,我所知道的所有选项似乎都存在漏洞。

IMEI:

TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 
String m_deviceId = TelephonyMgr.getDeviceId();

缺点

它依赖于SIM卡,因此:

  • 如果没有SIM卡,我们就完了

  • 如果有双重SIM卡,我们也无法使用

Android_ID:

  String m_androidId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);

缺点

  • 如果操作系统版本升级,则可能会更改设备ID。
  • 如果设备已经取得了 root 权限,它也会发生变化。
  • 无法保证设备ID是唯一的,有报告称一些制造商存在重复设备ID的情况。

WLAN MAC地址

WifiManager m_wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
String m_wlanMacAdd = m_wm.getConnectionInfo().getMacAddress();

缺点

  • 如果没有wifi硬件,则我们注定失败
  • 在一些新设备中,如果wifi关闭,则我们注定失败

蓝牙地址:

   BluetoothAdapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
   String m_bluetoothAdd = m_BluetoothAdapter.getAddress();

缺点:

  • 如果没有蓝牙硬件,我们就无法使用。
  • 在将来的一些新设备中,如果关闭了,我们可能无法读取它。

可能的解决方案:

我认为有两种方法可以解决这个问题:

  • 我们通过哈希时间戳和我提到的唯一ID生成一个随机ID,并存储它,这样下次登录时,我们将检查密钥的存储值是否为空,如果是,则生成并存储它,否则我们将使用密钥的值。

    如果有与iOS的keychain相当的东西,那么这个方法就很好用。

  • 寻找全局标识符,类似于iOS的advertisingIdentifier,该标识符对于设备中的所有应用程序都是相同的。

任何帮助都将不胜感激!


1
好的,很好。我看了你的问题,点赞并收藏了它。你4个月前问了这个问题,但没有得到真正的回答。我不确定处理iOS + Android唯一标识符的最佳方法是什么。那是将其提升到下一个级别。我现在会使用无缝的东西,比如使用OAuth的“使用Google登录”。这样它就可以在iOS和Android或Web设备上工作。 - Jared Burrows
@JaredBurrows - OAuth提供跟踪单个设备吗?我为每个用户提供设备配额。即一个用户最多可以在三个设备上使用一个帐户。 - Durai Amuthan.H
@DuraiAmuthan.H,我已经阅读了你下面的评论。你说你的应用程序依赖于WiFi,并且你需要一个唯一的设备标识符。因此,我认为MAC地址是最好的选择。我现在也面临着同样的问题,正在考虑使用AndroidUUID和MacAddress之间的选择。在使用AndroidUUID后,你有什么要补充的吗?谢谢。 - Adam
我正在使用Android_ID,因为它不依赖于任何硬件,而MAC地址确实取决于WiFi。 - Durai Amuthan.H
3个回答

7
我选择使用Android_ID,因为它不依赖于任何硬件。
Build.SERIAL也依赖于电信的可用性,这在仅支持WiFi的设备上会导致Build.SERIAL无法工作。
我已经在问题本身中解释了其他方法如何依赖于硬件的可用性。

这篇文章(https://android-developers.googleblog.com/2011/03/identifying-app-installations.html)解释了使用*Android_ID*存在的一些问题。具体来说,“在Android 2.2(“Froyo”)之前的版本中,它并不是100%可靠。”此外,至少有一个主要制造商的热门手机存在广泛观察到的错误,即每个实例都具有相同的ANDROID_ID。 - AviD
@AviD 你应该意识到现在已经没有人再使用Froyo了,这篇博客文章是2011年(6年前)的,而且他们提到的设备是三星Galaxy,对吧?你现在要找到一个还能用的都很幸运,哈哈。 - mradzinski
@mradzinski 哦,我们多么希望那是事实 :-(。不幸的是,它仍然存在,而且有很多人无法及时更新,所以... ¯_(ツ)_/¯ - AviD
2
嗯...我们的应用程序在14个国家拥有超过1700万次下载,而且我还没有在我们的数据库中找到重复或空的ANDROID_ID...也许从理论上讲它可能会发生,但实际上我已经有足够的数据证明这篇过时的文章是错的 ¯_(ツ)_/¯ - mradzinski
@mradzinski - 感谢分享信息。 - Durai Amuthan.H

1
在Android上没有这样的ID可用。您可以生成自己的ID,例如随机UUID,并将其连接到用户的帐户。这就是Kindle,Audible和其他应用程序以非侵入性方式标识设备的方式。如果您想要“跟踪用户”,请考虑使用Google Analytics Mobile http://www.google.com/analytics/mobile/
如果您想更接近跟踪设备,则可以将上述ID组合在一起进行哈希函数运算。蓝牙+ wifi + Android序列号,如果其中任何一个为null,则将0放入哈希中,例如如果没有wifi mac地址。正如您所指出的那样,不能保证ID不会更改。除非用户运行自定义ROM,否则我预计此计算出的ID将保持不变。

1
计算出的ID不适合我的应用程序。因为如果应用程序被卸载并且ID消失了,那么我就会陷入困境。 - Durai Amuthan.H
@Duraiamuthan.H 哈希方法是稳定的,并且在应用程序重新安装时将保持不变。但是,在ROM重新安装/更改时可能会发生变化! - Per Christian Henden
1
如果应用程序被卸载,该值将如何持久存在?哈希值可能会根据应用程序重新安装期间的WiFi /蓝牙状态和可用性而更改。 - Durai Amuthan.H
@Duraiamuthan.H 没问题,哈希函数每次执行时都会给出相同的结果,想象一下 id = f(wifi_mac, bluetooth_mac, android_id)。对于相同的输入,id 将始终相同。您可以使用此类进行哈希处理 https://docs.oracle.com/javase/7/docs/api/java/security/MessageDigest.html - Per Christian Henden
1
如果输入每次都相同,它会生成相同的哈希值,你是正确的。但是有可能输入会发生变化,例如在某些最新设备上,如果wifi关闭,则wifi_mac返回null,而Bluetooth_mac也可能在即将推出的版本中遇到同样的问题。此外,android_id毕竟不是唯一的,因为有人抱怨这些ID被复制了。 - Durai Amuthan.H

1

我认为,你可以使用设备序列号(硬件序列号,而不是Android ID)。您可以在设备设置中看到它。在您的代码中,您可以通过Build.SERIAL获取它。


有人指出 Build.Serial 会抛出异常,因为没有电话功能的设备不具备 Build.Serial。这会成为我面临的问题,因为我的应用程序将在仅支持 Wi-Fi 的设备上使用。Build.Serial 可从 API 9 或 2.3 姜饼版本开始使用。但对我来说并不是问题,因为我的应用程序将针对 4.0 及以上版本进行开发。 - Durai Amuthan.H
1
@Duraiamuthan.H 我认为所有设备都有“串行号”,但并非所有设备都有“IMEI”号码。 - Jared Burrows
@JaredBurrows - 我不确定所有设备都有 Build.Serial 。我在某处读到,如果设备没有电话功能,那么该设备就没有build.serial,例如考虑仅限Wi-Fi的设备。您能确认一下吗? - Durai Amuthan.H
1
@DuraiAmuthan.H 你想让我确认你读到的东西吗?关于 build.serial,你是正确的:http://developer.android.com/reference/android/os/Build.html#SERIAL。我已经更新了我的帖子,提供了更多信息。我建议你选择软件而不是硬件(最有可能是软件)来跟踪用户在设备之间的移动。 - Jared Burrows

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接