如何生成唯一的Android设备ID?

2017-06-22  本文已影响8643人  Winter_F

前几天接到个任务,旧的那套获取设备标识的方法经常返回相同的ID,所以需要我重新寻找一套可靠的区分设备的方法。经过几天的研究,大致有了一些想法。

先从需求出发分析出我的主要目标——为每一台设备生成唯一、软件无关的标识ID。
其中关键词是“唯一”和“软件无关”,“唯一”要求不同设备有不同的ID,“软件无关”是考虑到软件重装后或者不同软件都能根据相同的方法获取到相同的ID。
  根据多年被坑的经验,对于一个运行在设备系统上的App,获取的每一个硬件的标识都不完全可靠,可能因为用户修改了硬件信息,或者厂商定制系统有漏洞,所以我们在寻找一套符合主要目标的的方案的同时,还要尽可能减少这些不可靠因素的影响。
  翻阅各种资料,最后得出比较有价值的硬件标识有以下几个:

综上所述,Device ID和Mac地址都需要额外的权限,而且并非适用于所有Android设备,所以不考虑使用。最终方案选用Android ID和Build信息做种子来生成设备ID,如果只需要做用户统计等不关心到具体设备的功能,可以只使用Android ID做种子,在获取到的Android ID等于9774d56d682e549c时,就随机生成一个ID代替;如果要实现推送消息等需要精确区分设备的功能,可以用Android ID和Build的部分设备信息做种子。

还需要注意的是,以上全部标识都可能被用户或者系统修改的,应用每次获取的Android ID或者Device ID等种子可能并不相同,生成的设备ID也会不一样,为了解决这问题,可以把生成的设备ID保存起来,每次使用时先检查有没有已经保存的设备ID,如果没有才生成一个并保存,保存的位置可以是应用的私有空间或者公共空间,具体选择视乎是否需要多个应用使用同一个设备ID。

最终实现代码如下:

public static String getDeviceUUID(Context context) {
    String uuid = loadDeviceUUID(context);
    if (TextUtils.isEmpty(uuid)) {
        uuid = buildDeviceUUID(context);
        saveDeviceUUID(context, uuid);
    }
    return uuid;
}

private static String buildDeviceUUID(Context context) {
    String androidId = getAndroidId(context);
    if ("9774d56d682e549c".equals(androidId)) {
        Random random = new Random();
        androidId = Integer.toHexString(random.nextInt())
                + Integer.toHexString(random.nextInt())
                + Integer.toHexString(random.nextInt());
    }
    return new UUID(androidId.hashCode(), getBuildInfo().hashCode()).toString();
}

private static void saveDeviceUUID(Context context, String uuid) {
    context.getSharedPreferences("device_uuid", Context.MODE_PRIVATE)
            .edit()
            .putString("uuid", uuid)
            .apply();
}

@Nullable
private static String loadDeviceUUID(Context context) {
    return context.getSharedPreferences("device_uuid", Context.MODE_PRIVATE)
            .getString("uuid", null);
}

源码地址:
Lib-DeviceId

参考:

  1. 唯一标识符最佳做法
  2. Is there a unique Android device ID?
  3. Identifying App Installations
  4. 如何唯一的标识一台Android设备?
  5. 谈谈 Android 中的各种设备标识符
上一篇 下一篇

猜你喜欢

热点阅读