本文档制定从 Android 平台移植到 HarmonyOS 平台的详细方案,保持整体架构一致,同时针对 HarmonyOS 系统特色进行优化封装。
业务层(app 模块)
↓ 依赖
├── base-common(业务封装层)
└── capability-xxx(能力层)
↓ 依赖
base-core(基础设施层)
↑ 依赖
base-common(业务封装层)
业务层(entry 模块)
↓ 依赖
├── base-common(业务封装层)
└── capability-xxx(能力层)
↓ 依赖
base-core(基础设施层)
↑ 依赖
base-common(业务封装层)
架构保持一致,但实现方式不同:
职责:
HarmonyOS 实现要点:
base-core/
├── src/main/ets/
│ ├── core/
│ │ ├── log/
│ │ │ ├── ILog.ets # 日志接口(与 Android 保持一致)
│ │ │ └── impl/
│ │ │ ├── HilogLogger.ets # 基于 @kit.PerformanceAnalysisKit/hilog
│ │ │ └── NoOpLogger.ets # 空日志实现
│ │ ├── network/
│ │ │ └── NetworkManager.ets # HTTP 请求管理器(基于 @kit.NetworkKit/http)
│ │ ├── storage/
│ │ │ ├── IStorage.ets # 存储接口(与 Android 保持一致)
│ │ │ └── StorageImpl.ets # 基于 @kit.PreferencesKit/preferences
│ │ ├── push/
│ │ │ └── IPushService.ets # 推送服务接口
│ │ ├── share/
│ │ │ ├── IShareService.ets # 分享服务接口
│ │ │ └── IShareCallback.ets # 分享回调接口
│ │ └── util/
│ │ └── IUtil.ets # 工具类接口
│ └── index.ets # 模块导出入口
├── oh-package.json5
└── README.md
关键差异:
@kit.PerformanceAnalysisKit/hilog 替代 Timber@kit.NetworkKit/http 替代 Retrofit/OkHttp@kit.PreferencesKit/preferences 替代 SharedPreferences职责:
HarmonyOS 实现要点:
base-common/
├── src/main/ets/
│ ├── common/
│ │ ├── auth/
│ │ │ ├── AuthManager.ets # 认证管理器(与 Android 逻辑一致)
│ │ │ ├── storage/
│ │ │ │ └── TokenStore.ets # Token 存储(使用 StorageImpl)
│ │ │ ├── datasource/
│ │ │ │ ├── remote/
│ │ │ │ │ └── AuthRemoteDataSource.ets
│ │ │ │ └── local/
│ │ │ │ └── AuthLocalDataSource.ets
│ │ │ ├── repository/
│ │ │ │ └── AuthRepository.ets
│ │ │ ├── model/
│ │ │ │ ├── LoginRequest.ets
│ │ │ │ └── LoginResponse.ets
│ │ │ └── pages/
│ │ │ ├── LoginPage.ets # 登录页(ArkUI 声明式 UI)
│ │ │ └── RegisterPage.ets # 注册页(ArkUI 声明式 UI)
│ │ ├── network/
│ │ │ ├── NetworkHelper.ets # 网络管理器封装
│ │ │ ├── ApiServiceFactory.ets # API 服务工厂
│ │ │ ├── ApiBaseRemoteDataSource.ets # 远程数据源基类
│ │ │ └── ApiBaseRepository.ets # Repository 基类
│ │ ├── config/
│ │ │ ├── ConfigManager.ets # 配置管理(使用 StorageImpl)
│ │ │ └── ServerConfigManager.ets # 服务器配置管理
│ │ ├── storage/
│ │ │ └── StorageManager.ets # 存储管理器封装
│ │ ├── ui/
│ │ │ ├── BasePage.ets # 页面基类(替代 BaseActivity/BaseFragment)
│ │ │ ├── MessageHelper.ets # 消息提示(使用 @ohos.promptAction)
│ │ │ └── NavigationHelper.ets # 路由导航(使用 router)
│ │ ├── dialog/
│ │ │ └── DialogHelper.ets # 对话框封装(使用 @ohos.promptAction)
│ │ ├── permission/
│ │ │ └── PermissionHelper.ets # 权限管理(使用 @kit.AbilityKit)
│ │ ├── version/
│ │ │ ├── VersionUpdateManager.ets # 版本更新管理器
│ │ │ └── pages/
│ │ │ └── UpdateDialog.ets # 更新对话框(ArkUI)
│ │ ├── launch/
│ │ │ ├── AppInitializer.ets # 应用初始化管理器
│ │ │ └── LaunchPage.ets # 启动页(ArkUI)
│ │ └── socketio/
│ │ └── SocketIOManager.ets # SocketIO 管理器
│ └── index.ets
├── oh-package.json5
└── README.md
关键差异:
router 模块替代 ARouter@ohos.promptAction 替代 Toast/Snackbar@kit.AbilityKit 处理权限@Component 装饰器职责:
模块列表:
capability-socketio/ # Socket.IO 能力
capability-ble/ # BLE 蓝牙能力
capability-nfc/ # NFC 能力
capability-qrcode/ # 二维码能力
capability-push/ # 推送能力(极光推送)
capability-share/ # 分享能力(友盟分享 + 微信 SDK)
关键差异:
职责:
HarmonyOS 实现要点:
entry/
├── src/main/ets/
│ ├── entryability/
│ │ └── EntryAbility.ets # 应用入口 Ability
│ ├── pages/
│ │ ├── MainPage.ets # 主页面
│ │ └── ...
│ └── Application.ets # 应用初始化(替代 Application)
├── src/main/module.json5
└── oh-package.json5
| Android | HarmonyOS | 说明 |
|---|---|---|
| SharedPreferences | @kit.PreferencesKit/preferences | 键值存储 |
| StorageImpl | StorageImpl (基于 preferences) | 统一存储实现 |
| TokenStore | TokenStore (使用 StorageImpl) | Token 存储 |
实现要点:
| Android | HarmonyOS | 说明 |
|---|---|---|
| Retrofit + OkHttp | @kit.NetworkKit/http | HTTP 客户端 |
| Gson | JSON.parse/stringify | JSON 解析 |
| Coroutines | Promise/async-await | 异步处理 |
实现要点:
| Android | HarmonyOS | 说明 |
|---|---|---|
| Activity/Fragment | Page (@Component) | 页面组件 |
| ViewBinding | ArkUI 声明式 | UI 构建 |
| Material Design | HarmonyOS Design | 设计规范 |
| Toast/Snackbar | @ohos.promptAction | 消息提示 |
实现要点:
| Android | HarmonyOS | 说明 |
|---|---|---|
| ARouter | router | 路由导航 |
| Intent | Want | 页面跳转参数 |
实现要点:
| Android | HarmonyOS | 说明 |
|---|---|---|
| Application.onCreate | EntryAbility.onCreate | 应用启动 |
| Activity 生命周期 | Page 生命周期 | 页面生命周期 |
| ProcessLifecycleOwner | AppLifecycleObserver | 应用前后台 |
实现要点:
| Android | HarmonyOS | 说明 |
|---|---|---|
| Activity.requestPermissions | @kit.AbilityKit | 权限请求 |
| PermissionHelper | PermissionHelper (重写) | 权限封装 |
实现要点:
目标: 建立基础架构,验证可行性
任务清单:
创建模块结构
base-core 模块(oh-package.json5)base-common 模块capability-socketio 模块实现基础能力
ILog 接口(基于 hilog)IStorage 接口(基于 preferences)StorageImpl(统一存储)NetworkManager(基于 http)验证基础功能
目标: 移植核心业务逻辑
任务清单:
认证模块
TokenStore(使用 StorageImpl)AuthManagerAuthRepository网络封装
ApiServiceFactoryApiBaseRepository配置管理
ConfigManagerServerConfigManager目标: 完善 UI 层和工具类
任务清单:
UI 基础类
BasePage(页面基类)MessageHelper(消息提示)DialogHelper(对话框)NavigationHelper(路由导航)工具类
PermissionHelperUtilManagerCrashHelper(崩溃收集)业务功能
VersionUpdateManagerSocketIOManager目标: 实现各能力模块
任务清单:
SocketIO 能力
SocketIORepository其他能力
目标: 实现业务页面和功能
任务清单:
应用初始化
AppInitializerEntryAbility 初始化业务页面
测试和优化
HarmonyOS 使用 oh-package.json5:
// base-core/oh-package.json5
{
"name": "@xdz/base-core",
"version": "1.0.0",
"description": "基础设施层",
"main": "src/main/ets/index.ets",
"dependencies": {
"@kit.PerformanceAnalysisKit": "^1.0.0",
"@kit.NetworkKit": "^1.0.0",
"@kit.PreferencesKit": "^1.0.0"
}
}
// base-common/oh-package.json5
{
"name": "@xdz/base-common",
"version": "1.0.0",
"dependencies": {
"@xdz/base-core": "file:../base-core"
}
}
// base-core/src/main/ets/core/storage/StorageImpl.ets
import { preferences } from '@kit.PreferencesKit';
export class StorageImpl implements IStorage {
private static instance: StorageImpl | null = null;
private dataPreferences: preferences.Preferences | null = null;
static async init(context: Context): Promise<void> {
if (!this.instance) {
this.instance = new StorageImpl();
this.instance.dataPreferences = await preferences.getPreferences(context, 'xdz_storage_prefs');
}
}
async putString(key: string, value: string): Promise<void> {
await this.dataPreferences?.put(key, value);
await this.dataPreferences?.flush();
}
async getString(key: string, defaultValue: string = ''): Promise<string> {
return await this.dataPreferences?.get(key, defaultValue) ?? defaultValue;
}
// ... 其他方法
}
// base-core/src/main/ets/core/network/NetworkManager.ets
import { http } from '@kit.NetworkKit';
export class NetworkManager {
private static instance: NetworkManager | null = null;
private httpRequest: http.HttpRequest | null = null;
static getInstance(): NetworkManager {
if (!this.instance) {
this.instance = new NetworkManager();
}
return this.instance;
}
async request<T>(url: string, options: http.RequestOptions): Promise<T> {
return new Promise((resolve, reject) => {
http.createHttp().request(url, options)
.then((response: http.HttpResponse) => {
const data = JSON.parse(response.result.toString());
resolve(data as T);
})
.catch((error: Error) => {
reject(error);
});
});
}
}
// base-common/src/main/ets/common/ui/BasePage.ets
import { Component } from '@kit.ArkUI';
@Component
export abstract class BasePage {
// 页面状态管理
protected loading: boolean = false;
protected error: string | null = null;
// 生命周期方法(与 Android 保持一致)
onPageShow(): void {
// 页面显示
}
onPageHide(): void {
// 页面隐藏
}
// 通用方法
protected showLoading(): void {
this.loading = true;
}
protected hideLoading(): void {
this.loading = false;
}
protected showError(message: string): void {
this.error = message;
}
}
// base-common/src/main/ets/common/router/NavigationHelper.ets
import { router } from '@kit.ArkUI';
export class NavigationHelper {
// 基础跳转
static navigate(path: string, params?: Record<string, Object>): void {
router.pushUrl({
url: path,
params: params
});
}
// 带结果回调跳转
static navigateForResult(
path: string,
params: Record<string, Object>,
onResult: (result: Object) => void
): void {
router.pushUrl({
url: path,
params: params
}).then(() => {
// 监听返回结果
router.addObserver({
onResult: (result: router.Result) => {
onResult(result);
}
});
});
}
}
Android 版本的特殊性:
在 Android 版本中,微信分享回调 Activity(WXEntryActivity)必须放在 base-core 模块中,原因如下:
微信 SDK 要求:微信 SDK 要求回调 Activity 必须在应用包名的 wxapi 子包下
com.narutohuo.xindazhou.wxapi.WXEntryActivitycom.narutohuo.xindazhou.core.wxapi)架构设计:
base-core/src/main/java/com/narutohuo/xindazhou/wxapi/WXEntryActivity.ktcom.narutohuo.xindazhou.wxapi(应用包名,不是模块 namespace)IShareCallback 实现,实现解耦AndroidManifest 配置:
<!-- base-core/src/main/AndroidManifest.xml -->
<activity
android:name="com.narutohuo.xindazhou.wxapi.WXEntryActivity"
android:exported="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
HarmonyOS 版本的处理方案:
⚠️ 重要:需要参考友盟官方文档进行配置
友盟分享 SDK 已支持 HarmonyOS,但具体的回调处理方式需要参考友盟官方文档:
友盟官方文档:
回调机制:
Want 和 Ability 处理回调(与 Android 的 Activity 不同)module.json5 中配置回调 Ability实现位置:
base-core/src/main/ets/wxapi/WXEntryAbility.ets(待确认)module.json5 配置:
module.json5 中添加微信相关的配置querySchemes 以判断是否安装微信(避免异常状态码 17700056)注意事项:
module.json5 中需要添加微信的 querySchemes 配置,否则可能返回异常状态码 17700056base-core 模块(待确认)Android 版本:
capability-push 模块中实现 IPushService 接口HarmonyOS 版本:
capability-push 模块中实现 IPushService 接口集成步骤:
capability-push/oh-package.json5 中添加依赖IPushService 接口Android 版本:
capability-share 模块中实现 IShareService 接口HarmonyOS 版本:
集成要点:
module.json5 中配置微信相关的 querySchemes(避免异常状态码 17700056)Android 无对应功能,HarmonyOS 独有:
建议:
base-core 中预留分布式能力接口capability-xxx 中实现具体分布式功能Android Widget 的 HarmonyOS 版本:
建议:
base-common 中封装卡片管理HarmonyOS 特色:
建议:
处理方式:
处理方式:
处理方式:
file:../ 引用处理方式:
| 阶段 | 时间 | 说明 |
|---|---|---|
| 阶段一:基础设施搭建 | 1-2周 | 建立基础架构 |
| 阶段二:核心业务功能 | 2-3周 | 认证、网络、存储 |
| 阶段三:UI 和工具封装 | 2-3周 | UI 基础类、工具类 |
| 阶段四:能力层模块 | 2-3周 | SocketIO、BLE、NFC 等 |
| 阶段五:业务层实现 | 2-3周 | 业务页面、测试优化 |
| 总计 | 9-14周 | 约 2-3.5 个月 |
本移植方案保持与 Android 版本架构一致,同时充分利用 HarmonyOS 的特色能力。通过分阶段实施,确保每个阶段可独立验证,降低移植风险。
关键成功因素:
文档版本: v1.0
创建时间: 2024-12
最后更新: 2024-12