示例图片

随着 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(可选)

  1. 替换 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
  2. 配置隐私政策

    • 在项目 assets 目录下创建 config.json 文件
    • 按华为规范声明权限用途,例如:
      {
        "privacyPolicy": "https://yourdomain.com/privacy",
        "permissions": [
          {
            "name": "LOCATION",
            "usage": "用于提供周边商家推荐服务"
          }
        ],
        "dataCollection": [
          {
            "type": "DEVICE_ID",
            "purpose": "用于统计分析和推送服务"
          }
        ]
      }
      
  3. 生成正式签名 HAP

    • 在 DevEco Studio 中:
      1. 点击菜单栏 Build > Generate Key and CSR
      2. 创建发布证书(.p12 文件)
      3. 配置 build.gradle 签名信息:
        signingConfigs {
            release {
                storeFile file("your_key.p12")
                storePassword "your_password"
                keyAlias "your_alias"
                keyPassword "your_password"
            }
        }
        
      4. 执行 Build > Build HAP 生成签名包
  4. 提交至 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服务应用

补充说明:

  1. 工时估算基于5人开发团队配置
  2. 测试周期已包含在预估工时内
  3. 适配成本会随第三方SDK依赖数量线性增长
  4. 特殊功能模块(如ARCore)可能需要额外1-2周适配时间

一句话建议
先做最小可行适配(MVA)—— 跑通核心流程,再逐步优化体验。


Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐