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等信息都会产生比较大的影响。
本文分析了Android不同设备ID在不同版本中的变化,包括DEVICE_ID、Serial Number、MAC地址和Android ID。阐述了各设备ID的获取方式、优缺点,如DEVICE_ID在Android Q后无法获取IMEI/MEID号。指出国内因无Google广告ID,难以解决设备标识唯一性问题,影响渠道归因和DAU统计。
2192

被折叠的 条评论
为什么被折叠?



