Flutter 获取设备标识
本文最后更新于:2026年3月11日 下午
Flutter 获取设备标识:IMEI/UDID/UUID/ANDROID_ID
这篇文章的重点是厘清“设备标识”的概念差异,以及在 Android/iOS 上真实可用的获取方式。

常见 ID 的定义与区别
IMEI:蜂窝网络硬件标识,属于电话功能相关的硬件 ID。UDID:iOS 设备的历史硬件标识,早期可用,但现在对 App Store 应用不可用。UUID:通用唯一标识符,是一种算法生成的随机 ID,并不等同于硬件 ID。MAC:网卡硬件地址,现代系统对普通应用访问受限或返回随机值。ANDROID_ID:Android 系统在设备上的一个平台作用域 ID。identifierForVendor:iOS 为同一开发者团队下的 App 提供的作用域 ID。
IMEI/UDID/MAC 属于“硬件级别 ID”,而 ANDROID_ID/identifierForVendor 属于“平台作用域 ID”,UUID 则是“自行生成的随机 ID”。
Android / iOS 上是否可获取
- Android:
IMEI/ 设备序列号:普通应用基本不可用或受严格权限限制。MAC:无法稳定获取,通常返回随机值或全 0。ANDROID_ID:可用,常见且稳定性相对较好。
- iOS:
UDID:App Store 应用不可用。MAC:不可用。identifierForVendor:可用,是官方推荐的替代标识之一。
卸载重装后是否变化
ANDROID_ID:- 通常在设备恢复出厂设置后会变化。
- 在部分系统版本/厂商实现中,卸载重装可能也会变化。
identifierForVendor:- 当设备上该开发者团队的所有 App 都被卸载后,再安装会变化。
UUID(你自己生成的):- 如果不做持久化,卸载重装一定变化。
结论:没有哪个 ID 能保证“跨卸载重装、跨账号、跨设备迁移”仍保持不变。
现实中的最佳实践
没有所谓“最好的实践”,只有“在你的业务场景里最合适的实践”。
工程上更稳妥的做法是:
- 使用
device_info_plus获取平台作用域 ID:- Android:
device_info_plus在4.0.02022/06/20 版本移除了androidId(发布日志中说是因为 Google Play 隐私政策所以才删除的),所以新版本插件现在拿不到ANDROID_ID。androidInfo.id实际是Build.ID(系统构建号),例如UP1A.231005.007,它是系统版本/构建信息,不适合作为设备唯一标识。不过可以使用 android_id 插件获取 androidId。 - iOS:
identifierForVendor
- Android:
- 把平台 ID 当作“辅助标识”,不要当业务主键。
插件代码示例(device_info_plus)
pubspec.yaml:
1 | |
lib/device_id_helper.dart:
1 | |
你需要接受的现实
- 卸载重装后,平台 ID 可能变化。
- 恢复出厂设置后,平台 ID 也可能变化。
- 设备标识只能作为业务辅助字段,不应作为唯一主键。
Flutter 获取设备标识
http://bestkele.com/2018/03/09/flutter/device-Identifier/