
Flutter OpenHarmony 三方库适配实战package_info_plus 应用信息一、项目信息项目内容仓库名称package_info_plus仓库地址https://atomgit.com/oh-flutter/package_info_plus上游版本package_info_plus 10.2.2OHOS TAG10.2.2-ohos.1方法通道dev.fluttercommunity.plus/package_infoOHOS 入口PackageInfoPlugin.ets构建产物entry-default-unsigned.happackage_info_plus的价值在于提供一个跨平台的应用元信息接口。业务层只调用PackageInfo.fromPlatform()不关心 Android 的PackageManager、iOS 的Bundle或 OHOS 的BundleInfo。适配的重点是把 OHOSBundleInfo的字段稳定地转换成上游 Dart API。环境搭建与版本下面是本次适配实际使用的环境。环境搭建过程这里不再展开直接看 Flutter OH 环境搭建指南。项目版本/说明Flutter OH3.44.9ohos-0.0.1-canary1Dart3.12.2DevEco Studio26.0.0HarmonyOS SDKAPI 26目标仓库package_info_plus二、原库接口与 OHOS 映射Dart API / 字段OHOS 数据来源说明appNameappInfo.labelIdresourceManager通过资源 ID 读取应用显示名称packageNamebundleInfo.name当前应用包名versionbundleInfo.versionName版本名称buildNumberbundleInfo.versionCode版本号转字符串buildSignaturebundleInfo.signatureInfo.fingerprint系统返回的签名指纹installTimebundleInfo.installTime毫秒时间戳转换为DateTimeupdateTimebundleInfo.updateTime毫秒时间戳转换为DateTimeinstallerStore当前无 OHOS 对应字段返回空字符串OHOS 插件只实现一个方法getAll。Dart 平台接口拿到 Map 后构造PackageInfo因此业务代码与上游 API 保持一致。三、插件入口与生命周期根pubspec.yaml增加 OHOS 声明flutter:plugin:platforms:ohos:package:dev.fluttercommunity.plus.packageinfopluginClass:PackageInfoPluginArkTS 插件在引擎挂载时创建方法通道constCHANNEL_NAMEdev.fluttercommunity.plus/package_info;onAttachedToEngine(binding:FlutterPluginBinding):void{this.applicationContextbinding.getApplicationContext();this.methodChannelnewMethodChannel(binding.getBinaryMessenger(),CHANNEL_NAME,);this.methodChannel.setMethodCallHandler(this);}onDetachedFromEngine(binding:FlutterPluginBinding):void{this.applicationContextnull;this.methodChannel?.setMethodCallHandler(null);this.methodChannelnull;}getAll的核心读取逻辑如下constbundleFlagsbundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION|bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_SIGNATURE_INFO;constbundleInfobundleManager.getBundleInfoForSelfSync(bundleFlags);constappInfobundleInfo.appInfo;infoMap.set(appName,this.applicationContext?.resourceManager.getStringSync(appInfo.labelId)??,);infoMap.set(packageName,bundleInfo.name);infoMap.set(version,bundleInfo.versionName);infoMap.set(buildNumber,bundleInfo.versionCode.toString());infoMap.set(buildSignature,bundleInfo.signatureInfo.fingerprint??);infoMap.set(installerStore,);infoMap.set(installTime,bundleInfo.installTime.toString());infoMap.set(updateTime,bundleInfo.updateTime.toString());result.success(infoMap);这段代码有三个容易踩坑的地方必须请求GET_BUNDLE_INFO_WITH_SIGNATURE_INFO否则签名指纹可能为空。labelId需要通过应用 Context 的资源管理器读取不能把资源 ID 直接返回给 Dart。OHOS 时间字段是毫秒时间戳ArkTS 返回字符串Dart 平台接口负责转换为DateTime。OHOS 工程目录创建本次适配前上游仓库没有ohos/目录。适配分支上按 Flutter OH 的插件工程约束创建平台目录再把 ArkTS 入口接入pubspec.yamlgitswitch-cyour-ohos-adaptation-branchflutter create--platformsohos.工程生成后至少保留以下边界ohos/ ├── index.ets ├── oh-package.json5 └── src/main/ ├── module.json5 └── ets/components/plugin/示例工程还需要生成example/ohos/并在插件pubspec.yaml的flutter.plugin.platforms.ohos中声明pluginClass只创建目录、没有注册入口Dart 方法通道仍然不会工作。四、业务使用importpackage:flutter/material.dart;importpackage:package_info_plus/package_info_plus.dart;Futurevoidmain()async{WidgetsFlutterBinding.ensureInitialized();finalinfoawaitPackageInfo.fromPlatform();debugPrint(应用${info.appName});debugPrint(包名${info.packageName});debugPrint(版本${info.version}${info.buildNumber});debugPrint(安装时间${info.installTime});debugPrint(更新时间${info.updateTime});runApp(constApp());}classAppextendsStatelessWidget{constApp({super.key});overrideWidgetbuild(BuildContextcontext){returnconstMaterialApp(home:Scaffold(body:Center(child:Text(package_info_plus))),);}}如果业务只需要版本号可以封装一个不暴露平台细节的仓库类classAppVersionRepository{FutureStringcurrentVersion()async{finalinfoawaitPackageInfo.fromPlatform();return${info.version}${info.buildNumber};}}这样升级 OHOS 插件时业务层不需要修改调用方式。五、权限与限制读取自身应用信息不需要额外权限。插件不访问网络也不读取其他应用。当前installerStore在 OHOS 上没有可靠对应值因此统一返回空字符串如果业务把它作为安装渠道统计字段应改成服务端埋点或 OHOS 自己的渠道字段。签名指纹只能作为辅助校验信息不能替代服务端 token、设备证明或签名校验。应用升级、重新签名或系统迁移后指纹可能发生变化。适配过程 FAQ 与解决方案为什么版本字段要从bundleInfo读取解决方案OHOS 的版本号由应用配置和系统包信息服务共同维护。直接拼接包名或读取自定义配置会漏掉发行版差异升级应用后也可能显示旧值。versionCode在不同发行版为什么可能不同解决方案它受应用打包、签名和系统分发配置影响。适配层应原样返回系统值不要把它截断成短整数或强行改成 Flutter 的 buildNumber。返回空值时如何判断是插件问题还是应用配置解决方案先用hdc shell bm dump或系统应用信息确认包名和版本再检查 ArkTS 返回 map。若系统值存在但 Dart 为空优先排查通道字段名和类型转换。升级上游后如何确认版本一致解决方案同时检查插件pubspec.yaml、OHOSoh-package.json5、示例应用配置和文章基线。只改其中一处会导致文档、HAR 和示例显示不同版本。六、构建与测试记录flutter pub get flutter analyze fluttertestcdexample flutter build hap--debug--no-codesign本次适配验证结果flutter analyze无问题。flutter test8 个测试全部通过。示例工程flutter build hap --debug --no-codesign成功生成entry-default-unsigned.hap。版本与提交基线项目版本/地址上游包package_info_plus上游最新版本10.2.2文章目标基线10.2.2-ohos.1当前已发布 TAG10.2.2-ohos.1适配分支main目标最新 TAG10.2.2-ohos.1最终提交bf71054版本号更新只代表文章和适配分支的基线已对齐涉及上游 API 变更时仍需在该 TAG 上重新运行 Dart 测试、ArkTS 编译、HAP 安装和真机回归。参考资料和仓库地址适配仓库主页适配分支 main当前已发布 TAG 10.2.2-ohos.1目标最新 TAG 10.2.2-ohos.1最终提交 bf71054ArkTS 通道实现鸿蒙适配说明pub.dev 包页面pub.dev 10.2.2 版本页上游仓库Flutter 官方插件与平台通道文档Flutter OH 鸿蒙 SDK 仓库欢迎加入 CPF-Flutter 鸿蒙社区。七、目录结构package_info_plus/ ├── lib/ │ └── package_info_plus.dart ├── ohos/ │ └── src/main/ets/dev/fluttercommunity/plus/packageinfo/ │ └── PackageInfoPlugin.ets ├── example/ ├── packages/ │ └── package_info_plus_platform_interface/ └── test/八、社区与交流欢迎加入 Flutter OpenHarmony 适配社区提交问题、补充真机验证或共同完善其他三方库CPF-Flutter 社区本仓库 Issues提交 Pull Request反馈时请附上 Flutter OHOS 版本、OpenHarmony SDK 版本、设备型号、复现步骤、日志和期望结果。