Android 设备标识ID 的发展历程

本文分析了Android不同设备ID在不同版本中的变化,包括DEVICE_ID、Serial Number、MAC地址和Android ID。阐述了各设备ID的获取方式、优缺点,如DEVICE_ID在Android Q后无法获取IMEI/MEID号。指出国内因无Google广告ID,难以解决设备标识唯一性问题,影响渠道归因和DAU统计。

Android 设备标识对于追踪设备,统计数据起到至关重要的作用,尤其是对于重视DAU的产品。

下面我们就来分析下Android 不同设备ID 在不同Android 版本中的变化

1、DEVICE_ID

可以如下接口来获取,它会根据不同的手机设备返回IMEI,MEID或者ESN码

TelephonyManager tm = (TelephonyManager) (context.getSystemService(Context.TELEPHONY_SERVICE));
deviceId = tm.getDeviceId();

不过在API level 26 getDeviceId接口已经不再建议使用了。需要使用getMeid() getIMei()获取。

并且在API Level 23之后需要申请 android.permission.READ_PHONE_STATE权限才可以获取到。

Android Q之后已经没有权限可以拿到IMEI/MEID号了

优点: 唯一性良好

缺点:6.0以后需要权限才可以拿到,部分山寨厂商获取到相同的值,Android Q之后不可使用。

2、Serial Nmber  Android 序列号

Android系统2.3版本以上可以通过下面的方法得到Serial Number,且非手机设备也可以通过该接口获取。

String SerialNumber = android.os.Build.SERIAL;

优点:8.0以前稳定性良好

缺点:重复率比较高,在8.0以后也需要android.permission.READ_PHONE_STATE才可以获取到 Android Q不可用

3、MAC地址

6.0以前可以直接使用以下接口获取

WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();
info.getMacAddress();

6.0以后需要使用如下方式获取(同时适用Android Q)

private static String getMacByJavaAPI() {
    try {
        Enumeration < NetworkInterface > interfaces = NetworkInterface.getNetworkInterfaces();
        while (interfaces.hasMoreElements()) {
            NetworkInterface netInterface = interfaces.nextElement();
            if ("wlan0".equals(netInterface.getName()) || "eth0".equals(netInterface.getName())) {
                byte[] addr = netInterface.getHardwareAddress();
                if (addr == null || addr.length == 0) {
                    return null;
                }
                StringBuilder buf = new StringBuilder();
                for (byte b : addr) {
                    buf.append(String.format("%02X:", b));
                }
                if (buf.length() > 0) {
                    buf.deleteCharAt(buf.length() - 1);
                }
                return buf.toString().toLowerCase(Locale.getDefault());
            }
        }
    } catch (Throwable e) {
    }
    return null;
}

优点:唯一性良好,虽然安卓版本禁用了官方接口,但是仍然可以通过其它方式获取到。

缺点: 小厂商会存在Mac地址不标识的情况

4、 Android ID

在设备首次启动时,系统会随机生成一个64位的数字,并把这个数字以16进制字符串的形式保存下来,这个16进制的字符串就是ANDROID_ID,当设备被wipe后该值会被重置。可以通过下面的方法获取:

android.provider.Settings.Secure.getString(context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);

在Android 8.0 中针对Android ID有一个比较大的变化,8.0开始不同签名的App 会产生不同的Android ID,这对于使用AndroidID来追踪设备的用户来说影响比较大。

优点:

稳定性高,正常情况下都可以获取到。

缺点:

8.0 以前Android ID随机生成,会存在一定的重复几率

8.0以后会和签名绑定,但是因为毕竟只有64长度,唯一性还是有待考验。

结论:

设备ID发展到今天,在国内已经没有比较好方案可以解决设备标识唯一性的问题了,因为国内的环境比较特殊,没有Google 广告ID来使用,对于渠道归因、DAU等信息都会产生比较大的影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值