摘要

在鸿蒙(OpenHarmony)Flutter 3.27-ohos 生态下,package_info_plus 是常用的应用包信息查询插件(版本号、包名、构建号、安装时间等)。上游 10.1.0 面向 Flutter 3.38+,且 pub 版不含 ohos/ 平台。本文记录在 Flutter 3.27.5-ohos-1.0.3 上,将 package_info_plus ^10.1.0 补齐鸿蒙原生层、跑通编译并完成 Demo 验证的过程。

开源仓库https://gitcode.com/xiaoyangming/flutter_package_info_plus_ohos


一、为什么要做这件事?

业务里几乎都会用到「关于本应用」的信息:设置页展示版本号、埋点带上 packageName、灰度按 buildNumber 分流、合规展示安装来源等。package_info_plus 用统一 Dart API 屏蔽各平台差异:

字段 / API 说明
PackageInfo.fromPlatform() 异步获取包信息(结果会缓存)
appName 应用显示名称
packageName 包名 / Bundle ID
version 版本号(如 1.2.3
buildNumber 构建号(Android versionCode 等)
buildSignature 签名指纹(Android/OHOS 有值)
installerStore 安装来源商店包名(Android 等)
installTime / updateTime 安装、更新时间(10.x 新增)

典型场景:关于页、崩溃上报、强制升级弹窗、渠道统计。


二、环境与参考

2.1 开发环境

版本 / 说明
Flutter 3.27.5-ohos-1.0.3
Dart 3.6.2
命令 flutter(本地若用 FVM,将下文 flutter 改为 fvm flutter 即可)
IDE DevEco Studio(鸿蒙签名、真机调试)

验证 Flutter 版本:

flutter --version

在这里插入图片描述

2.2 参考与发布仓库

仓库 作用
fluttercommunity/plus_plugins 上游 monorepo,tag package_info_plus-v10.1.0
openharmony-sig/flutter_plus_plugins 鸿蒙原生参考,分支 br_package_info_plus-v9.0.0_ohos
xiaoyangming/flutter_package_info_plus_ohos 本文适配成果对外发布
pub.dev/package_info_plus 上游 Dart API(10.1.0)

三、适配思路(3.27-ohos)

整体策略:Dart 层跟上游 10.1.0,鸿蒙层跟 SIG v9,工具链按 3.27 降级依赖。

  1. 浅克隆上游(git clone --depth 1 --filter=blob:none --sparse),只检出 packages/package_info_plus/package_info_plus,节约流量。
  2. 浅克隆 SIG 同分支策略,只检出 ohos/ 与 example 的 ohos/ 工程。
  3. pubspec.yaml 增加 ohos 平台声明,SDK 放宽为 >=3.0.0 <4.0.0
  4. 内嵌 package_info_plus_platform_interface 4.1.0(path),因 pub 版要求 Dart >=3.10.0,3.6.2 无法直接解析。
  5. Windows 实现回退 win32 5.xfile_attribute.dart / file_version_info.dart 取自 v9),因 10.x 依赖 win32 6.x(要求 Dart >=3.7)。
  6. pub getanalyzebuild hap 完成编译级验证;真机展示字段需在 DevEco 签名后补截图。

工程关键目录:

flutter_package_info_plus_ohos/
├── lib/                              # Dart API(包名仍为 package_info_plus)
├── ohos/                             # 鸿蒙 HAR、PackageInfoPlugin.ets
├── packages/package_info_plus_platform_interface/  # 内嵌,兼容 Dart 3.6.2
├── example/
│   ├── lib/main.dart                 # 列表展示各字段
│   └── ohos/                         # 示例 App,在此配置签名
└── pubspec.yaml

3.1 鸿蒙原生实现要点

OHOS 侧通过 @ohos.bundle.bundleManager 同步读取当前应用包信息,MethodChannel 与 Android 一致:

  • 通道名:dev.fluttercommunity.plus/package_info
  • 方法:getAll → 返回 Map<String, string>installTime / updateTime 为毫秒时间戳字符串,与 Android 一致)

核心逻辑(节选):

const bundleManage = bundleManager.getBundleInfoForSelfSync(bundleFlags);
infoMap.set("appName", appName);
infoMap.set("packageName", bundleManage.name);
infoMap.set("version", bundleManage.versionName);
infoMap.set("buildNumber", bundleManage.versionCode.toString());
infoMap.set("buildSignature", buildSignature);
infoMap.set("installTime", bundleManage.installTime.toString());
infoMap.set("updateTime", bundleManage.updateTime.toString());

读取包信息无需module.json5 中声明额外权限。

四、适配过程中的关键修改

4.1 增加 ohos 平台与 SDK 约束

插件 pubspec.yaml

environment:
  sdk: '>=3.0.0 <4.0.0'
  flutter: ">=3.0.0"

flutter:
  plugin:
    platforms:
      # ... android / ios / web 等
      ohos:
        package: dev.fluttercommunity.plus.packageinfo
        pluginClass: PackageInfoPlugin

上游 10.1.0 原声明 Flutter >=3.38.1、Dart >=3.10.0,且 ohos 节点

4.2 内嵌 platform_interface(Dart 3.6.2)

问题 处理
package_info_plus_platform_interface ^4.1.0 要求 Dart >=3.10.0 将 4.1.0 源码放入 packages/path 依赖,并把其 environment.sdk 改为 >=3.0.0 <4.0.0
10.x 需要 installTime / updateTime 字段 保留 4.1.0 的 PackageInfoData,不能退回 3.2.1
dependencies:
  package_info_plus_platform_interface:
    path: packages/package_info_plus_platform_interface

4.3 Windows 层 win32 版本回退

上游 10.1.0 本文 3.27-ohos
win32 ^6.0.1(Dart >=3.7 ^5.5.3
实现文件 toPcwstr() 等新 API 使用 v9 的 TEXT() / GetFileAttributesEx 写法

OHOS 构建不编译 Windows,但 flutter analyze 会分析全平台 Dart 代码,必须保证 Windows 实现在当前 Dart 下可解析。

4.4 Example 简化

  • package_info_plus 使用 path: ../ 依赖本地插件。
  • 移除上游 example 中的 integration_testdevice_info_plus 等 dev 依赖(OHOS Demo 不需要)。
  • GeneratedPluginRegistrant.ets 仅注册 PackageInfoPlugin

五、接入项目

5.1 添加依赖

在业务工程 pubspec.yaml 中:

dependencies:
  package_info_plus:
    git:
      url: https://gitcode.com/xiaoyangming/flutter_package_info_plus_ohos.git
      ref: v10.1.0-ohos-3.27

说明:Git 仓库名为 flutter_package_info_plus_ohos,Dart package 名仍是 package_info_plus,import 不变。

flutter pub get

5.2 权限说明(OHOS)

查询本应用包信息不需要module.json5 里申请 READ_* 等权限。example 未声明敏感权限即可运行。

5.3 代码示例

import 'package:package_info_plus/package_info_plus.dart';

Future<void> printAppInfo() async {
  final info = await PackageInfo.fromPlatform();
  print('appName: ${info.appName}');
  print('packageName: ${info.packageName}');
  print('version: ${info.version}');
  print('buildNumber: ${info.buildNumber}');
  print('buildSignature: ${info.buildSignature}');
  print('installerStore: ${info.installerStore}');
  print('installTime: ${info.installTime}');
  print('updateTime: ${info.updateTime}');
}

六、构建与签名

6.1 编译 HAP

cd example
flutter pub get
flutter build hap --debug

编译通过时,Hvigor assembleHap 任务成功;若尚未配置签名,CLI 可能提示:

请通过DevEco Studio打开ohos工程后配置调试签名
(File -> Project Structure -> Signing Configs 勾选Automatically generate signature)

此时 assembleHap 编译已通过,仅需在 DevEco 配置签名后即可产出可安装的 HAP。

6.2 DevEco 签名目录

签名请在 example 的鸿蒙工程 配置:

example/ohos/

步骤:File → Project Structure → Signing Configs → Automatically generate signature

在这里插入图片描述

七、真机功能验证(Demo)

仓库 example 启动后通过 PackageInfo.fromPlatform() 拉取信息,列表展示各字段。建议真机安装后截图:

展示项 对应字段 预期
App name appName 与系统桌面显示名一致
Package name packageName 鸿蒙 bundle 名
App version version pubspec / 工程版本一致
Build number buildNumber 数字构建号
Build signature buildSignature 非空指纹串
Installer store installerStore 当前实现为 (见第八节)
Install / Update time installTime / updateTime ISO8601 或可解析时间

在这里插入图片描述

3.27-ohos 已验证项(编译级)

  • flutter pub get / analyze 无 error(插件 1 条 path 依赖 warning 可忽略)
  • flutter build hap --debug → Hvigor assembleHap 成功

八、与上游 / SIG 的差异说明

对比项 上游 pub 10.1.0 SIG v9.0.0 ohos 本文(3.27-ohos)
Flutter SDK >=3.38.1 >=3.19.0 3.27.5-ohos-1.0.3
Dart SDK >=3.10.0 >=3.3.0 >=3.0.0(Dart 3.6.2)
包版本 10.1.0 9.0.0 对齐 10.1.0
ohos/ 原生层 ❌ 无 ✅ 有 自 SIG 移植
installTime / updateTime 部分支持 ✅(沿用 10.x Dart + SIG 原生时间戳)

鸿蒙 API 支持情况(编译与代码审查):

API / 字段 ohos 3.27
PackageInfo.fromPlatform
appName
packageName
version / buildNumber
buildSignature
installTime / updateTime
installerStore ⚠️ 固定返回空字符串(SIG 同样为空,非应用商店渠道名)

九、常见问题

Q1:pub getpackage_info_plus_platform_interface 要求 Dart >=3.10.0
使用本文 git 依赖(已内嵌 platform_interface 并放宽 SDK),勿单独锁定 pub 上 4.1.0 的 hosted 版本。

Q2:analyze 报 win32 / toPcwstr 相关错误?
10.x 默认 win32 6.x 需要 Dart 3.7+。请使用本仓库回退后的 win32 5.x 实现,或直接使用 flutter_package_info_plus_ohos

Q3:build hap 提示签名路径无效?
检查 example/ohos/build-profile.json5 是否含有他人机器绝对路径;清空 signingConfigs 后在 DevEco 重新自动签名。

Q4:installerStore 在鸿蒙上为空?
当前 PackageInfoPlugin.ets 写死 "",与 SIG v9 行为一致;若业务强依赖安装来源,需后续对接鸿蒙分发渠道 API。

Q5:能否继续用 SIG 的 dependency_overrides 指向 gitee/gitcode?
SIG 最高 ohos 分支为 v9.0.0,不含 10.x 的 installTime 等字段;若项目已升级到 package_info_plus ^10.1.0,建议改用本文对外仓库 tag v10.1.0-ohos-3.27

Q6:依赖报错找不到 package_info_plus
确认 git 地址为 flutter_package_info_plus_ohos,且已 flutter pub get


十、总结

  • Flutter 3.27.5-ohos-1.0.3 上,以 package_info_plus 10.1.0 Dart API 为基线,从 SIG 移植 ohos/ 原生层,并解决 platform_interface、win32 与 SDK 约束问题,HAP 编译验证通过
  • 对外仓库 flutter_package_info_plus_ohos,tag v10.1.0-ohos-3.27;读取包信息无需额外权限。

十一、参考链接


Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐