Android → HarmonyOS 资源转换 Agent
将 Android 项目的资源文件自动转换为 HarmonyOS 项目资源格式的智能 Agent。
功能概述
本 Agent 完整覆盖 Android 到 HarmonyOS 的资源迁移流程,包括:
- 初始化 HarmonyOS 项目(模板复制或目录骨架生成)
- 多来源资源发现(源码目录、构建产物、多 flavor)
- 按资源类型分类转换(图片、XML drawable、values、raw、font 等)
- 资源依赖关系分析(含 layout/menu 文件的引用追踪)
- 通过 APK 反编译补全库依赖资源
- 完整性验证
- 生成详细的 Markdown 转换报告
当前状态(POC 框架):Step 1、Step 2、Step 7 已完整实现;Step 3~Step 6 的函数签名和文档已定义,具体逻辑待实现。
目录结构
agent_a2h_resources_convert/
├── main.py # CLI 入口 + 七步流程编排器
├── models.py # 共享数据模型(AgentState、ResourceItem 等)
├── llm_client.py # OpenAI 兼容 API 封装(XML→SVG、adaptive-icon 转换)
├── step1_init.py # Step 1:初始化 HarmonyOS 项目结构
├── step2_discover.py # Step 2:发现并清点 Android 资源
├── step3_convert.py # Step 3:资源格式转换(Stub)
├── step4_deps.py # Step 4:资源依赖分析(Stub)
├── step5_resolve.py # Step 5:APK 反编译补全缺失依赖(Stub)
├── step6_verify.py # Step 6:完整性验证(Stub)
├── step7_report.py # Step 7:生成 Markdown 转换报告
├── tools/
│ └── apktool_3.0.1.jar # 用于 APK 反编译(Step 5)
└── README.md
环境要求
- Python 3.8+
- Java(用于 Step 5 的 apktool 调用,需在系统 PATH 中)
- OpenAI 兼容 API Key(用于 XML drawable → SVG 等需要 LLM 推理的转换)
无第三方 Python 依赖,仅使用标准库。
快速开始
基本用法
python main.py <android_项目路径> <HarmonyOS_输出路径>
完整参数示例
python main.py \
/path/to/MyAndroidApp \
/path/to/MyHarmonyApp \
--template /path/to/HarmonyAppTemplate \
--api-key sk-xxxxxxxx \
--api-base-url https://api.openai.com/v1 \
--model gpt-4o \
--log-level INFO
参数说明
| 参数 | 默认值 | 说明 |
|---|---|---|
android_path |
(必填) | Android 项目根目录(含 app/src/main/res/) |
hmos_output_path |
(必填) | HarmonyOS 项目输出路径 |
--template |
D:\cc_workspace\HarmonyAppTemplate |
HarmonyOS 项目模板目录 |
--api-key |
$OPENAI_API_KEY 环境变量 |
LLM API Key |
--api-base-url |
https://api.openai.com/v1 |
OpenAI 兼容 API 地址 |
--model |
gpt-4o |
使用的 LLM 模型名称 |
--log-level |
INFO |
日志级别:DEBUG / INFO / WARNING / ERROR |
也可以通过环境变量传入 API Key:
export OPENAI_API_KEY=sk-xxxxxxxx
python main.py /path/to/android /path/to/hmos
七步转换流程
Step 1 初始化 HarmonyOS 项目
└─ 复制模板 或 创建标准目录骨架
(AppScope/, entry/src/main/resources/, hvigor/ ...)
Step 2 发现 Android 资源
├─ app/src/main/res/ ← 主资源(最高优先级)
├─ app/src/debug|release|<flavor>/res/ ← 额外 source set
└─ app/build/intermediates/merged_res/ ← 构建产物(补充库资源)
Step 3 转换资源
├─ 图片 (png/jpg/webp/gif) → base/media/ 直接复制
├─ VectorDrawable XML → base/media/*.svg [LLM]
├─ shape / layer-list XML → base/media/*.svg [LLM]
├─ selector XML → base/media/*.svg [LLM]
├─ adaptive-icon XML → base/media/*_layered_image.json
├─ values/strings.xml → base/element/string.json
├─ values/colors.xml → base/element/color.json
├─ values/dimens.xml → base/element/float.json
├─ raw/ → rawfile/
├─ font/ → rawfile/fonts/
├─ xml/ → base/profile/
└─ layout / menu / anim ... → 标记为 Unmappable(记录报告)
Step 4 依赖分析
├─ Category A:已转换资源中的 @type/name 引用
└─ Category B:layout/menu 文件中的 @type/name 引用(重建 ArkUI 时所需)
Step 5 APK 反编译补全(仅在存在未满足依赖时执行)
├─ ./gradlew <variant> 构建 APK
├─ apktool d <apk> 反编译
└─ 从反编译产物中提取缺失资源,支持最多 2 级传递依赖解析
Step 6 完整性验证
├─ 所有资源均有处理结果
├─ 已转换目标文件在磁盘上存在
├─ values/ 条目均写入对应 JSON
├─ Category A 依赖全部满足
└─ Category B 依赖全部满足
Step 7 生成报告
└─ <hmos_output_path>/conversion_report.md
输出报告结构
报告文件为 conversion_report.md,包含以下章节:
- Summary — 资源总数、转换数、未映射数、依赖满足情况
- Successfully Converted Resources — 成功转换的资源列表
- Qualifier Mappings Applied — Android → HarmonyOS 限定符目录映射
- Resource Dependency Map — Category A(已转换资源)和 Category B(layout/menu)的依赖关系表
- Resources Recovered from APK — 通过 APK 反编译补全的资源
- Unmappable Resources — 无 HarmonyOS 等价物的资源(layout、anim 等)
- Unmapped Resources (Unsupported Qualifiers) — 因不支持的限定符(如
sw600dp)被跳过的资源 - Unsatisfied Dependencies — Step 5 后仍未满足的依赖
- Failed Conversions — 转换过程中发生错误的资源
- Verification Results — Step 6 各项检查的通过情况
资源类型映射速查
| Android 资源目录 | HarmonyOS 目标 | 转换方式 |
|---|---|---|
drawable/ (png/jpg/webp) |
base/media/ |
直接复制 |
drawable/ (<vector>) |
base/media/*.svg |
LLM 转换 |
drawable/ (<shape>) |
base/media/*.svg |
LLM 转换 |
drawable/ (<layer-list>) |
base/media/*.svg |
LLM 转换 |
drawable/ (<selector>) |
base/media/*.svg |
提取默认状态,LLM 转换 |
mipmap/ (png/webp) |
base/media/ |
直接复制 |
mipmap/ (<adaptive-icon>) |
base/media/*_layered_image.json |
JSON 转换 |
values/strings.xml |
base/element/string.json |
XML → JSON |
values/colors.xml |
base/element/color.json |
XML → JSON,颜色格式补全 |
values/dimens.xml |
base/element/float.json |
XML → JSON,单位转换(dp→vp,sp→fp) |
raw/ |
rawfile/ |
直接复制 |
font/ |
rawfile/fonts/ |
直接复制 |
xml/ |
base/profile/ |
配置文件复制 |
layout/、menu/、anim/ |
— | 标记 Unmappable |
DPI 限定符映射
| Android | HarmonyOS |
|---|---|
ldpi |
sdpi |
mdpi |
mdpi |
hdpi |
ldpi |
xhdpi |
xldpi |
xxhdpi |
xxldpi |
xxxhdpi |
xxxldpi |
nodpi / anydpi |
base |
核心数据模型
AgentState 贯穿七步的中央状态对象
├── resource_inventory List[ResourceItem] Step 2 产出
├── conversion_results List[ConversionResult] Step 3 产出
├── qualifier_mappings List[QualifierMapping] Step 3 产出
├── dependency_map List[DependencyInfo] Step 4 产出
├── recovered_resources List[RecoveredResource] Step 5 产出
├── verification_result VerificationResult Step 6 产出
└── report_path str Step 7 产出
DependencyInfo.category
├── CONVERTED Category A:已转换资源的依赖(缺失会导致 HarmonyOS 运行时错误)
└── LAYOUT_MENU Category B:layout/menu 文件的依赖(重建 ArkUI 时所需)
LLM 调用说明
以下转换操作需要 LLM 推理,通过 llm_client.py 以 OpenAI Chat Completions 格式发起调用:
| 转换场景 | 调用接口 |
|---|---|
| VectorDrawable / shape / layer-list / selector → SVG | LLMClient.convert_xml_drawable_to_svg() |
| adaptive-icon XML → layered-image JSON | LLMClient.build_layered_image_json() |
--api-base-url 支持任何 OpenAI 兼容后端(Azure OpenAI、本地代理等),替换地址即可。
开发说明
实现 Stub 函数
Step 3~Step 6 的函数均已定义签名和完整 docstring,按以下顺序实现即可:
step3_convert.py— 从convert_color_value/convert_dimension_value/convert_string_value等基础工具函数开始,再实现map_qualifier_dir,最后实现各资源类型的 converterstep4_deps.py— 实现extract_dependencies(基于已定义的_REF_PATTERN),再实现check_dependency_satisfactionstep5_resolve.py— 实现build_apk→decompile_apk→extract_missing_from_apk→resolve_transitive_dependenciesstep6_verify.py— 五个独立的 verify 函数,orchestrator 已完成聚合逻辑
参考文档
详细转换规则请参阅 SKILL.md 同级的 references/ 目录:
references/conversion-rules.md— 完整资源类型转换规则references/xml-drawable-to-svg-rules.md— XML drawable → SVG 详细规则references/dependency-analysis-rules.md— 依赖提取模式和引用格式