Flutter 鸿蒙使用实战:用 device_info_plus 三方库在 OpenHarmony 上查询设备指纹与系统版本
Flutter 鸿蒙实战:用 device_info_plus 三方库在 OpenHarmony 上查询设备指纹与系统版本
Flutter 社区地址: https://atomgit.com/CPF-Flutter/flutter_flutter
github三方库地址:https://github.com/fluttercommunity/plus_plugins/tree/main/packages/device_info_plus/device_info_plus
pub地址:https://pub.dev/packages/device_info_plus
鸿蒙适配版:https://atomgit.com/CPF-Flutter/flutter_plus_plugins
库版本:device_info_plus 4.1.0+(CPF-Flutter 鸿蒙适配版,commit
9571de2)|验证环境:Flutter 鸿蒙 SDK 3.44.9(oh-3.44.9-dev)|DevEco Studio 26.0.0.821 | 设备:DevEco 模拟器 Pura X View | HarmonyOS 7.0.0.106(API 26)
应用做设备兼容适配、上报设备指纹、区分 HarmonyOS NEXT 与 OpenHarmony 4.0 设备时,都需要读"这台设备到底是什么"——device_info_plus 是 Flutter 生态里最主流的设备信息查询库,CPF-Flutter 社区已在 flutter_plus_plugins monorepo 里完成鸿蒙适配(新增 OhosDeviceInfo 数据模型)。本文介绍它在 OpenHarmony 上的引入方式、单方法调用与 20+ 字段展示,以及在 DevEco 模拟器上读取真实设备指纹(odID 是真 UUID)的演示效果。



一、环境搭建
本章不重复展开,直接引用官方文档:Flutter OH 开发环境搭建指导。
完成后用 flutter doctor -v 验证,Flutter 与 HarmonyOS toolchain 两项均为 [√] 即可。本文实际使用版本:Flutter OH oh-3.44.9-dev(commit 77e0c8d13b)、DevEco Studio 26.0.0.821、HarmonyOS SDK API 26。
二、应用背景

2.1 当前的应用场景与痛点
- 设备兼容适配:判断 HarmonyOS NEXT vs OpenHarmony 4.x,做分支逻辑
- 设备指纹上报:上传
brand + productModel + osFullName + odID做设备分布统计 - 客服反馈定位:用户报问题时附带
displayVersion/incrementalVersion辅助排查 - 跨平台统一 API:同一份代码在 Android/iOS/OpenHarmony 上拿同样的设备信息字段
痛点:之前在鸿蒙侧需自己写 ArkTS 调 @ohos.deviceInfo + @ohos.bundle.bundleManager 拼装信息——device_info_plus 让这一切一行调用完成。
2.2 为什么需要这个库
CPF-Flutter 在 flutter_plus_plugins monorepo 内一并完成了 plus 系列(battery_plus / connectivity_plus / device_info_plus / package_info_plus / sensors_plus / share_plus 等)的鸿蒙适配,与 Android 端保持 完全一致 的字段语义(deviceType、productModel、osFullName 同名同义)。业务侧零代码迁移。
2.3 解决什么问题
一句话总结:让 Flutter 应用在鸿蒙上以与 Android 完全一致的 API 读取设备标识、硬件、系统版本、唯一标识。具体提供:
- 设备标识(6 个字段):品牌/型号/产品线
- 硬件信息(5 个字段):CPU 架构(
abiList)、bootloader 等 - 系统版本(7 个字段):显示版本/增量版本/安全补丁/OS 类型/完整 OS 名
- 唯一标识(5 个字段):序列号、UDID、ODID(真设备指纹)、OS 发行版
三、功能介绍
| 字段组 | 关键字段 | 用途 |
|---|---|---|
| 设备标识 | deviceType / manufacture / brand / productModel | 品牌机型分支判断 |
| 硬件信息 | softwareModel / abiList / bootloaderVersion | CPU ABI 判断(arm64-v8a vs x86) |
| 系统版本 | displayVersion / incrementalVersion / osFullName | 系统类型判断、问题定位 |
| 唯一标识 | serial / udid / odID | 设备指纹上报 |
| API | DeviceInfoPlugin().deviceInfo | 运行时按平台分发(鸿蒙返回 OhosDeviceInfo) |
| 类型化 | DeviceInfoPlugin().ohosInfo | 鸿蒙专用 getter,直接返回 OhosDeviceInfo |
四、使用方法
4.1 在应用中引入三方库(AtomGit 链接方式)
dependencies:
device_info_plus:
git:
url: https://atomgit.com/CPF-Flutter/flutter_plus_plugins.git
ref: 9571de239933ab2893dbd49037e128135b050a7c
path: packages/device_info_plus/device_info_plus
执行 flutter pub get 后 import 'package:device_info_plus/device_info_plus.dart';。
注意:device_info_plus 是单包插件(不像 battery_plus 是 federated 多包),无需 dependency_overrides。仓库根 flutter_plus_plugins 内的版本与其他 plus 库(battery_plus / connectivity_plus)保持 commit 一致,方便企业级 monorepo 升级。
4.2 调用接口实现功能
4.2.1 DeviceInfoPlugin():单例构造
final plugin = DeviceInfoPlugin();
DeviceInfoPlugin 设计为单例工厂(内部 _singleton 缓存)。多次 DeviceInfoPlugin() 返回同一实例——信息读取本身有缓存,重复调用不会产生性能损耗。
4.2.2 deviceInfo:跨平台通用入口
功能说明:异步 getter,返回 BaseDeviceInfo(运行时按 defaultTargetPlatform 分发——鸿蒙返回 OhosDeviceInfo,Android 返回 AndroidDeviceInfo,iOS 返回 IosDeviceInfo 等)。
final info = await DeviceInfoPlugin().deviceInfo;
if (info is OhosDeviceInfo) {
print('HarmonyOS 设备:${info.brand} ${info.productModel}');
print('系统:${info.osFullName} ${info.displayVersion}');
print('ABI:${info.abiList}');
print('设备指纹:${info.odID}');
}
运行效果:

demo 首屏(d1):紫色 AppBar + 加载耗时 202 ms + 暗色 API 调用注释(await DeviceInfoPlugin().deviceInfo)+ "设备标识"卡片(deviceType=phone / manufacture=HUAWEI / brand=HUAWEI / marketName=emulator / productSeries=VOL / productModel=emulator)+ "硬件信息"卡片底部(softwareModel=default / hardwareModel=emulator / abiList=arm64-v8a)——20+ 字段全部从鸿蒙 @ohos.deviceInfo 系统 API 实时读出
4.2.3 ohosInfo:鸿蒙专用快捷 getter
功能说明:直接返回 OhosDeviceInfo(不再需要 is 类型判断),代码更简洁。
final ohos = await DeviceInfoPlugin().ohosInfo;
print('${ohos.brand} ${ohos.productModel} · ${ohos.osFullName}');
底层实现等价于 OhosDeviceInfo.fromMap((await _platform.deviceInfo()).data)——同一个 ArkTS 插件调用,只是 Dart 层类型直接收窄。
4.2.4 字段分组读取 + 解析
功能说明:20+ 字段按业务分组读取。
// 1) 设备标识
final identity = {
'type': ohos.deviceType, 'brand': ohos.brand, 'model': ohos.productModel,
};
// 2) ABI 判断(用于判断是否支持 arm64-v8a)
final isArm64 = ohos.abiList?.contains('arm64-v8a') ?? false;
// 3) 系统版本(用于判断 HarmonyOS NEXT vs OpenHarmony 4.0)
final isHarmonyOSNext = ohos.osFullName?.startsWith('OpenHarmony') ?? false;
// 4) 设备指纹(设备去重/上报)
final deviceFingerprint = '${ohos.brand}_${ohos.productModel}_${ohos.odID}';
运行效果:

滚动到底(d2):"系统版本"卡片(displayVersion=emulator 7.0.0.106(SP1DEVC00E999R4P11) / incrementalVersion=26.0.0.105 / securityPatchTag=2026/07/01 / osReleaseType=Release / osFullName=OpenHarmony-7.0.0.105 / versionId=phone/HUAWEI/HUAWEI/VOL/…/emulator/default/26/26.0.0.105/default / buildType=default)+ "唯一标识与分发信息"卡片(serial=- / udid=- / odID=037a33e3-9a2f-40f2-fe20-60874fbe5f5a / distributionOSName=HarmonyOS / distributionOSVersion=7.0.0)+ 底部"重新加载 deviceInfo"按钮——odID 是真设备 UUID(不是 mock),证明鸿蒙适配版真实从 @ohos.deviceInfo 读到了系统指纹
4.3 完整示例代码
完整工程(含签名配置说明)已开源(本地路径 /Users/zhubo/Desktop/HarmonyOS-platform-framework-2026-batch2/device_demo/,由用户自行决定上传到 AtomGit)。核心调用模式:
import 'package:device_info_plus/device_info_plus.dart';
class DeviceInfoPage extends StatefulWidget { /* ... */ }
class _DeviceInfoPageState extends State<DeviceInfoPage> {
OhosDeviceInfo? _info;
Future<void> _load() async {
// 跨平台通用入口(运行时分发),鸿蒙返回 OhosDeviceInfo
final base = await DeviceInfoPlugin().deviceInfo;
if (base is OhosDeviceInfo) {
setState(() => _info = base);
}
// 或直接:
// _info = await DeviceInfoPlugin().ohosInfo;
}
// build: ListView 展示 20+ 字段分四组(设备/硬件/版本/标识)
}
签名与构建(活动硬性要求 signingConfig: "default"):
flutter create --platforms ohos .
# ohos/build-profile.json5 的 app.signingConfigs 填入 DevEco 自动签名材料
flutter build hap --debug
hdc install build/ohos/hap/entry-default-signed.hap
hdc shell aa start -b com.example.device_demo -a EntryAbility
五、FAQ:使用问题
Q1:调用报 MissingPluginException
确认 pubspec.yaml 里的 device_info_plus 指向 CPF-Flutter 的 flutter_plus_plugins 仓库同 commit(如 9571de2),且 path: packages/device_info_plus/device_info_plus 写对子包路径。flutter clean && flutter pub get 重新构建。
Q2:deviceInfo 返回的不是 OhosDeviceInfo 而是其他类型
说明当前运行平台不是 OpenHarmony(如 macOS desktop、Chrome web),demo base is OhosDeviceInfo 守卫会返回错误提示。请在真机/鸿蒙模拟器上运行。
Q3:编译报 'osFullName' isn't defined for type 'OhosDeviceInfo'
鸿蒙适配版的字段名以最新 flutter_plus_plugins 仓库为准(可能 4.1+ 才有 osFullName)。本文示例对应 commit 9571de2。如果你的版本是 4.0.x,部分字段可能命名不同(如 osReleaseName),请用 git log 查字段表。
Q4:odID / serial / udid 都返回 null/‘-’(模拟器)
模拟器场景正常——这三个字段是真实设备字段,模拟器无设备指纹可读。productModel=emulator / serial=- 等也是模拟器特征。真机上会读到真实值。
Q5:字段值类型都是 String?,要不要做 null 检查?
需要。demo 中所有字段都用 r.$2 ?? '-' 容错处理——展示"-",避免空指针崩溃。生产代码中应根据业务决定:必填字段(如 brand)可直接 ! 强转,nullable 字段(如 odID)走 null 处理。
Q6:要不要做 HarmonyOS NEXT / OpenHarmony 4.0 分支判断?
看业务需求:
if (ohos.osFullName?.startsWith('OpenHarmony') ?? false) {
// 鸿蒙 NEXT(API 12+):用 @ohos.xxx 新 API
} else {
// OpenHarmony 4.0(API 9-11):用旧 API 兼容路径
}
Q7:发现库的问题怎么反馈?
- 仓库:https://atomgit.com/CPF-Flutter/flutter_plus_plugins
- 提 Issue:四要素(复现 / 期望 / 实际 / 设备系统 +
flutter --version+ hilog) - 提 PR:Fork → 建
fix/...分支 → 修复 → push → 在 AtomGit 发 PR,描述附鸿蒙设备验证截图
六、其他内容
device_info_plus 鸿蒙适配版开箱即用:单方法 deviceInfo / ohosInfo 返回 20+ 字段四组信息。Demo 在 DevEco 模拟器(Pura X View,HarmonyOS 7.0.0.106 / API 26)上真实读取了 brand=HUAWEI、abiList=arm64-v8a、osFullName=OpenHarmony-7.0.0.105、odID=真 UUID——全部字段都是鸿蒙系统 @ohos.deviceInfo 实测值,不是 mock。配合 brand/abiList/osFullName 等可以做 ABI 适配、跨版本分支、设备指纹上报等真实业务场景。
更多推荐




所有评论(0)