deveco_hmigbot 0.21.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +26 -0
- package/README.md +50 -0
- package/agents/hmigbot-worker.md +61 -0
- package/agents/hmigbot.md +22 -0
- package/agents/workflow-subagent.md +55 -0
- package/commands/hmigbot.md +17 -0
- package/dist/index.js +1 -0
- package/manifest.json +19 -0
- package/package.json +29 -0
- package/skills/migrate-core/FILES.md +26 -0
- package/skills/migrate-core/SKILL.md +484 -0
- package/skills/migrate-core/references/README.md +64 -0
- package/skills/migrate-core/references/flow/arkts-vector-gate.md +55 -0
- package/skills/migrate-core/references/flow/build-error-patterns.md +52 -0
- package/skills/migrate-core/references/flow/conventions-template.md +244 -0
- package/skills/migrate-core/references/flow/navigation-migration.md +42 -0
- package/skills/migrate-core/references/flow/platform-api-guards.md +59 -0
- package/skills/migrate-core/references/flow/platform-model-gaps.md +43 -0
- package/skills/migrate-core/references/flow/resource-conversion.md +46 -0
- package/skills/migrate-core/references/flow/ui-layout-semantics.md +124 -0
- package/skills/migrate-core/references/flow/unit-breakdown.md +42 -0
- package/skills/migrate-core/references/host-capabilities.md +24 -0
- package/skills/migrate-core/references/topics/app-identity.md +214 -0
- package/skills/migrate-core/references/topics/env-doctor.md +245 -0
- package/skills/migrate-core/references/topics/i18n/README.md +458 -0
- package/skills/migrate-core/references/topics/i18n/references/code-examples.md +304 -0
- package/skills/migrate-core/references/topics/i18n/references/common-pitfalls.md +354 -0
- package/skills/migrate-core/references/topics/i18n/references/dynamic-language-switch.md +464 -0
- package/skills/migrate-core/references/topics/i18n/references/language-codes.md +104 -0
- package/skills/migrate-core/references/topics/icon-sizing.md +98 -0
- package/skills/migrate-core/references/topics/library-migration/README.md +234 -0
- package/skills/migrate-core/references/topics/library-migration/closed-source-sdk.md +128 -0
- package/skills/migrate-core/references/topics/library-migration/download-api-decision.md +84 -0
- package/skills/migrate-core/references/topics/library-migration/library-mapping-table.md +100 -0
- package/skills/migrate-core/references/topics/library-migration/napi-compile-guide.md +84 -0
- package/skills/migrate-core/references/topics/library-migration/ohpm-search-guide.md +73 -0
- package/skills/migrate-core/references/topics/library-migration/stdlib-mapping-table.md +34 -0
- package/skills/migrate-core/references/topics/resources/aar-decompile.md +25 -0
- package/skills/migrate-core/references/topics/resources/conversion-rules.md +625 -0
- package/skills/migrate-core/references/topics/resources/dependency-analysis-rules.md +328 -0
- package/skills/migrate-core/references/topics/resources/material-design-icons.md +173 -0
- package/skills/migrate-core/references/topics/resources/svg-fix-patterns.md +175 -0
- package/skills/migrate-core/references/topics/resources/xml-drawable-to-svg-rules.md +513 -0
- package/skills/migrate-core/references/topics/system-capabilities/README.md +331 -0
- package/skills/migrate-core/references/topics/system-capabilities/avplayer-guide.md +161 -0
- package/skills/migrate-core/references/topics/system-capabilities/background-tasks.md +403 -0
- package/skills/migrate-core/references/topics/system-capabilities/browser-intent.md +121 -0
- package/skills/migrate-core/references/topics/system-capabilities/camera-picker.md +118 -0
- package/skills/migrate-core/references/topics/system-capabilities/document-picker.md +246 -0
- package/skills/migrate-core/references/topics/system-capabilities/file-utils.md +131 -0
- package/skills/migrate-core/references/topics/system-capabilities/permission-helper.md +112 -0
- package/skills/migrate-core/references/topics/system-capabilities/photo-access-helper.md +208 -0
- package/skills/migrate-core/references/topics/system-capabilities/print-management.md +213 -0
- package/skills/migrate-core/references/topics/system-capabilities/share-panel.md +177 -0
- package/skills/migrate-core/references/topics/system-capabilities/system-settings.md +322 -0
- package/skills/migrate-core/references/topics/system-capabilities/telephony-dial.md +49 -0
- package/skills/migrate-core/references/topics/system-capabilities/video-playback.md +42 -0
- package/skills/migrate-core/references/topics/system-capabilities/webview-patterns.md +38 -0
- package/skills/migrate-core/references/topics/ui-alignment/README.md +344 -0
- package/skills/migrate-core/references/topics/ui-alignment/references/dark-mode.md +47 -0
- package/skills/migrate-core/references/topics/ui-alignment/references/layout-mapping.md +301 -0
- package/skills/migrate-core/references/topics/ui-alignment/references/visual-patterns.md +411 -0
- package/skills/migrate-core/scripts/closure/check-anchors.mjs +186 -0
- package/skills/migrate-core/scripts/closure/check-api-guards.mjs +175 -0
- package/skills/migrate-core/scripts/closure/check-consumers.mjs +301 -0
- package/skills/migrate-core/scripts/closure/check-permissions.mjs +165 -0
- package/skills/migrate-core/scripts/closure/check-resources.mjs +130 -0
- package/skills/migrate-core/scripts/closure/check-routes.mjs +527 -0
- package/skills/migrate-core/scripts/closure/check-safearea.mjs +122 -0
- package/skills/migrate-core/scripts/closure/check-stubs.mjs +69 -0
- package/skills/migrate-core/scripts/closure/closure-suite.mjs +256 -0
- package/skills/migrate-core/scripts/closure/idioms.json +105 -0
- package/skills/migrate-core/scripts/convert/convert-resources.mjs +437 -0
- package/skills/migrate-core/scripts/feasibility/feasibility.mjs +235 -0
- package/skills/migrate-core/scripts/feasibility/tables/cross-platform.json +11 -0
- package/skills/migrate-core/scripts/feasibility/tables/deprecated-api.json +10 -0
- package/skills/migrate-core/scripts/feasibility/tables/imported-arkts-core.json +425 -0
- package/skills/migrate-core/scripts/feasibility/tables/lib-equivalence.json +206 -0
- package/skills/migrate-core/scripts/feasibility/tables/system-capabilities.json +22 -0
- package/skills/migrate-core/scripts/front.mjs +107 -0
- package/skills/migrate-core/scripts/interface/ark-extract.mjs +172 -0
- package/skills/migrate-core/scripts/interface/interface.mjs +152 -0
- package/skills/migrate-core/scripts/ledger/ledger.mjs +383 -0
- package/skills/migrate-core/scripts/ledger/parse-cards.mjs +98 -0
- package/skills/migrate-core/scripts/lib/literals.mjs +37 -0
- package/skills/migrate-core/scripts/lib/scan.mjs +315 -0
- package/skills/migrate-core/scripts/smoke/align-sdk.mjs +118 -0
- package/skills/migrate-core/scripts/smoke/ensure-sign.mjs +53 -0
- package/skills/migrate-core/scripts/smoke/smoke.mjs +238 -0
- package/skills/migrate-core/scripts/smoke/verdict.mjs +31 -0
- package/skills/migrate-core/scripts/smoke/walk.mjs +480 -0
- package/skills/migrate-core/scripts/transpile/mapping.json +76 -0
- package/skills/migrate-core/scripts/transpile/transpile-layout.mjs +404 -0
- package/skills/migrate-core/scripts/vectors/run-arkts-vectors.mjs +107 -0
- package/skills/migrate-core/scripts/vectors/setup-arkts-test.mjs +90 -0
- package/skills/migrate-core/scripts/wire/extractors.mjs +258 -0
- package/skills/migrate-core/scripts/wire/wire-routes.mjs +507 -0
- package/skills/migrate-core/templates/acceptance.js +365 -0
- package/skills/migrate-core/templates/explore.js +86 -0
- package/skills/migrate-core/templates/implement.js +211 -0
- package/skills/migrate-core/templates/mig_slices.js +491 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
<!-- 原技能 arkts-library-migration,已吸收为 migrate-core 语料专题,不再单独注册 -->
|
|
2
|
+
> 三方库替代方案查找与决策。当用户提到三方库替代、ohpm 搜索、库迁移、Android 库用什么替代、依赖替换、build.gradle 迁移、npm 包替代等场景时,务必触发此 skill。即使用户只是说"这个库在鸿蒙上有吗"或"用什么替代 Glide",也应触发。完整业务功能形态(下拉刷新列表、列表详情页)见 ../ui-alignment/references/visual-patterns.md。
|
|
3
|
+
|
|
4
|
+
# ArkTS Library Migration — 三方库迁移决策器
|
|
5
|
+
|
|
6
|
+
## API 版本
|
|
7
|
+
|
|
8
|
+
本 skill 基于 **API 12+**(HarmonyOS 5.0.0+)。三方库安装使用 ohpm 包管理器。遇到版本兼容性或其他不确定的 ArkTS 知识点:grep 本机 SDK `.d.ts` 声明为准。
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 五层查找策略
|
|
13
|
+
|
|
14
|
+
遇到任何 Android 三方库需要替代时,按以下层次逐级查找:
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
┌─────────────────────────────────────────────────┐
|
|
18
|
+
│ Level 1: OpenHarmony 三方库 (ohpm) │ 成本最低,直接 ohpm install
|
|
19
|
+
│ 搜索渠道: │
|
|
20
|
+
│ - ohpm.openharmony.cn │
|
|
21
|
+
│ - gitee.com/openharmony-tpc │
|
|
22
|
+
│ - gitee.com/HarmonyOS-tpc │
|
|
23
|
+
├─────────────────────────────────────────────────┤
|
|
24
|
+
│ Level 2: HarmonyOS 原生 API (@kit.*) │ 零依赖,需自写业务代码
|
|
25
|
+
│ - @kit.ImageKit (图片处理) │
|
|
26
|
+
│ - @kit.ArkData (数据库/偏好) │
|
|
27
|
+
│ - @kit.MediaLibraryKit (媒体库) │
|
|
28
|
+
│ - @kit.CoreFileKit (文件操作) │
|
|
29
|
+
│ - @kit.NetworkKit (网络请求) │
|
|
30
|
+
│ - ArkUI 内置组件 (Video/Image/Canvas/Web) │
|
|
31
|
+
├─────────────────────────────────────────────────┤
|
|
32
|
+
│ Level 3: NAPI 桥接 C/C++ 开源库 │ 功能完整,集成成本高
|
|
33
|
+
│ - FFmpeg (音视频处理) │
|
|
34
|
+
│ - OpenCV (图像处理) │
|
|
35
|
+
│ - libjpeg-turbo (图片解码) │
|
|
36
|
+
├─────────────────────────────────────────────────┤
|
|
37
|
+
│ Level 4: WebView + JS 库 │ 开发快,性能有损
|
|
38
|
+
│ - Three.js (3D/全景/VR) │
|
|
39
|
+
│ - Fabric.js (图片编辑画布) │
|
|
40
|
+
├─────────────────────────────────────────────────┤
|
|
41
|
+
│ Level 5: 自研实现或功能降级 │ 最后手段
|
|
42
|
+
└─────────────────────────────────────────────────┘
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 决策树
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
Android 三方库 X
|
|
51
|
+
├─ ohpm / openharmony-tpc 搜索 → 有直接替代?
|
|
52
|
+
│ ├─ 是 → Level 1: ohpm install(最优)
|
|
53
|
+
│ └─ 否 ↓
|
|
54
|
+
├─ HarmonyOS 原生 @kit.* API 能覆盖?
|
|
55
|
+
│ ├─ 是 → Level 2: 用原生 API 实现
|
|
56
|
+
│ └─ 否 ↓
|
|
57
|
+
├─ 该库有 C/C++ 开源核心?
|
|
58
|
+
│ ├─ 是 → Level 3: NAPI 桥接(交叉编译 .so)
|
|
59
|
+
│ └─ 否 ↓
|
|
60
|
+
├─ JS/Web 生态有等价库?
|
|
61
|
+
│ ├─ 是 → Level 4: ArkWeb 组件 + JS 库
|
|
62
|
+
│ └─ 否 ↓
|
|
63
|
+
└─ Level 5: 自研简化版 / 功能降级 / 标记 Skip
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 下载 API 选型
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
文件下载用哪个 API?
|
|
72
|
+
├─ http.request() + ARRAY_BUFFER
|
|
73
|
+
│ ⚠️ 约 5MB 大小限制(错误码 2300023)
|
|
74
|
+
│ ✓ 适合小文件(JSON 配置、图标)
|
|
75
|
+
├─ http.requestInStream()
|
|
76
|
+
│ ❌ 不推荐 — dataEnd 事件在实际设备上不触发
|
|
77
|
+
│ ❌ Promise 在收到响应头后即 resolve
|
|
78
|
+
└─ request.agent(推荐)
|
|
79
|
+
✓ 无文件大小限制
|
|
80
|
+
✓ 稳定的 progress/completed/failed 回调
|
|
81
|
+
✓ 支持前台/后台模式
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
> 详细对比和代码模板见 `download-api-decision.md`
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## RxJava / EventBus 迁移
|
|
89
|
+
|
|
90
|
+
> **MUST**:RxJava→async/await 评估表、EventBus 自建 vs 三方对照见 `library-mapping-table.md`。
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 响应头提取 workaround
|
|
95
|
+
|
|
96
|
+
`http.request()` 的 `response.header` 类型是 `Object`,ArkTS 禁止用 `[]` 索引访问:
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
// ❌ 错误 — Object 不能用索引访问
|
|
100
|
+
const contentType = response.header['content-type'];
|
|
101
|
+
|
|
102
|
+
// ✓ 正确 — JSON 桥接
|
|
103
|
+
const headerStr = JSON.stringify(response.header);
|
|
104
|
+
const headerJson = JSON.parse(headerStr);
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 每层代价分析
|
|
110
|
+
|
|
111
|
+
| Level | 开发代价 | 维护代价 | 运行性能 | 适用场景 |
|
|
112
|
+
|-------|---------|---------|---------|---------|
|
|
113
|
+
| **L1 ohpm** | 低 | 低(社区维护) | 高 | 有成熟鸿蒙包的功能 |
|
|
114
|
+
| **L2 原生 API** | 中 | 低(系统级) | 高 | 系统已提供基础能力 |
|
|
115
|
+
| **L3 NAPI** | 高(需 C/C++ + CMake) | 中(需跟进上游) | 高 | 音视频处理、图像算法等计算密集型 |
|
|
116
|
+
| **L4 WebView** | 中 | 中 | 中(JS 桥接开销) | 全景/VR/复杂编辑 UI |
|
|
117
|
+
| **L5 自研** | 高 | 高 | 视实现而定 | 无任何替代方案 |
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 华为官方四类法
|
|
122
|
+
|
|
123
|
+
华为推荐按以下分类处理三方库迁移:
|
|
124
|
+
|
|
125
|
+
| 类型 | 描述 | 处理方式 |
|
|
126
|
+
|------|------|---------|
|
|
127
|
+
| **A 类** | ohpm 已有鸿蒙版 | 直接 `ohpm install` |
|
|
128
|
+
| **B 类** | 无鸿蒙版但有开源替代 | 用 L2 原生 API 或 L3 NAPI |
|
|
129
|
+
| **C 类** | 闭源 SDK,厂商已/将适配 | 联系厂商获取鸿蒙版 |
|
|
130
|
+
| **D 类** | 无替代方案 | L5 自研或功能降级/Skip |
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 技术栈替换表填写指南
|
|
135
|
+
|
|
136
|
+
迁移项目时,需为每个 Android 依赖填写替换方案表:
|
|
137
|
+
|
|
138
|
+
### 步骤
|
|
139
|
+
1. **提取依赖清单** — 从 `build.gradle` / `build.gradle.kts` / `libs.versions.toml` 提取所有 implementation 依赖
|
|
140
|
+
2. **逐个查对照表** — 在 `library-mapping-table.md` 中查找,命中则直接填入
|
|
141
|
+
3. **未命中走决策树** — 按 L1→L5 逐层尝试
|
|
142
|
+
4. **闭源 SDK** — 查看 `closed-source-sdk.md` 的处理路径
|
|
143
|
+
5. **标注风险等级**:🟢 低(L1-L2 有成熟替代)、🟡 中(L2-L3 API 差异大)、🔴 高(L3-L5 需重写)
|
|
144
|
+
|
|
145
|
+
### 格式
|
|
146
|
+
|
|
147
|
+
```markdown
|
|
148
|
+
| Android 依赖 | ArkTS 替代 | Level | 风险 | 迁移类型 | 备注 |
|
|
149
|
+
|-------------|-----------|-------|------|---------|------|
|
|
150
|
+
| Glide 4.16.0 | @ohos/imageknife | L1 | 🟢 | Auto | ohpm install |
|
|
151
|
+
| Room 2.6.0 | relationalStore @kit.ArkData | L2 | 🟢 | Semi-Auto | 手写 SQL |
|
|
152
|
+
| ExoPlayer 1.1.0 | Video 组件 / AVPlayer | L2 | 🟡 | Manual | 状态机适配 |
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 常见错误 vs 正确做法
|
|
158
|
+
|
|
159
|
+
### 错误 1:直接搜索 npm 包
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
// 错误 — npm 包在 ArkTS 中不可用
|
|
163
|
+
import axios from 'axios'
|
|
164
|
+
|
|
165
|
+
// 正确 — 使用 ohpm 包或原生 API
|
|
166
|
+
import { http } from '@kit.NetworkKit'
|
|
167
|
+
// 或
|
|
168
|
+
// ohpm install @ohos/axios
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### 错误 2:假设 Android 库有同名鸿蒙版
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
// 错误 — 直接假设存在
|
|
175
|
+
ohpm install glide // 不存在
|
|
176
|
+
|
|
177
|
+
// 正确 — 先查对照表,再走决策树
|
|
178
|
+
// Glide → @ohos/imageknife(L1)
|
|
179
|
+
ohpm install @ohos/imageknife
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### 错误 3:闭源 SDK 直接标记为不可迁移
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
// 错误 — 直接放弃
|
|
186
|
+
微信 SDK → Skip
|
|
187
|
+
|
|
188
|
+
// 正确 — 先查厂商适配状态,再考虑 JS-Bridge 过渡
|
|
189
|
+
微信 SDK → 联系厂商获取鸿蒙版(类型 C)
|
|
190
|
+
→ 临时方案:ArkWeb + JS-Bridge
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## 生成检查清单
|
|
196
|
+
|
|
197
|
+
- [ ] 每个 Android 依赖都有对应的替代方案或标记 Skip
|
|
198
|
+
- [ ] 每个依赖标注了 Level(L1-L5)
|
|
199
|
+
- [ ] 每个依赖标注了风险等级(🟢/🟡/🔴)
|
|
200
|
+
- [ ] 高风险项(🔴)有缓解策略
|
|
201
|
+
- [ ] 闭源 SDK 有厂商联系记录或替代方案
|
|
202
|
+
- [ ] ohpm 包安装命令正确
|
|
203
|
+
- [ ] 没有使用 npm 包
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## 跨 Skill 协作
|
|
208
|
+
|
|
209
|
+
| 需要什么 | 读取哪里 |
|
|
210
|
+
|---------|---------|
|
|
211
|
+
| 网络请求替代方案代码模板 | `../system-capabilities/(按 _SKILL 索引取件)` |
|
|
212
|
+
| 数据库替代方案代码模板 | `../system-capabilities/(按 _SKILL 索引取件)` |
|
|
213
|
+
| 系统 API 使用指南 | `arkts-system-capabilities/SKILL.md` |
|
|
214
|
+
| 验证 API 兼容性 | `本机 SDK .d.ts 声明(grep 为准)` |
|
|
215
|
+
| 完整项目依赖配置 | `devecocli create` 生成的工程(宿主自带脚手架)|
|
|
216
|
+
| 媒体播放 | `../system-capabilities/avplayer-guide.md` |
|
|
217
|
+
| 文件下载 | `../system-capabilities/background-tasks.md` |
|
|
218
|
+
| Android UI 对齐 | `../ui-alignment/README.md` |
|
|
219
|
+
|
|
220
|
+
> 完整路由矩阵见 `本机 SDK .d.ts 声明(grep 为准)`
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## References
|
|
225
|
+
|
|
226
|
+
- `library-mapping-table.md` — 50+ 库完整对照表(7 个分类:图片/视频/网络/UI/工具/编辑/商业SDK)
|
|
227
|
+
- `ohpm-search-guide.md` — ohpm 搜索渠道 + 质量评估清单 + 已验证库列表
|
|
228
|
+
- `napi-compile-guide.md` — C/C++ 库交叉编译方法(CMake + oh-compile-script)
|
|
229
|
+
- `closed-source-sdk.md` — 闭源 SDK 三种处理路径 + JS-Bridge 过渡方案代码模板
|
|
230
|
+
- `download-api-decision.md` — http.request vs requestInStream vs request.agent 对比 + 错误码
|
|
231
|
+
- 遇到版本兼容性或其他不确定的 ArkTS 知识点:grep 本机 SDK `.d.ts` 声明为准
|
|
232
|
+
|
|
233
|
+
## 标准库原语映射
|
|
234
|
+
`java.*`/`kotlin.*` 标准库原语(BigDecimal/BigInteger/正则/加密/日期/集合/UUID 等,非 gradle 依赖)→ 见 `stdlib-mapping-table.md`:查询优先(SDK 声明/`devecocli docs`),禁重造除非证明缺失。
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# 闭源 SDK 处理方案
|
|
2
|
+
|
|
3
|
+
> 当 Android 项目使用了闭源商业 SDK,且该 SDK 没有公开源码时的处理策略。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 三条处理路径
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
闭源 SDK X
|
|
11
|
+
├─ 路径 A: 厂商已出/将出鸿蒙版 → 等待或催促,直接替换
|
|
12
|
+
├─ 路径 B: JS-Bridge 过渡 → ArkWeb 加载 JS SDK,postMessage 通信
|
|
13
|
+
└─ 路径 C: 功能替代或厂商更换 → 换用有鸿蒙版的竞品
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 路径 A:厂商适配
|
|
19
|
+
|
|
20
|
+
**适用条件**:厂商已发布或明确计划发布鸿蒙版
|
|
21
|
+
|
|
22
|
+
| SDK | 鸿蒙适配状态 | 处理 |
|
|
23
|
+
|-----|------------|------|
|
|
24
|
+
| 支付宝 SDK | 已适配 | 直接使用鸿蒙版 |
|
|
25
|
+
| 极光推送 | 已适配 | 直接使用鸿蒙版 |
|
|
26
|
+
| 友盟+ | 已适配 | 直接使用鸿蒙版 |
|
|
27
|
+
| 个推 | 已适配 | 直接使用鸿蒙版 |
|
|
28
|
+
| 微信 SDK | 适配中 | 联系厂商获取时间表 |
|
|
29
|
+
|
|
30
|
+
**操作**:联系厂商商务或技术支持,获取鸿蒙版 SDK 和接入文档。
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 路径 B:JS-Bridge 过渡
|
|
35
|
+
|
|
36
|
+
**适用条件**:
|
|
37
|
+
- SDK 有 JS/Web 版本
|
|
38
|
+
- 厂商鸿蒙版即将发布但项目等不及
|
|
39
|
+
- 功能复杂度适中,JS 性能可接受
|
|
40
|
+
|
|
41
|
+
### 代码模板
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
// ArkTS 侧 — 创建 Web 组件作为桥接容器(V2,API 12+)
|
|
45
|
+
@ComponentV2
|
|
46
|
+
struct SdkBridge {
|
|
47
|
+
private webController: WebviewController = new WebviewController()
|
|
48
|
+
private bridgeObject: BridgeInterface = new BridgeImpl()
|
|
49
|
+
|
|
50
|
+
build() {
|
|
51
|
+
Web({ src: $rawfile('sdk_bridge.html'), controller: this.webController })
|
|
52
|
+
.javaScriptProxy({
|
|
53
|
+
object: this.bridgeObject,
|
|
54
|
+
name: 'nativeBridge',
|
|
55
|
+
methodList: ['onResult', 'onError'],
|
|
56
|
+
controller: this.webController
|
|
57
|
+
})
|
|
58
|
+
.width(0) // 隐藏 Web 组件
|
|
59
|
+
.height(0)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Bridge 接口实现
|
|
64
|
+
class BridgeImpl {
|
|
65
|
+
onResult(data: string): void {
|
|
66
|
+
const result = JSON.parse(data)
|
|
67
|
+
// 处理 SDK 返回结果
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
onError(error: string): void {
|
|
71
|
+
// 处理错误
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
```html
|
|
77
|
+
<!-- resources/rawfile/sdk_bridge.html -->
|
|
78
|
+
<script src="vendor-sdk.js"></script>
|
|
79
|
+
<script>
|
|
80
|
+
// 调用 SDK 功能
|
|
81
|
+
function callSdkMethod(params) {
|
|
82
|
+
vendorSdk.doSomething(params, function(result) {
|
|
83
|
+
nativeBridge.onResult(JSON.stringify(result));
|
|
84
|
+
}, function(error) {
|
|
85
|
+
nativeBridge.onError(error.message);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
</script>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 注意事项
|
|
92
|
+
- JS-Bridge 通信是异步的,注意回调时序
|
|
93
|
+
- 传输数据量大时考虑性能影响
|
|
94
|
+
- 这是过渡方案,厂商发布鸿蒙版后应替换
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 路径 C:功能替代
|
|
99
|
+
|
|
100
|
+
**适用条件**:
|
|
101
|
+
- 厂商无鸿蒙版计划
|
|
102
|
+
- 无 JS 版本可用于 Bridge
|
|
103
|
+
- 存在功能等价的竞品已适配鸿蒙
|
|
104
|
+
|
|
105
|
+
**操作**:
|
|
106
|
+
1. 评估竞品功能覆盖度
|
|
107
|
+
2. 评估迁移成本(API 差异)
|
|
108
|
+
3. 商务沟通(价格、合同)
|
|
109
|
+
4. 实施替换
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 决策流程
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
闭源 SDK X
|
|
117
|
+
├─ 厂商有鸿蒙版?
|
|
118
|
+
│ ├─ 已发布 → 路径 A:直接替换
|
|
119
|
+
│ └─ 计划中 → 时间可等?
|
|
120
|
+
│ ├─ 是 → 等待 + 先用 Mock
|
|
121
|
+
│ └─ 否 → 有 JS 版本?
|
|
122
|
+
│ ├─ 是 → 路径 B:JS-Bridge 过渡
|
|
123
|
+
│ └─ 否 → 路径 C:竞品替代或功能降级
|
|
124
|
+
└─ 无鸿蒙版计划
|
|
125
|
+
└─ 有竞品已适配?
|
|
126
|
+
├─ 是 → 路径 C:更换厂商
|
|
127
|
+
└─ 否 → 功能降级 / 标记 Skip
|
|
128
|
+
```
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# 下载 API 选型参考
|
|
2
|
+
|
|
3
|
+
> http.request vs requestInStream vs request.agent 详细对比。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 对比表
|
|
8
|
+
|
|
9
|
+
| 特性 | http.request | requestInStream | request.agent |
|
|
10
|
+
|------|-------------|-----------------|---------------|
|
|
11
|
+
| 文件大小限制 | ~5MB | 理论无限 | 无限制 |
|
|
12
|
+
| 进度回调 | ❌ | ⚠️ 不可靠 | ✓ 稳定 |
|
|
13
|
+
| 后台下载 | ❌ | ❌ | ✓ |
|
|
14
|
+
| 断点续传 | ❌ | ❌ | ✓ |
|
|
15
|
+
| 稳定性 | ✓ | ❌ | ✓ |
|
|
16
|
+
| 适用场景 | 小文件/API | 不推荐 | **所有文件下载** |
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 错误码
|
|
21
|
+
|
|
22
|
+
| 错误码 | 含义 | 解决方案 |
|
|
23
|
+
|-------|------|---------|
|
|
24
|
+
| 2300023 | 文件大小超限(http.request ARRAY_BUFFER) | 改用 request.agent |
|
|
25
|
+
| 13900002 | ENOENT 路径不存在 | mkdirSync(dir, true) |
|
|
26
|
+
| 401/403 | 未授权/禁止 | 检查 URL 权限 |
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## request.agent.Config 速查
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
import { request } from '@kit.BasicServicesKit';
|
|
34
|
+
|
|
35
|
+
const config: request.agent.Config = {
|
|
36
|
+
action: request.agent.Action.DOWNLOAD,
|
|
37
|
+
url: cleanUrl,
|
|
38
|
+
overwrite: true,
|
|
39
|
+
saveas: './' + fileName, // 相对于 cacheDir
|
|
40
|
+
mode: request.agent.Mode.FOREGROUND,
|
|
41
|
+
gauge: true
|
|
42
|
+
};
|
|
43
|
+
const task = await request.agent.create(context, config);
|
|
44
|
+
task.on('progress', (p: request.agent.Progress) => {
|
|
45
|
+
const percent = Math.floor(p.sizes[0] * 100 / p.sizes[1]);
|
|
46
|
+
});
|
|
47
|
+
task.on('completed', () => { /* 完成 */ });
|
|
48
|
+
task.on('failed', () => { /* 失败 */ });
|
|
49
|
+
await task.start();
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 从 http.request 迁移到 request.agent
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
// 旧方案(有 5MB 限制)
|
|
58
|
+
const httpReq = http.createHttp();
|
|
59
|
+
try {
|
|
60
|
+
const resp = await httpReq.request(url, {
|
|
61
|
+
method: http.RequestMethod.GET,
|
|
62
|
+
expectDataType: http.HttpDataType.ARRAY_BUFFER
|
|
63
|
+
});
|
|
64
|
+
// 写入文件...
|
|
65
|
+
} finally {
|
|
66
|
+
httpReq.destroy();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// 新方案(无限制)
|
|
70
|
+
const config: request.agent.Config = {
|
|
71
|
+
action: request.agent.Action.DOWNLOAD,
|
|
72
|
+
url: url,
|
|
73
|
+
saveas: './' + fileName,
|
|
74
|
+
mode: request.agent.Mode.FOREGROUND,
|
|
75
|
+
gauge: true
|
|
76
|
+
};
|
|
77
|
+
const task = await request.agent.create(context, config);
|
|
78
|
+
task.on('completed', () => { /* 文件已在 cacheDir */ });
|
|
79
|
+
await task.start();
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
RSS/XML 来源的 URL 先做 HTML 实体解码(&→&,否则 HTTP 400);下载完成先 statSync 验 size>0 再入库/移动。
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# 三方库完整对照表
|
|
2
|
+
|
|
3
|
+
> 50+ Android 库到 ArkTS 的替代方案映射。按功能分类,每个条目标注 Level、安装方式和注意事项。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 图片加载与显示
|
|
8
|
+
|
|
9
|
+
| Android 库 | ArkTS 替代 | Level | 安装方式 | 备注 |
|
|
10
|
+
|-----------|-----------|-------|---------|------|
|
|
11
|
+
| Glide | `@ohos/imageknife` | L1 | `ohpm install @ohos/imageknife` | 内存+磁盘二级缓存 |
|
|
12
|
+
| Picasso | `@ohos/imageknife` | L1 | 同上 | 功能覆盖 |
|
|
13
|
+
| Coil | `Image` 组件 + `photoAccessHelper` | L2 | 原生 | 简单场景直接用原生 Image |
|
|
14
|
+
| SubsamplingScaleImageView | `@ohos/largeimage` | L1 | `ohpm install @ohos/largeimage` | 支持缩放/拖拽/旋转 |
|
|
15
|
+
| PhotoView | `Image` + `PinchGesture` | L2 | 原生 | 手动实现手势缩放 |
|
|
16
|
+
| CircleImageView | `Image` + `.borderRadius('50%')` | L2 | 原生 | 原生属性即可 |
|
|
17
|
+
| Android Image Cropper | `Canvas` + 手势 API | L5 | 自研 | 需自绘可拖拽裁剪框 |
|
|
18
|
+
| AndroidSVG | ohos-svg | L1 | 需确认最新地址 | SVG 解析渲染 |
|
|
19
|
+
| GIF Drawable | ohos_gif-drawable | L1 | 需确认最新地址 | 基于 Canvas 渲染 GIF |
|
|
20
|
+
| APNG 动画库 | `ImageAnimator` 组件 | L2 | 原生 | 基础动画格式支持 |
|
|
21
|
+
| WebP 解码 | `Image` 组件 | L2 | 原生 | HarmonyOS 原生支持 WebP |
|
|
22
|
+
|
|
23
|
+
## 图片编辑与滤镜
|
|
24
|
+
|
|
25
|
+
| Android 库 | ArkTS 替代 | Level | 安装方式 | 备注 |
|
|
26
|
+
|-----------|-----------|-------|---------|------|
|
|
27
|
+
| ImgLy PESDK | `Canvas` + `@kit.ImageKit` PixelMap | L5 | 自研 | 商业库无鸿蒙版 |
|
|
28
|
+
| GPUImage | `@kit.ImageKit` + `effectKit` | L2 | 原生 | 基础滤镜可用 |
|
|
29
|
+
| zomato/androidphotofilters | PixelMap 像素操作 | L2 | 原生 | 灰度/复古/反转可自研 |
|
|
30
|
+
| Lottie | `@ohos/lottie` | L1 | `ohpm install @ohos/lottie` | Lottie 动画支持 |
|
|
31
|
+
|
|
32
|
+
## 视频播放与编辑
|
|
33
|
+
|
|
34
|
+
| Android 库 | ArkTS 替代 | Level | 安装方式 | 备注 |
|
|
35
|
+
|-----------|-----------|-------|---------|------|
|
|
36
|
+
| ExoPlayer / Media3 | `Video` 组件 / `AVPlayer` | L2 | 原生 | 状态机有差异(见踩坑 P13) |
|
|
37
|
+
| IJKPlayer | `Video` 组件 / `AVPlayer` | L2 | 原生 | 同上 |
|
|
38
|
+
| ImgLy VESDK | FFmpeg + 自研 UI | L3+L5 | NAPI | 商业库无鸿蒙版 |
|
|
39
|
+
| FFmpeg | `HarmonyOS-tpc/FFmpeg` | L3 | HAR/NAPI | 完整 7 大核心库 |
|
|
40
|
+
| GSYVideoPlayer | GSYVideoPlayer (鸿蒙版) | L1 | 需确认最新地址 | 支持多内核和滤镜 |
|
|
41
|
+
| Google VR SDK | Three.js + Pannellum | L4 | ArkWeb + JS | 全景/360度视频 |
|
|
42
|
+
|
|
43
|
+
## 网络与数据
|
|
44
|
+
|
|
45
|
+
| Android 库 | ArkTS 替代 | Level | 安装方式 | 备注 |
|
|
46
|
+
|-----------|-----------|-------|---------|------|
|
|
47
|
+
| OkHttp | `@kit.NetworkKit` http | L2 | 原生 | 实例需 `destroy()` |
|
|
48
|
+
| Retrofit | `@ohos/axios` 或原生 http | L1/L2 | `ohpm install @ohos/axios` | axios 提供更友好的 API |
|
|
49
|
+
| Gson / Moshi | `JSON.parse` / `JSON.stringify` | L2 | 原生 | ArkTS 原生支持 |
|
|
50
|
+
| Room / GreenDAO / Realm | `@kit.ArkData` relationalStore | L2 | 原生 | 手写 SQL |
|
|
51
|
+
| SharedPreferences / DataStore | `@kit.ArkData` preferences | L2 | 原生 | 异步 API |
|
|
52
|
+
|
|
53
|
+
## UI 框架与组件
|
|
54
|
+
|
|
55
|
+
| Android 库 | ArkTS 替代 | Level | 安装方式 | 备注 |
|
|
56
|
+
|-----------|-----------|-------|---------|------|
|
|
57
|
+
| ConstraintLayout | `Flex`/`Stack`/`Row`/`Column` | L2 | 原生 | 声明式布局 |
|
|
58
|
+
| RecyclerView | `List`/`Grid`/`WaterFlow` | L2 | 原生 | 配合 `ForEach`/`LazyForEach` |
|
|
59
|
+
| ViewPager2 | `Swiper` | L2 | 原生 | 支持水平/垂直翻页 |
|
|
60
|
+
| SwipeRefreshLayout | `Refresh` 组件 / `@ohos/pulltorefresh` | L1/L2 | 原生或 ohpm | 下拉刷新 |
|
|
61
|
+
| Material Components | ArkUI 原生组件 | L2 | 原生 | Tabs/Dialog/Toast 等 |
|
|
62
|
+
| Navigation Component | `Navigation` + `NavPathStack` | L2 | 原生 | 路由栈管理 |
|
|
63
|
+
|
|
64
|
+
## 工具与基础设施
|
|
65
|
+
|
|
66
|
+
| Android 库 | ArkTS 替代 | Level | 安装方式 | 备注 |
|
|
67
|
+
|-----------|-----------|-------|---------|------|
|
|
68
|
+
| RxJava / Coroutine | `async/await` + `Promise` | L2 | 原生 | 原生异步 |
|
|
69
|
+
| EventBus | 自建 `Map<string, Function[]>` | L5 | 自研 | 简单发布订阅 |
|
|
70
|
+
| WorkManager | `@kit.BackgroundTasksKit` | L2 | 原生 | 间隔约束不同 |
|
|
71
|
+
| Timber / Logger | `hilog` (`@kit.PerformanceAnalysisKit`) | L2 | 原生 | 系统级日志 |
|
|
72
|
+
| LeakCanary | DevEco Profiler | — | IDE 工具 | 内存分析 |
|
|
73
|
+
| Sanselan / ExifInterface | `@kit.ImageKit` image.ImageSource | L2 | 原生 | EXIF 读取 |
|
|
74
|
+
| JSOUP (HTML 解析) | `@ohos/htmlparser2` 或自研 | L1 | ohpm | HTML 解析 |
|
|
75
|
+
| SAX Parser | `XmlPullParser` (`@ohos.xml`) | L2 | 原生 | push→pull 需重写(见踩坑 P11) |
|
|
76
|
+
|
|
77
|
+
## 商业 SDK(推送/支付/地图等)
|
|
78
|
+
|
|
79
|
+
| Android 库 | ArkTS 替代 | Level | 处理方式 |
|
|
80
|
+
|-----------|-----------|-------|---------|
|
|
81
|
+
| Firebase | AppGallery Connect | L2 | 华为对标服务 |
|
|
82
|
+
| Google Maps | 华为 Map Kit | L2 | 华为对标服务 |
|
|
83
|
+
| 极光推送 | 极光推送鸿蒙版 | L1 | 厂商已适配 |
|
|
84
|
+
| 友盟+ | 友盟+鸿蒙版 | L1 | 厂商已适配 |
|
|
85
|
+
| 个推 | 个推鸿蒙版 | L1 | 厂商已适配 |
|
|
86
|
+
| 微信 SDK | 联系厂商获取鸿蒙版 | — | 类型 C:联系厂商 |
|
|
87
|
+
| 支付宝 SDK | 支付宝鸿蒙版 | L1 | 已适配 |
|
|
88
|
+
| BiometricPrompt | `@ohos.userIAM.userAuth` | L2 | 原生 API |
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 按 Level 汇总
|
|
93
|
+
|
|
94
|
+
| Level | 数量 | 代表库 |
|
|
95
|
+
|-------|------|-------|
|
|
96
|
+
| **L1 ohpm** | ~12 | imageknife, largeimage, lottie, axios, pulltorefresh, 极光, 友盟, 个推, 支付宝 |
|
|
97
|
+
| **L2 原生 API** | ~25 | Image, Video/AVPlayer, relationalStore, preferences, http, Canvas, Navigation, hilog... |
|
|
98
|
+
| **L3 NAPI** | ~3 | FFmpeg, OpenCV, OpenSSL |
|
|
99
|
+
| **L4 WebView+JS** | ~2 | Three.js(全景), Fabric.js(编辑) |
|
|
100
|
+
| **L5 自研** | ~5 | EventBus, 图片裁剪框, PESDK 简化版 |
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# C/C++ 库 NAPI 交叉编译指南
|
|
2
|
+
|
|
3
|
+
> 当 Level 1(ohpm)和 Level 2(原生 API)都无法满足需求时,可通过 NAPI 桥接 C/C++ 开源库。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 适用场景
|
|
8
|
+
|
|
9
|
+
- 音视频处理(FFmpeg)
|
|
10
|
+
- 图像算法(OpenCV)
|
|
11
|
+
- 加解密(OpenSSL)
|
|
12
|
+
- 其他计算密集型的 C/C++ 库
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 方式一:CMake 构建(最常见)
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
cmake \
|
|
20
|
+
-DCMAKE_TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake \
|
|
21
|
+
-DCMAKE_BUILD_TYPE=Release \
|
|
22
|
+
-DOHOS_ARCH=arm64-v8a \
|
|
23
|
+
..
|
|
24
|
+
ninja -C build
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 关键环境变量
|
|
28
|
+
|
|
29
|
+
| 变量 | 说明 |
|
|
30
|
+
|------|------|
|
|
31
|
+
| `OHOS_SDK` | HarmonyOS SDK 路径 |
|
|
32
|
+
| `OHOS_ARCH` | 目标架构:`arm64-v8a`(手机)/ `armeabi-v7a` / `x86_64`(模拟器)|
|
|
33
|
+
| `CMAKE_TOOLCHAIN_FILE` | SDK 自带的工具链文件 |
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 方式二:oh-compile-script(推荐)
|
|
38
|
+
|
|
39
|
+
基于 Conan 2.x 的自动化编译工具,已预置 100+ 常用库的依赖管理:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
git clone https://gitee.com/aspect1103/oh-compile-script.git
|
|
43
|
+
pip install conan==2.x
|
|
44
|
+
python3 build.py --lib=ffmpeg --arch=arm64-v8a
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 支持的库(部分)
|
|
48
|
+
|
|
49
|
+
- FFmpeg(完整 7 大核心库)
|
|
50
|
+
- OpenSSL
|
|
51
|
+
- libjpeg-turbo
|
|
52
|
+
- libpng
|
|
53
|
+
- zlib
|
|
54
|
+
- curl
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 编译产物验证
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# 检查是否为 ARM aarch64 架构
|
|
62
|
+
file libxxx.so # 期望: ELF 64-bit LSB shared object, ARM aarch64
|
|
63
|
+
|
|
64
|
+
# 检查导出符号
|
|
65
|
+
nm -D libxxx.so | grep <目标函数>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## 在 ArkTS 项目中使用
|
|
71
|
+
|
|
72
|
+
1. 将 `.so` 文件放入 `entry/libs/arm64-v8a/`
|
|
73
|
+
2. 编写 NAPI 绑定层(C/C++)
|
|
74
|
+
3. 在 `CMakeLists.txt` 中配置
|
|
75
|
+
4. ArkTS 侧通过 `import xxx from 'libxxx.so'` 调用
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 注意事项
|
|
80
|
+
|
|
81
|
+
- 交叉编译的 .so 必须匹配目标设备架构
|
|
82
|
+
- 模拟器用 `x86_64`,真机用 `arm64-v8a`
|
|
83
|
+
- Debug 包体积会显著增大,Release 模式编译
|
|
84
|
+
- 某些库可能需要禁用不支持的系统调用
|