从Android 10开始已经无法完全标识一个设备,曾经用mac地址、IMEI等设备信息标识设备的方法,从Android 10开始统统失效。而且无论你的APP是否适配过Android 10。
1 IMEI等设备信息
从Android10开始普通应用不再允许请求权限android.permission.READ_PHONE_STATE。而且,无论你的App是否适配过Android Q(既targetSdkVersion是否大于等于29),均无法再获取到设备IMEI等设备信息。
受影响的API:
Build.getSerial();
TelephonyManager.getImei();
TelephonyManager.getMeid();
TelephonyManager.getDeviceId();
TelephonyManager.getSubscriberId();
TelephonyManager.getSimSerialNumber();
-
targetSdkVersion<29 的应用,其在获取设备ID时,会直接返回null
-
targetSdkVersion>=29 的应用,其在获取设备ID时,会直接抛出异常SecurityException
如果您的App希望在Android 10以下的设备中仍然获取设备IMEI等信息,可按以下方式进行适配:
<uses-permission android:name="android.permission.READ_PHONE_STATE"
android:maxSdkVersion="28"/>
2 Mac地址随机分配
从Android10开始,默认情况下,在搭载 Android 10 或更高版本的设备上,系统会传输随机分配的 MAC 地址。(即从Android 10开始,普通应用已经无法获取设备的真正mac地址,标识设备已经无法使用mac地址)
3 如何标识设备唯一性
3.1 Google解决方案:如果您的应用有追踪非登录用户的需求,可用ANDROID_ID来标识设备。
-
ANDROID_ID生成规则:签名+设备信息+设备用户
-
ANDROID_ID重置规则:设备恢复出厂设置时,ANDROID_ID将被重置
String androidId = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
3.2 信通院统一SDK(OAID)不建议用
MSA 统一 SDK 下载地址:
移动安全联盟官网,www.msa-alliance.cn/