@harmonyos-arkts/d2h 0.1.10 → 0.1.12
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/.claude-plugin/marketplace.json +15 -13
- package/.claude-plugin/plugin.json +13 -7
- package/AGENTS.md +5 -5
- package/README.md +212 -212
- package/agents/android-to-hmos-00-orchestrator.md +318 -318
- package/agents/d2h.md +157 -157
- package/dist/bin/install-opencode.js +30 -30
- package/docs/environment-check.md +86 -86
- package/install-opencode.sh +160 -160
- package/opencode/agents.json +16 -16
- package/opencode/vscode-d2h-package.json +7 -7
- package/opencode/vscode-d2h-plugin.mjs +29 -29
- package/package.json +54 -54
- package/schemas/android-source-manifest.schema.json +25 -25
- package/schemas/checkpoint-provenance.schema.json +67 -67
- package/schemas/final-acceptance.schema.json +29 -29
- package/schemas/managed-evidence-index.schema.json +15 -15
- package/schemas/managed-evidence.schema.json +114 -114
- package/schemas/migration-config.schema.json +51 -51
- package/schemas/migration-report-index.schema.json +39 -39
- package/schemas/migration-report-item.schema.json +51 -51
- package/schemas/migration-report-summary.schema.json +25 -25
- package/schemas/migration-status.schema.json +202 -202
- package/schemas/preflight.schema.json +60 -60
- package/schemas/source-order-audit.schema.json +16 -16
- package/schemas/source-provenance-event.schema.json +19 -19
- package/schemas/spec-app-shard.schema.json +45 -45
- package/schemas/spec-fact-corrections-shard.schema.json +13 -13
- package/schemas/spec-features-shard.schema.json +43 -43
- package/schemas/spec-index.schema.json +26 -26
- package/schemas/spec-interactions-shard.schema.json +40 -40
- package/schemas/spec-page.schema.json +98 -98
- package/schemas/spec-pages-index.schema.json +1 -1
- package/schemas/spec-unresolved-shard.schema.json +1 -1
- package/schemas/task-envelope.schema.json +109 -109
- package/schemas/task-plan.schema.json +341 -341
- package/scripts/check-environment.mjs +320 -320
- package/skills/android2hmos_resources_convert/SKILL.md +180 -180
- package/skills/android2hmos_resources_convert/references/image-conversion-rules.md +230 -230
- package/skills/android2hmos_resources_convert/references/svg-fix-patterns.md +175 -175
- package/skills/android2hmos_resources_convert/references/xml-drawable-to-svg-rules.md +513 -513
- package/skills/arkts-app-identity/SKILL.md +238 -238
- package/skills/arkts-i18n/SKILL.md +496 -496
- package/skills/arkts-i18n/evals/evals.json +84 -84
- package/skills/arkts-i18n/references/code-examples.md +302 -302
- package/skills/arkts-i18n/references/common-pitfalls.md +391 -391
- package/skills/arkts-i18n/references/dynamic-language-switch.md +604 -604
- package/skills/arkts-i18n/references/hardcoded-string-scanner.md +348 -348
- package/skills/arkts-i18n/references/language-codes.md +104 -104
- package/skills/arkts-i18n/references/resource-file-structure.md +775 -775
- package/skills/arkts-i18n/references/static-vs-dynamic.md +242 -242
- package/skills/arkts-i18n/references/v1-compat.md +244 -244
- package/skills/arkts-i18n/scripts/audit_i18n_completeness.sh +174 -174
- package/skills/arkts-icon-sizing/SKILL.md +211 -211
- package/skills/arkts-icon-sizing/scripts/icon_audit.py +131 -131
- package/skills/arkts-icon-sizing/scripts/icon_autofix.py +88 -88
- package/skills/arkts-icon-sizing/scripts/icon_dims.py +179 -179
- package/skills/arkts-icon-sizing/scripts/icon_fix.py +119 -119
- package/skills/arkts-mvvm-architecture/SKILL.md +613 -613
- package/skills/d2h-hypium-forge/SKILL.md +309 -309
- package/skills/d2h-hypium-forge/references/functional-spec-template.md +140 -140
- package/skills/d2h-hypium-forge/references/official-api.md +135 -135
- package/skills/d2h-hypium-forge/references/pitfalls.md +98 -98
- package/skills/d2h-hypium-forge/references/testability-template.md +71 -71
- package/skills/d2h-hypium-forge/scripts/_common_template.py +659 -659
- package/skills/d2h-hypium-forge/scripts/analyze_results.py +165 -165
- package/skills/d2h-hypium-forge/scripts/assert_audit.py +107 -107
- package/skills/d2h-hypium-forge/scripts/collect_runtime_pages.py +169 -169
- package/skills/d2h-hypium-forge/scripts/forge_report.py +325 -325
- package/skills/d2h-hypium-forge/scripts/inject_resource_ids.py +114 -114
- package/skills/d2h-hypium-forge/scripts/lint_asserts.py +80 -80
- package/skills/d2h-hypium-forge/scripts/lint_locate.py +60 -60
- package/skills/d2h-hypium-forge/scripts/merge_appgraph.py +249 -249
- package/skills/d2h-hypium-forge/scripts/precondition.py +140 -140
- package/skills/d2h-hypium-forge/scripts/preinject_ids.py +232 -232
- package/skills/d2h-hypium-forge/scripts/probe.py +197 -197
- package/skills/d2h-hypium-forge/scripts/run_direct.py +823 -823
- package/skills/d2h-hypium-forge/scripts/run_parallel.py +121 -121
- package/skills/d2h-hypium-forge/scripts/scan_features.py +255 -255
- package/skills/d2h-hypium-forge/scripts/upgrade_asserts.py +66 -66
- package/skills/d2h-hypium-forge/scripts/validate_scenarios.py +84 -84
- package/skills/d2h-page-develop/SKILL.md +112 -112
- package/skills/d2h-page-develop/agents/openai.yaml +7 -7
- package/skills/d2h-page-spec-generate/SKILL.md +206 -206
- package/skills/d2h-page-spec-generate/scripts/build_batch_report.py +227 -227
- package/skills/d2h-utg-ai-generate/SKILL.md +128 -128
- package/skills/d2h-utg-ai-generate/references/click-paths-schema.json +76 -76
- package/skills/d2h-utg-ai-generate/references/extraction-guide.md +34 -34
- package/skills/d2h-utg-ai-generate/references/facts-contract.md +96 -96
- package/skills/d2h-utg-ai-generate/references/page-schema.json +61 -61
- package/skills/d2h-utg-ai-generate/references/utg-schema.json +89 -89
- package/skills/d2h-utg-ai-generate/scripts/build_page_json.py +314 -314
- package/skills/d2h-utg-ai-generate/scripts/build_utg.py +123 -123
- package/skills/d2h-utg-ai-generate/scripts/capture_from_page_json.ts +280 -280
- package/skills/d2h-utg-ai-generate/scripts/utg_common.py +524 -524
- package/skills/d2h-utg-ai-generate/scripts/utg_html.py +489 -489
- package/skills/d2h-utg-ai-generate/scripts/validate_utg.py +69 -69
- package/skills/d2h-utg-ai-generate/scripts/vendor/D3-LICENSE +13 -13
- package/skills/d2h-utg-ai-generate/scripts/vendor/d3-7.9.0.min.js +2 -2
- package/skills/d2h-utg-ai-generate/tests/test_pipeline.py +369 -369
- package/skills/d2h-utg-static-generate/SKILL.md +73 -73
- package/skills/d2h-utg-static-generate/references/discoveries.md +38 -38
- package/skills/d2h-utg-static-generate/scripts/generate.py +499 -499
- package/skills/d2h-utg-static-generate/tests/test_static.py +335 -335
- package/skills/d2h-utg-static-generate/tests/verify-offline-html.py +60 -60
- package/skills/d2h-utg-static-generate/tests/verify-produced-fixture.py +131 -131
- package/skills/harmonyos-migration-playbook/SKILL.md +83 -83
- package/skills/harmonyos-migration-playbook/agents/openai.yaml +7 -7
- package/skills/harmonyos-migration-playbook/references/arkts-compile.md +24 -24
- package/skills/harmonyos-migration-playbook/references/harmony-runtime.md +53 -53
- package/skills/harmonyos-migration-playbook/references/lesson-lifecycle.md +45 -45
- package/skills/harmonyos-migration-playbook/references/protocol-e2e.md +23 -23
- package/skills/harmonyos-migration-playbook/references/ui-automation.md +53 -53
- package/skills/harmonyos-migration-playbook/references/windows-environment.md +38 -38
- package/skills/maintaining-migration-report/SKILL.md +144 -144
- package/skills/maintaining-migration-report/references/final-acceptance.md +48 -48
- package/skills/maintaining-migration-report/references/source-provenance.md +66 -66
- package/skills/managing-d2h-toolchain/SKILL.md +24 -24
- package/skills/managing-d2h-toolchain/environment-requirements.json +16 -16
- package/skills/managing-d2h-toolchain/scripts/manage-toolchain.mjs +98 -98
- package/skills/managing-d2h-toolchain/toolchain.json +16 -16
- package/skills/native-library-substitution/SKILL.md +384 -384
- package/skills/native-library-substitution/references/native-library-substitution.json +56905 -56905
- package/skills/native-library-substitution/references/native-library-substitution.md +163 -163
- package/skills/preparing-migration-workspace/SKILL.md +131 -131
- package/skills/reviewing-migration-process/SKILL.md +62 -62
|
@@ -1,180 +1,180 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: android2hmos_resources_convert
|
|
3
|
-
description: >-
|
|
4
|
-
Android 图片资源迁移到 HarmonyOS:位图(png/jpg/webp/gif/bmp)、nine-patch(.9.png)、mipmap 启动图标、
|
|
5
|
-
自适应图标(adaptive-icon → layered_image.json)以及 XML drawable(vector/shape/layer-list/selector → SVG)。
|
|
6
|
-
当用户要求把 Android 项目的图标、图片、drawable 资产迁移/转换到鸿蒙工程(res/ → resources/…/media/),
|
|
7
|
-
处理限定符目录映射(drawable-hdpi、drawable-night、mipmap-anydpi-v26 等),或修复迁移后图片在鸿蒙上
|
|
8
|
-
显示空白/错误时触发。即使只说「迁移图标」「图片没迁移」「矢量图转 SVG」也应触发。
|
|
9
|
-
不处理 values 资源(strings/colors/dimens 的迁移归 arkts-i18n)、布局、Lottie 和字体。
|
|
10
|
-
type: domain
|
|
11
|
-
domain: migration
|
|
12
|
-
tags: [migration, resources, android, images, svg, drawable]
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
# Android → HarmonyOS 图片资源转换
|
|
16
|
-
|
|
17
|
-
本 skill 只转换**图片类资源**:位图文件(png/jpg/webp/gif/bmp)、nine-patch 图片、启动图标(mipmap、自适应图标),
|
|
18
|
-
以及作为图片渲染的 XML drawable(`<vector>`、`<shape>`、`<layer-list>`、`<selector>`)→ SVG。
|
|
19
|
-
values 资源(strings/colors/dimens 的迁移)、布局、Lottie、字体明确不在范围内;`values*/colors.xml` 和
|
|
20
|
-
`values*/dimens.xml` 只作为解析 drawable 内 `@color:`/`@dimen:` 引用的查找来源被读取。
|
|
21
|
-
|
|
22
|
-
## 参考文档
|
|
23
|
-
|
|
24
|
-
| 要做什么 | 读什么 |
|
|
25
|
-
|---|---|
|
|
26
|
-
| 拷贝/转换位图、nine-patch、mipmap、自适应图标;限定符目录映射 | `references/image-conversion-rules.md` |
|
|
27
|
-
| Android XML Drawable(vector/shape/layer-list/selector)转 SVG | `references/xml-drawable-to-svg-rules.md` |
|
|
28
|
-
| 修复 SVG 显示问题(空白/不可见/尺寸错误/残留 Android 语法) | `references/svg-fix-patterns.md` |
|
|
29
|
-
|
|
30
|
-
## 输入与统一领域结果
|
|
31
|
-
|
|
32
|
-
1. **Android 工程路径** — Android Gradle 工程根目录(含 `build.gradle` 或 `build.gradle.kts`)。
|
|
33
|
-
2. **HarmonyOS 工程路径** — 由 Preflight 创建或复用的工程(见 `preparing-migration-workspace`),通常是迁移工作区下的 `ohos/`,或 `.migration/config.json` 中 `--harmony-project` 配置的路径。图片写入 `<harmony>/entry/src/main/resources/`。本 skill 不创建工程壳;`ohos/` 尚不存在时由调用方先完成 Preflight。
|
|
34
|
-
|
|
35
|
-
始终返回统一领域结果:
|
|
36
|
-
|
|
37
|
-
```json
|
|
38
|
-
{
|
|
39
|
-
"status": "completed | partial | failed",
|
|
40
|
-
"changedFiles": [],
|
|
41
|
-
"sourceFiles": [],
|
|
42
|
-
"evidence": [],
|
|
43
|
-
"domainChecks": [],
|
|
44
|
-
"unresolved": [],
|
|
45
|
-
"verificationRequests": [],
|
|
46
|
-
"suggestedRemediation": [],
|
|
47
|
-
"details": {
|
|
48
|
-
"convertedResources": [],
|
|
49
|
-
"qualifierMappings": [],
|
|
50
|
-
"unmappedResources": [],
|
|
51
|
-
"unresolvedReferences": []
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
`status` 只表示图片资源转换和静态完整性检查的领域状态,不代表工程已构建、设备显示已验证或迁移已完成。`changedFiles`、`sourceFiles`、`unmappedResources` 和 `unresolvedReferences` 必须列出真实路径或资源标识。构建、设备显示和交互影响核对写入 `verificationRequests`,由调用方选择执行方式。
|
|
57
|
-
|
|
58
|
-
## 工作流
|
|
59
|
-
|
|
60
|
-
### 第 1 步:校验输入
|
|
61
|
-
|
|
62
|
-
1. 确认 Android 工程路径存在且含 `build.gradle` 或 `build.gradle.kts`。
|
|
63
|
-
2. 通过 `droid2hmos status <ANDROID_PROJECT>` 或 `.migration/config.json` 确认 HarmonyOS 工程位置,并确认 `entry/src/main/resources/` 存在;不存在时返回 `failed`,把缺少工程壳写入 `unresolved` 和 `suggestedRemediation`,不要猜测工程结构或自行调度 Preflight。
|
|
64
|
-
|
|
65
|
-
### 第 2 步:确定资源来源
|
|
66
|
-
|
|
67
|
-
使用工程源码 `res/` 目录:
|
|
68
|
-
|
|
69
|
-
- 首选 `<android_project>/app/src/main/res/`
|
|
70
|
-
- 多模块工程同时检查其它模块目录
|
|
71
|
-
- 使用 flavor source set 时一并纳入(如 `app/src/debug/res/`、`app/src/flavor/res/`)
|
|
72
|
-
|
|
73
|
-
恒定从源码 `res/` 转换:仅由库依赖(AAR)提供的图片不在源码 `res/` 中,这类引用在统一结果中记为 unresolved,不尝试回收。
|
|
74
|
-
|
|
75
|
-
### 第 3 步:清点与分类
|
|
76
|
-
|
|
77
|
-
扫描资源来源中的每个 `drawable*/` 和 `mipmap*/` 目录。对每个文件按**内容**分类(`.xml` 文件读根元素判断,绝不只按目录名分类):
|
|
78
|
-
|
|
79
|
-
| 分类 | 判定 | 路由 |
|
|
80
|
-
|---|---|---|
|
|
81
|
-
| 位图 | `.png`、`.jpg`、`.jpeg`、`.gif`、`.webp`、`.bmp` | 直接拷贝(第 4.1 步) |
|
|
82
|
-
| Nine-patch | `.9.png` | 拷贝 + 重命名(第 4.1 步) |
|
|
83
|
-
| XML drawable:vector/shape/layer-list | `.xml`,根 `<vector>` / `<shape>` / `<layer-list>` | 转 SVG(第 4.2 步) |
|
|
84
|
-
| XML drawable:selector | `.xml`,根 `<selector>` | 提取默认状态 → SVG(第 4.2 步) |
|
|
85
|
-
| 自适应图标 | `.xml`,根 `<adaptive-icon>` | 转 layered-image JSON(第 4.3 步) |
|
|
86
|
-
| ripple/animated-vector/animated-selector/transition/level-list 等 | `.xml`,对应根元素 | 不可映射 — 记入统一结果 |
|
|
87
|
-
|
|
88
|
-
忽略 `values*/`、`layout*/`、`menu/`、`raw/`、`font/`、`xml/`、`anim*/`、`color/` — 超出范围。只有 `values*/colors.xml` 和 `values*/dimens.xml` 被读取,用于解析 drawable 内的 `@color:`/`@dimen:` 引用(第 4.4 步)。
|
|
89
|
-
|
|
90
|
-
### 第 4 步:转换
|
|
91
|
-
|
|
92
|
-
转换前先读 `references/image-conversion-rules.md`。四条路由概要:
|
|
93
|
-
|
|
94
|
-
**4.1 位图与 nine-patch → `media/`**
|
|
95
|
-
- 拷贝到限定符映射后的 `media/` 目录(完整限定符算法见 image-conversion-rules.md)
|
|
96
|
-
- `.9.png` → 重命名为 `<name>_9.png`(HarmonyOS 禁止资源文件名中含 `.`,仅允许最后扩展名分隔符)。nine-patch 拉伸语义丢失 — 在统一结果中记录
|
|
97
|
-
|
|
98
|
-
**4.2 XML drawable → `media/` 中的 `.svg`**
|
|
99
|
-
- 严格按 `references/xml-drawable-to-svg-rules.md` 执行 — 尤其是强制保留 `clip-path`、三分支 `fill` 规则和渐变处理
|
|
100
|
-
- 每生成一个 SVG 后,执行该文档中的自检(clip-path 数量、fill 规则、viewBox 匹配)
|
|
101
|
-
|
|
102
|
-
**4.3 自适应图标 → layered-image JSON**
|
|
103
|
-
- `<adaptive-icon>` → `<name>_layered_image.json`,只含 `background`/`foreground` 键
|
|
104
|
-
- `@drawable/xxx`、`@mipmap/xxx` → `$media:xxx`;`@color/xxx` → 生成纯色 PNG(`<color_name>_bg.png`)— layered-image 不接受 `$color:` 引用
|
|
105
|
-
- `monochrome` 不写入 JSON,但其引用的 drawable 仍按普通图片转换
|
|
106
|
-
|
|
107
|
-
**4.4 解析 drawable 内引用**
|
|
108
|
-
- SVG 填充/描边中的 `@color/name` → 从 `values*/colors.xml` 解析(沿引用链;兜底 `#000000` + 记录)
|
|
109
|
-
- SVG 尺寸中的 `@dimen/name` → 从 `values*/dimens.xml` 解析(兜底:合理默认值 + 记录)
|
|
110
|
-
- 未解析引用(库专属资源不在源码 `res/`)记入统一结果,绝不静默丢弃
|
|
111
|
-
|
|
112
|
-
### 第 5 步:完整性校验
|
|
113
|
-
|
|
114
|
-
1. 第 3 步发现的每个文件都有且只有一个结局:已转换,或在统一结果中列为 unmappable/unmapped
|
|
115
|
-
2. 每个转换产物都实际存在于 HarmonyOS 工程
|
|
116
|
-
3. 生成的 layered-image JSON 中每个 `$media:xxx` 引用都指向 `media/` 中存在的文件
|
|
117
|
-
4. 每个转换后的 SVG 通过 `references/xml-drawable-to-svg-rules.md` 的自检
|
|
118
|
-
5. HarmonyOS 工程已有 `.ets` 文件时,扫描 `$r('app.media.xxx')` 并核对每个引用的图片存在(已有 media 文件**不覆盖** — 合并,冲突记录)
|
|
119
|
-
|
|
120
|
-
### 第 6 步:组装领域结果
|
|
121
|
-
|
|
122
|
-
把转换清单和静态校验结果写入统一领域结果;如需可读审计附件,可生成以下结构并把路径列入 `evidence`:
|
|
123
|
-
|
|
124
|
-
```
|
|
125
|
-
# Android to HarmonyOS Image Conversion Report
|
|
126
|
-
|
|
127
|
-
## Resource Source
|
|
128
|
-
- Resource source: source res/ (library-only images not included)
|
|
129
|
-
- Resource source path: <path>
|
|
130
|
-
|
|
131
|
-
## Summary
|
|
132
|
-
- Image files found (bitmap/9-patch/XML drawable/adaptive icon): <count per class>
|
|
133
|
-
- Successfully converted: <count>
|
|
134
|
-
- Unmappable (ripple/animated-vector/etc.): <count>
|
|
135
|
-
- Unmapped (unsupported qualifiers): <count>
|
|
136
|
-
- Unresolved color/dimen references: <count>
|
|
137
|
-
|
|
138
|
-
## Converted Images
|
|
139
|
-
| Android Source | HarmonyOS Target | Type | Notes |
|
|
140
|
-
|---|---|---|---|
|
|
141
|
-
|
|
142
|
-
## Qualifier Mappings Applied
|
|
143
|
-
| Android Qualifier Dir | HarmonyOS Qualifier Dir | Files Converted |
|
|
144
|
-
|---|---|---|---|
|
|
145
|
-
|
|
146
|
-
## Unmappable Resources
|
|
147
|
-
| Android Source | Reason |
|
|
148
|
-
|---|---|
|
|
149
|
-
|
|
150
|
-
## Unresolved References
|
|
151
|
-
| Resource File | Reference | Reason | Likely Source |
|
|
152
|
-
|---|---|---|---|
|
|
153
|
-
|
|
154
|
-
## Verification Results
|
|
155
|
-
- All image files accounted for: Yes/No
|
|
156
|
-
- All $media references satisfied: Yes/No
|
|
157
|
-
- SVG self-checks passed: Yes/No
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
影响行为的结论(不可映射资源、丢失的 nine-patch 语义、未解析引用)必须进入 `unresolved`,并标明 `blocking`、来源、用户影响和建议补救。需要回流报告 ref 或 discoveries 的项通过结果交给调用方,本 skill 不直接更新迁移报告。
|
|
161
|
-
|
|
162
|
-
转换完成后,将实际生成或修改的 HarmonyOS 资源写入 `changedFiles`,把对应 Android 源资源写入 `sourceFiles`;不要只返回计数。静态校验写入 `domainChecks`,待构建和设备核对写入 `verificationRequests`。
|
|
163
|
-
|
|
164
|
-
## 重要说明
|
|
165
|
-
|
|
166
|
-
- **XML drawable 转换是关键**:vector/shape/layer-list/selector 必须转成 SVG,不能跳过。转换前务必读 `references/xml-drawable-to-svg-rules.md` — 其中的属性映射表就是规范。
|
|
167
|
-
- **SVG 渲染问题**(空白、不可见、尺寸错误、残留 `android:` 语法)按 `references/svg-fix-patterns.md` 处理,不做临时猜测。
|
|
168
|
-
- **限定符目录是映射,不是保留**:`drawable-hdpi` → `ldpi/media/`(两平台 DPI 标签不同);`night` → `dark`;`land` → `horizontal`;`v<N>` 剥离;`sw<N>dp`/`w<N>dp`/屏幕尺寸限定符整目录跳过。完整算法见 `references/image-conversion-rules.md`。
|
|
169
|
-
- **转换恒定从源码 `res/` 出发**:仅库依赖(AAR)提供的图片不在其中;对它们的引用按 unresolved 报告,不做恢复。
|
|
170
|
-
- 资源名保持 Android 原拼写 — 它们是标识符。
|
|
171
|
-
- 解析 Android XML 时正确处理命名空间、注释和 CDATA;按 local name 匹配属性。
|
|
172
|
-
- 本 skill 不更新迁移报告、不暂存或提交文件、不创建 checkpoint、不调用 `complete`,也不选择仓库级构建、测试或设备命令。调用方消费统一领域结果并决定外层动作。
|
|
173
|
-
|
|
174
|
-
## 与其他 skill 的关系
|
|
175
|
-
|
|
176
|
-
- **preparing-migration-workspace**:⭐ 前置依赖。本 skill 需要 Preflight 已创建或复用的 HarmonyOS 工程(`ohos/`)。
|
|
177
|
-
- **arkts-app-identity**:它处理 App 级身份资源(app.json5 图标字段、版本号、包名);本 skill 负责 res/ 全量图片资产进 `media/`。启动器图标的位图/分层资产由本 skill 转换,app.json5 的接线归它。
|
|
178
|
-
- **arkts-icon-sizing**:图片资产就位后,它修 `.ets` 消费侧丢失的 `.width()/.height()`;本 skill 只管资源侧。
|
|
179
|
-
- **arkts-i18n**:values 资源(string.json 等)的迁移归它;本 skill 只把 colors.xml/dimens.xml 当查找源。
|
|
180
|
-
- **maintaining-migration-report**:调用方可把本 skill 返回的行为影响项、源码和证据映射到报告分片;本 skill 不直接写报告。
|
|
1
|
+
---
|
|
2
|
+
name: android2hmos_resources_convert
|
|
3
|
+
description: >-
|
|
4
|
+
Android 图片资源迁移到 HarmonyOS:位图(png/jpg/webp/gif/bmp)、nine-patch(.9.png)、mipmap 启动图标、
|
|
5
|
+
自适应图标(adaptive-icon → layered_image.json)以及 XML drawable(vector/shape/layer-list/selector → SVG)。
|
|
6
|
+
当用户要求把 Android 项目的图标、图片、drawable 资产迁移/转换到鸿蒙工程(res/ → resources/…/media/),
|
|
7
|
+
处理限定符目录映射(drawable-hdpi、drawable-night、mipmap-anydpi-v26 等),或修复迁移后图片在鸿蒙上
|
|
8
|
+
显示空白/错误时触发。即使只说「迁移图标」「图片没迁移」「矢量图转 SVG」也应触发。
|
|
9
|
+
不处理 values 资源(strings/colors/dimens 的迁移归 arkts-i18n)、布局、Lottie 和字体。
|
|
10
|
+
type: domain
|
|
11
|
+
domain: migration
|
|
12
|
+
tags: [migration, resources, android, images, svg, drawable]
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Android → HarmonyOS 图片资源转换
|
|
16
|
+
|
|
17
|
+
本 skill 只转换**图片类资源**:位图文件(png/jpg/webp/gif/bmp)、nine-patch 图片、启动图标(mipmap、自适应图标),
|
|
18
|
+
以及作为图片渲染的 XML drawable(`<vector>`、`<shape>`、`<layer-list>`、`<selector>`)→ SVG。
|
|
19
|
+
values 资源(strings/colors/dimens 的迁移)、布局、Lottie、字体明确不在范围内;`values*/colors.xml` 和
|
|
20
|
+
`values*/dimens.xml` 只作为解析 drawable 内 `@color:`/`@dimen:` 引用的查找来源被读取。
|
|
21
|
+
|
|
22
|
+
## 参考文档
|
|
23
|
+
|
|
24
|
+
| 要做什么 | 读什么 |
|
|
25
|
+
|---|---|
|
|
26
|
+
| 拷贝/转换位图、nine-patch、mipmap、自适应图标;限定符目录映射 | `references/image-conversion-rules.md` |
|
|
27
|
+
| Android XML Drawable(vector/shape/layer-list/selector)转 SVG | `references/xml-drawable-to-svg-rules.md` |
|
|
28
|
+
| 修复 SVG 显示问题(空白/不可见/尺寸错误/残留 Android 语法) | `references/svg-fix-patterns.md` |
|
|
29
|
+
|
|
30
|
+
## 输入与统一领域结果
|
|
31
|
+
|
|
32
|
+
1. **Android 工程路径** — Android Gradle 工程根目录(含 `build.gradle` 或 `build.gradle.kts`)。
|
|
33
|
+
2. **HarmonyOS 工程路径** — 由 Preflight 创建或复用的工程(见 `preparing-migration-workspace`),通常是迁移工作区下的 `ohos/`,或 `.migration/config.json` 中 `--harmony-project` 配置的路径。图片写入 `<harmony>/entry/src/main/resources/`。本 skill 不创建工程壳;`ohos/` 尚不存在时由调用方先完成 Preflight。
|
|
34
|
+
|
|
35
|
+
始终返回统一领域结果:
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"status": "completed | partial | failed",
|
|
40
|
+
"changedFiles": [],
|
|
41
|
+
"sourceFiles": [],
|
|
42
|
+
"evidence": [],
|
|
43
|
+
"domainChecks": [],
|
|
44
|
+
"unresolved": [],
|
|
45
|
+
"verificationRequests": [],
|
|
46
|
+
"suggestedRemediation": [],
|
|
47
|
+
"details": {
|
|
48
|
+
"convertedResources": [],
|
|
49
|
+
"qualifierMappings": [],
|
|
50
|
+
"unmappedResources": [],
|
|
51
|
+
"unresolvedReferences": []
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
`status` 只表示图片资源转换和静态完整性检查的领域状态,不代表工程已构建、设备显示已验证或迁移已完成。`changedFiles`、`sourceFiles`、`unmappedResources` 和 `unresolvedReferences` 必须列出真实路径或资源标识。构建、设备显示和交互影响核对写入 `verificationRequests`,由调用方选择执行方式。
|
|
57
|
+
|
|
58
|
+
## 工作流
|
|
59
|
+
|
|
60
|
+
### 第 1 步:校验输入
|
|
61
|
+
|
|
62
|
+
1. 确认 Android 工程路径存在且含 `build.gradle` 或 `build.gradle.kts`。
|
|
63
|
+
2. 通过 `droid2hmos status <ANDROID_PROJECT>` 或 `.migration/config.json` 确认 HarmonyOS 工程位置,并确认 `entry/src/main/resources/` 存在;不存在时返回 `failed`,把缺少工程壳写入 `unresolved` 和 `suggestedRemediation`,不要猜测工程结构或自行调度 Preflight。
|
|
64
|
+
|
|
65
|
+
### 第 2 步:确定资源来源
|
|
66
|
+
|
|
67
|
+
使用工程源码 `res/` 目录:
|
|
68
|
+
|
|
69
|
+
- 首选 `<android_project>/app/src/main/res/`
|
|
70
|
+
- 多模块工程同时检查其它模块目录
|
|
71
|
+
- 使用 flavor source set 时一并纳入(如 `app/src/debug/res/`、`app/src/flavor/res/`)
|
|
72
|
+
|
|
73
|
+
恒定从源码 `res/` 转换:仅由库依赖(AAR)提供的图片不在源码 `res/` 中,这类引用在统一结果中记为 unresolved,不尝试回收。
|
|
74
|
+
|
|
75
|
+
### 第 3 步:清点与分类
|
|
76
|
+
|
|
77
|
+
扫描资源来源中的每个 `drawable*/` 和 `mipmap*/` 目录。对每个文件按**内容**分类(`.xml` 文件读根元素判断,绝不只按目录名分类):
|
|
78
|
+
|
|
79
|
+
| 分类 | 判定 | 路由 |
|
|
80
|
+
|---|---|---|
|
|
81
|
+
| 位图 | `.png`、`.jpg`、`.jpeg`、`.gif`、`.webp`、`.bmp` | 直接拷贝(第 4.1 步) |
|
|
82
|
+
| Nine-patch | `.9.png` | 拷贝 + 重命名(第 4.1 步) |
|
|
83
|
+
| XML drawable:vector/shape/layer-list | `.xml`,根 `<vector>` / `<shape>` / `<layer-list>` | 转 SVG(第 4.2 步) |
|
|
84
|
+
| XML drawable:selector | `.xml`,根 `<selector>` | 提取默认状态 → SVG(第 4.2 步) |
|
|
85
|
+
| 自适应图标 | `.xml`,根 `<adaptive-icon>` | 转 layered-image JSON(第 4.3 步) |
|
|
86
|
+
| ripple/animated-vector/animated-selector/transition/level-list 等 | `.xml`,对应根元素 | 不可映射 — 记入统一结果 |
|
|
87
|
+
|
|
88
|
+
忽略 `values*/`、`layout*/`、`menu/`、`raw/`、`font/`、`xml/`、`anim*/`、`color/` — 超出范围。只有 `values*/colors.xml` 和 `values*/dimens.xml` 被读取,用于解析 drawable 内的 `@color:`/`@dimen:` 引用(第 4.4 步)。
|
|
89
|
+
|
|
90
|
+
### 第 4 步:转换
|
|
91
|
+
|
|
92
|
+
转换前先读 `references/image-conversion-rules.md`。四条路由概要:
|
|
93
|
+
|
|
94
|
+
**4.1 位图与 nine-patch → `media/`**
|
|
95
|
+
- 拷贝到限定符映射后的 `media/` 目录(完整限定符算法见 image-conversion-rules.md)
|
|
96
|
+
- `.9.png` → 重命名为 `<name>_9.png`(HarmonyOS 禁止资源文件名中含 `.`,仅允许最后扩展名分隔符)。nine-patch 拉伸语义丢失 — 在统一结果中记录
|
|
97
|
+
|
|
98
|
+
**4.2 XML drawable → `media/` 中的 `.svg`**
|
|
99
|
+
- 严格按 `references/xml-drawable-to-svg-rules.md` 执行 — 尤其是强制保留 `clip-path`、三分支 `fill` 规则和渐变处理
|
|
100
|
+
- 每生成一个 SVG 后,执行该文档中的自检(clip-path 数量、fill 规则、viewBox 匹配)
|
|
101
|
+
|
|
102
|
+
**4.3 自适应图标 → layered-image JSON**
|
|
103
|
+
- `<adaptive-icon>` → `<name>_layered_image.json`,只含 `background`/`foreground` 键
|
|
104
|
+
- `@drawable/xxx`、`@mipmap/xxx` → `$media:xxx`;`@color/xxx` → 生成纯色 PNG(`<color_name>_bg.png`)— layered-image 不接受 `$color:` 引用
|
|
105
|
+
- `monochrome` 不写入 JSON,但其引用的 drawable 仍按普通图片转换
|
|
106
|
+
|
|
107
|
+
**4.4 解析 drawable 内引用**
|
|
108
|
+
- SVG 填充/描边中的 `@color/name` → 从 `values*/colors.xml` 解析(沿引用链;兜底 `#000000` + 记录)
|
|
109
|
+
- SVG 尺寸中的 `@dimen/name` → 从 `values*/dimens.xml` 解析(兜底:合理默认值 + 记录)
|
|
110
|
+
- 未解析引用(库专属资源不在源码 `res/`)记入统一结果,绝不静默丢弃
|
|
111
|
+
|
|
112
|
+
### 第 5 步:完整性校验
|
|
113
|
+
|
|
114
|
+
1. 第 3 步发现的每个文件都有且只有一个结局:已转换,或在统一结果中列为 unmappable/unmapped
|
|
115
|
+
2. 每个转换产物都实际存在于 HarmonyOS 工程
|
|
116
|
+
3. 生成的 layered-image JSON 中每个 `$media:xxx` 引用都指向 `media/` 中存在的文件
|
|
117
|
+
4. 每个转换后的 SVG 通过 `references/xml-drawable-to-svg-rules.md` 的自检
|
|
118
|
+
5. HarmonyOS 工程已有 `.ets` 文件时,扫描 `$r('app.media.xxx')` 并核对每个引用的图片存在(已有 media 文件**不覆盖** — 合并,冲突记录)
|
|
119
|
+
|
|
120
|
+
### 第 6 步:组装领域结果
|
|
121
|
+
|
|
122
|
+
把转换清单和静态校验结果写入统一领域结果;如需可读审计附件,可生成以下结构并把路径列入 `evidence`:
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
# Android to HarmonyOS Image Conversion Report
|
|
126
|
+
|
|
127
|
+
## Resource Source
|
|
128
|
+
- Resource source: source res/ (library-only images not included)
|
|
129
|
+
- Resource source path: <path>
|
|
130
|
+
|
|
131
|
+
## Summary
|
|
132
|
+
- Image files found (bitmap/9-patch/XML drawable/adaptive icon): <count per class>
|
|
133
|
+
- Successfully converted: <count>
|
|
134
|
+
- Unmappable (ripple/animated-vector/etc.): <count>
|
|
135
|
+
- Unmapped (unsupported qualifiers): <count>
|
|
136
|
+
- Unresolved color/dimen references: <count>
|
|
137
|
+
|
|
138
|
+
## Converted Images
|
|
139
|
+
| Android Source | HarmonyOS Target | Type | Notes |
|
|
140
|
+
|---|---|---|---|
|
|
141
|
+
|
|
142
|
+
## Qualifier Mappings Applied
|
|
143
|
+
| Android Qualifier Dir | HarmonyOS Qualifier Dir | Files Converted |
|
|
144
|
+
|---|---|---|---|
|
|
145
|
+
|
|
146
|
+
## Unmappable Resources
|
|
147
|
+
| Android Source | Reason |
|
|
148
|
+
|---|---|
|
|
149
|
+
|
|
150
|
+
## Unresolved References
|
|
151
|
+
| Resource File | Reference | Reason | Likely Source |
|
|
152
|
+
|---|---|---|---|
|
|
153
|
+
|
|
154
|
+
## Verification Results
|
|
155
|
+
- All image files accounted for: Yes/No
|
|
156
|
+
- All $media references satisfied: Yes/No
|
|
157
|
+
- SVG self-checks passed: Yes/No
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
影响行为的结论(不可映射资源、丢失的 nine-patch 语义、未解析引用)必须进入 `unresolved`,并标明 `blocking`、来源、用户影响和建议补救。需要回流报告 ref 或 discoveries 的项通过结果交给调用方,本 skill 不直接更新迁移报告。
|
|
161
|
+
|
|
162
|
+
转换完成后,将实际生成或修改的 HarmonyOS 资源写入 `changedFiles`,把对应 Android 源资源写入 `sourceFiles`;不要只返回计数。静态校验写入 `domainChecks`,待构建和设备核对写入 `verificationRequests`。
|
|
163
|
+
|
|
164
|
+
## 重要说明
|
|
165
|
+
|
|
166
|
+
- **XML drawable 转换是关键**:vector/shape/layer-list/selector 必须转成 SVG,不能跳过。转换前务必读 `references/xml-drawable-to-svg-rules.md` — 其中的属性映射表就是规范。
|
|
167
|
+
- **SVG 渲染问题**(空白、不可见、尺寸错误、残留 `android:` 语法)按 `references/svg-fix-patterns.md` 处理,不做临时猜测。
|
|
168
|
+
- **限定符目录是映射,不是保留**:`drawable-hdpi` → `ldpi/media/`(两平台 DPI 标签不同);`night` → `dark`;`land` → `horizontal`;`v<N>` 剥离;`sw<N>dp`/`w<N>dp`/屏幕尺寸限定符整目录跳过。完整算法见 `references/image-conversion-rules.md`。
|
|
169
|
+
- **转换恒定从源码 `res/` 出发**:仅库依赖(AAR)提供的图片不在其中;对它们的引用按 unresolved 报告,不做恢复。
|
|
170
|
+
- 资源名保持 Android 原拼写 — 它们是标识符。
|
|
171
|
+
- 解析 Android XML 时正确处理命名空间、注释和 CDATA;按 local name 匹配属性。
|
|
172
|
+
- 本 skill 不更新迁移报告、不暂存或提交文件、不创建 checkpoint、不调用 `complete`,也不选择仓库级构建、测试或设备命令。调用方消费统一领域结果并决定外层动作。
|
|
173
|
+
|
|
174
|
+
## 与其他 skill 的关系
|
|
175
|
+
|
|
176
|
+
- **preparing-migration-workspace**:⭐ 前置依赖。本 skill 需要 Preflight 已创建或复用的 HarmonyOS 工程(`ohos/`)。
|
|
177
|
+
- **arkts-app-identity**:它处理 App 级身份资源(app.json5 图标字段、版本号、包名);本 skill 负责 res/ 全量图片资产进 `media/`。启动器图标的位图/分层资产由本 skill 转换,app.json5 的接线归它。
|
|
178
|
+
- **arkts-icon-sizing**:图片资产就位后,它修 `.ets` 消费侧丢失的 `.width()/.height()`;本 skill 只管资源侧。
|
|
179
|
+
- **arkts-i18n**:values 资源(string.json 等)的迁移归它;本 skill 只把 colors.xml/dimens.xml 当查找源。
|
|
180
|
+
- **maintaining-migration-report**:调用方可把本 skill 返回的行为影响项、源码和证据映射到报告分片;本 skill 不直接写报告。
|