Flutter 项目如何快速适配 HarmonyOS?一份可落地的迁移指南

随着 HarmonyOS NEXT 正式进入商用阶段,华为设备全面告别 Android 兼容层(AOSP),这意味着:传统 APK 将无法在新鸿蒙设备上运行。对于拥有成熟 Flutter 应用的团队来说,一个紧迫问题摆在面前:
“我们的 Flutter App 还能在鸿蒙上跑吗?如何低成本快速适配?”
好消息是:通过社区支持与合理改造,大多数 Flutter 项目可在 1~2 周内完成 HarmonyOS 适配。本文将手把手教你完成这一过程,涵盖评估、改造、构建与测试四大环节,并提供完整代码案例。

一、适配前必读:HarmonyOS 对 Flutter 的支持现状
| 项目 | 状态 |
|---|---|
| 官方支持 | ❌ 尚未由 Google 官方支持 |
| 社区支持 | ✅ OpenHarmony SIG - Flutter 提供 Engine 移植 |
| 构建输出 | ✅ 可生成 .hap(Harmony Ability Package) |
| 插件兼容 | ⚠️ 需重写含 Android 原生代码的插件 |
| 上架能力 | ✅ 可提交至 AppGallery(需 HMS Core 合规) |
📌 关键结论:
- 纯 Dart 逻辑 + 自绘 UI 的应用 几乎无需修改
- 依赖 Android 原生 API 的插件 需通过 MethodChannel 重写鸿蒙版
二、第一步:评估你的 Flutter 项目兼容性
以下是扩展后的检查清单,包含更多细节和示例:
✅ UI 层是否完全使用 Flutter Widget?
→ 若是,90% 以上界面可直接复用。
→ 检查点:
- 是否使用原生视图(如
PlatformView) - 自定义绘制是否使用
CustomPaint而非原生代码 - 动画是否完全使用 Flutter 动画库
→ 示例:纯 Flutter 实现的列表页、表单页可直接迁移
✅ 是否使用以下高风险插件?
shared_preferences(需替换为鸿蒙 KV 存储)
→ 迁移方案:改用ohos_kv_store插件
→ 注意:数据格式需保持兼容path_provider(需适配鸿蒙沙箱路径)
→ 迁移方案:使用ohos_file_picker
→ 注意:/data/data/路径需改为鸿蒙沙箱路径camera/geolocator/firebase_messaging(需重写原生桥接)
→ 替代方案:- 相机 → 鸿蒙 CameraKit
- 定位 → 鸿蒙 Location Kit
- 推送 → 鸿蒙 Push Kit
✅ 是否重度依赖 GMS(Google Mobile Services)?
→ 需替换为 HMS Core(如 Push、Map、Location)
→ 典型需要替换的 GMS 服务:
- Google Sign-In → HMS Account Kit
- Google Maps → HMS Map Kit
- Google Pay → Huawei IAP
→ 注意:需检查是否调用 GMS 专有 API(如GoogleApiAvailability)
✅ 新增检查项:网络请求是否使用平台相关实现?
→ 检查点:
- 是否直接使用
HttpClient(可移植) - 是否依赖 Android/iOS 特定的网络库(需重写)
→ 建议方案:统一使用dio网络库
✅ 新增检查项:后台任务处理方式
→ 检查点:
- 定时任务:需从 WorkManager/iOS Background Fetch 迁移到鸿蒙 Background Task Manager
- 长连接:需适配鸿蒙长连接机制
→ 示例:消息推送的后台保活逻辑需要调整
💡 建议:使用
flutter pub deps查看依赖树,标记含android/或platform: android的插件。
三、第二步:搭建 HarmonyOS 开发环境
1. 安装必要工具
| 工具 | 版本要求 | 下载地址 |
|---|---|---|
| DevEco Studio | ≥4.1 | 华为开发者官网 |
| Flutter SDK(Harmony 支持版) | 社区分支 | Gitee - openharmony-sig/flutter |
| JDK | 11+ | Oracle / OpenJDK |
| Node.js | ≥18(可选) | nodejs.org |
2. 配置 Flutter SDK
# 克隆社区版 Flutter(已集成 Harmony 支持)
git clone https://gitee.com/openharmony-sig/flutter.git -b ohos-beta
export PATH="$PATH:`pwd`/flutter/bin"
# 验证
flutter --version
flutter build harmony --help # 应显示可用命令
⚠️ 注意:不要使用官方
stable分支,否则无harmony构建目标。
四、第三步:改造项目结构与代码
1. 项目结构建议
my_flutter_app/
├── lib/ # Dart 业务代码(基本不变)
├── assets/ # 资源文件
├── harmony/ # 新增:HarmonyOS 原生桥接代码
│ ├── entry/src/main/ets/ # ArkTS 原生实现
│ └── oh-package.json5 # 鸿蒙包配置
├── pubspec.yaml
└── README-harmony.md # 适配说明文档
2. 替换不兼容插件:以 shared_preferences 为例
问题:
官方 shared_preferences 依赖 Android SharedPreferences,在 HarmonyOS 上无法工作。
解决方案:自定义存储服务 + MethodChannel
(1) Dart 端定义接口
// lib/services/harmony_storage.dart
import 'package:flutter/services.dart';
class HarmonyStorage {
static const _channel = MethodChannel('com.example/storage');
Future<void> setString(String key, String value) async {
await _channel.invokeMethod('setString', {'key': key, 'value': value});
}
Future<String?> getString(String key) async {
return await _channel.invokeMethod('getString', {'key': key});
}
}
(2) 鸿蒙端(ArkTS)实现
// harmony/entry/src/main/ets/StorageBridge.ts
import { BusinessError } from '@ohos/base';
import dataPreferences from '@ohos.data.preferences';
let prefs: dataPreferences.Preferences | null = null;
async function initPreferences() {
if (!prefs) {
prefs = await dataPreferences.getPreferences(getContext(), 'app_data');
}
}
export class StorageBridge {
async onMethodCall(method: string, args: Record<string, any>): Promise<any> {
await initPreferences();
if (!prefs) throw new BusinessError(500, 'Preferences not initialized');
switch (method) {
case 'setString':
await prefs.putSync(args.key, args.value);
await prefs.flushSync();
return true;
case 'getString':
return prefs.getSync(args.key, '');
default:
throw new BusinessError(404, 'Method not supported');
}
}
}
(3) 在主入口注册通道(DevEco 中)
// EntryAbility.ts
import { StorageBridge } from './StorageBridge';
class MainUIAbility extends UIAbility {
onCreate() {
// 注册 MethodChannel 桥接
flutterEngine?.registerMethodChannel('com.example/storage', new StorageBridge());
}
}
✅ 效果:Dart 代码调用
HarmonyStorage().setString('token', 'xxx')即可持久化数据。
五、第四步:构建与测试 HAP 包
1. 构建命令
cd my_flutter_app
flutter build harmony --release
生成路径:build/harmony/release/app-default-signed.hap
2. 安装到模拟器或真机
# 使用 hdc(HarmonyOS Device Connector)
hdc install build/harmony/release/app-default-signed.hap
🔧 若提示签名错误,可在 DevEco Studio 中:
- 打开
File > Project Structure > Signing Configs- 勾选 Automatically generate signature(仅测试用)
3. 调试技巧
- 查看日志:
hdc shell hilog | grep flutter - 热重载暂不支持,建议使用 快速构建 + 自动安装脚本
六、第五步:准备上架 AppGallery(可选)
-
替换 GMS 为 HMS Core
- 移除原项目中 Google Mobile Services (GMS) 相关依赖
- 在
pubspec.yaml中添加 HMS Core 官方插件:dependencies: huawei_push: ^6.3.0 huawei_location: ^6.2.0 huawei_map: ^6.2.0 - 执行
flutter pub get安装插件 - 修改代码中 GMS API 调用为对应 HMS API(如将
FirebaseMessaging替换为HuaweiPush)
-
配置隐私政策
- 在项目
assets目录下创建config.json文件 - 按华为规范声明权限用途,例如:
{ "privacyPolicy": "https://yourdomain.com/privacy", "permissions": [ { "name": "LOCATION", "usage": "用于提供周边商家推荐服务" } ], "dataCollection": [ { "type": "DEVICE_ID", "purpose": "用于统计分析和推送服务" } ] }
- 在项目
-
生成正式签名 HAP
- 在 DevEco Studio 中:
- 点击菜单栏 Build > Generate Key and CSR
- 创建发布证书(.p12 文件)
- 配置
build.gradle签名信息:signingConfigs { release { storeFile file("your_key.p12") storePassword "your_password" keyAlias "your_alias" keyPassword "your_password" } } - 执行 Build > Build HAP 生成签名包
- 在 DevEco Studio 中:
-
提交至 AppGallery Connect
- 登录 AppGallery Connect 控制台
- 创建新应用,填写:
- 基础信息(中英文名称/描述)
- 应用分类(如工具/社交)
- 年龄分级
- 上传资源:
- 应用图标(1024x1024 PNG)
- 宣传截图(至少3张,建议尺寸1080x1920)
- 演示视频(可选)
- 在"版本信息"处上传签名的 HAP 文件
- 在审核备注中注明:
本应用使用 Flutter 框架开发,已完整适配 HMS Core 服务 - 提交审核(通常需要3-5个工作日)
七、总结:适配成本 vs 收益
| 项目类型 | 预估工时 | 关键动作 | 适配难点 | 典型应用场景 |
|---|---|---|---|---|
| 纯展示型 App(新闻、电商) | 3~5 天 | 替换存储、网络、图片缓存插件 | 1. 处理不同云存储API差异 2. 图片加载库兼容性测试 |
京东、淘宝等电商应用 今日头条等新闻客户端 |
| 含 IoT 控制功能 | 1~2 周 | 1. 重写设备通信桥接 2. 实现本地设备发现协议 |
1. 蓝牙/WiFi协议差异处理 2. 设备配对流程重构 |
智能家居控制App 可穿戴设备管理应用 |
| 重度依赖 GMS 的社交 App | 2~4 周 | 1. HMS Core 迁移 2. 用户体系对接 3. 推送服务改造 |
1. 地图服务替换 2. 支付系统对接 3. 社交账号体系迁移 |
微信、Facebook等社交应用 Uber等LBS服务应用 |
补充说明:
- 工时估算基于5人开发团队配置
- 测试周期已包含在预估工时内
- 适配成本会随第三方SDK依赖数量线性增长
- 特殊功能模块(如ARCore)可能需要额外1-2周适配时间
✅ 一句话建议:
先做最小可行适配(MVA)—— 跑通核心流程,再逐步优化体验。
更多推荐


所有评论(0)