# oh_ability_lite_debug
**Repository Path**: baiduowang/oh_ability_lite_debug
## Basic Information
- **Project Name**: oh_ability_lite_debug
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-10-19
- **Last Updated**: 2025-11-09
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 基于 CLion 的 OpenHarmony `ability_ability_lite` 完整调试工程(Windows 版)
提供 **可直接导入 CLion 并编译调试** 的完整工程,包含 `ability_ability_lite` 核心源码、Windows 模拟层(替代 LiteOS 内核)、JerryScript 模拟依赖及测试入口,解决所有跨平台适配问题(如 `jerry_length_t` 未定义、LiteOS 接口缺失等)。
## 一、工程结构
先在本地创建如下目录(建议路径:`D:\oh_ability_lite_debug`),后续所有文件按此结构放置:
```
oh_ability_lite_debug/
├─ main.c # 1. 调试入口层
├─ app_list.txt # 调试入口层:应用配置
├─ CMakeLists.txt # 工程编译配置
├─ ability_ability_lite/ # 2. 核心业务层
│ ├─ lite_ams/
│ │ ├─ lite_ams.c
│ │ └─ lite_ams.h
│ ├─ slite_ability_loader/
│ │ ├─ slite_ability_loader.c
│ │ └─ slite_ability_loader.h
│ └─ js_ability_thread/
│ ├─ js_ability_thread.cpp
│ └─ js_ability_thread.h
├─ kernel_liteos_m/ # 3. kernel_liteos_m 适配层
│ └─ include/
│ ├─ los_typedef.h
│ └─ los_task.h
├─ sim_adapter/ # 4. 模拟适配层
│ └─ los_task_adapter.c
└─ 3rd_party/ # 5. 基础依赖层
└─ jerryscript/
├─ include/
│ └─ jerryscript.h # 简化版JS引擎头文件
├─ lib/
│ └─ libjerry.a # JerryScript 模拟静态库(MinGW 版)
└─ src/
└─ jerry_impl.c # 上述实现文件
```
参考鸿蒙开源仓代码: https://gitee.com/openharmony/ability_ability_lite
## 二、工程架构总览
本项目采用**五层分层架构**,在 Windows 系统的 CLion 中构建 OpenHarmony ability_ability_lite 的调试环境。核心设计思路是通过“底层模拟真实环境、上层保留核心逻辑”,实现跨平台适配与高效调试,各层自上而下依赖,职责边界清晰,整体架构如下:
```
┌─────────────────────────────────────────────────────────────┐
│ 1. 调试入口层(第五层) │
│ main.c + CMakeLists.txt + app_list.txt │
├─────────────────────────────────────────────────────────────┤
│ 2. 核心业务层(第四层) │
│ lite_ams + slite_ability_loader + js_ability_thread │
├─────────────────────────────────────────────────────────────┤
│ 3. kernel_liteos_m 适配层(第三层) │
│ 抽象原生 LiteOS-M 接口(task/sem/mutex),无具体实现 │
├─────────────────────────────────────────────────────────────┤
│ 4. 模拟适配层(第二层) │
│ Windows 环境下的 LiteOS-M 接口实现(los_task_adapter等) │
├─────────────────────────────────────────────────────────────┤
│ 5. 基础依赖层(第一层) │
│ jerryscript(静态库+头文件) + Windows API 依赖 │
└─────────────────────────────────────────────────────────────┘
```
### 架构核心逻辑(后序需要更新)
1. 基础模拟层与第三方依赖层共同构成“模拟运行环境”,替代真实设备的 LiteOS 内核与 JerryScript 引擎,解决 Windows 与 OpenHarmony 底层环境的兼容性问题。
2. 核心业务层直接复用 OpenHarmony ability_ability_lite 源码,不修改核心逻辑,仅通过“接口映射”调用模拟层能力,确保调试结果与真实设备一致。
3. 调试入口层为 CLion 提供编译配置与测试触发点,支持一键导入、编译、调试,降低开发门槛。
## 三、分层架构详情与组件说明
按从底层到上层的顺序,详细说明各层的核心组件、功能及关键文件作用。
### 1. 基础模拟层(第一层):模拟 LiteOS 内核环境
#### 层定位
替代真实设备中的 LiteOS 内核,提供核心内核接口的 Windows 兼容实现,让上层核心源码无需修改即可调用“内核级接口”。
#### 核心组件与文件说明
| 文件名 | 所在路径 | 核心功能 |
|--------|----------|----------|
| liteos_win_sim.c | sim_layer/ | 1. 实现 LiteOS 核心接口的模拟逻辑,如线程创建(SIM_LOS_ThreadCreate)、信号量操作(SIM_sem_wait)、互斥锁(SIM_mutex_lock);
2. 适配 Windows 线程模型(如使用 CreateThread 实现线程创建),确保线程调度逻辑与 LiteOS 行为一致。 |
| liteos_win_sim.h | sim_layer/ | 1. 声明模拟的 LiteOS 接口,与 LiteOS 原生头文件(los_thread.h、los_sem.h 等)接口名对齐(前缀加 SIM_ 区分);
2. 定义 Windows 环境下的适配数据类型(如用 HANDLE 替代 LiteOS 的线程 ID 类型)。 |
#### 依赖关系
- 无下层依赖,直接调用 Windows API(如 CreateThread、WaitForSingleObject)。
- 为上层核心业务层(如 js_ability_thread)提供线程、同步相关接口支持。
### 2. 第三方依赖层(第二层):模拟 JerryScript 引擎
#### 层定位
替代 OpenHarmony 中的 JerryScript 引擎(用于解析执行 JS 类型 Ability),提供引擎核心接口的模拟实现,解决跨平台编译时“依赖缺失”问题(如 jerry_length_t 未定义)。
#### 核心组件与文件说明
| 文件名 | 所在路径 | 核心功能 |
|--------|----------|----------|
| jerryscript.h | 3rd_party/jerryscript/include/jerryscript/ | 1. 声明 JerryScript 核心接口,如 JS 上下文创建(jerryx_context_create)、JS 值转换(jerry_value_to_string);
2. 定义模拟的数据类型(如 jerry_length_t 映射为 Windows 下的 size_t),避免编译报错。 |
| libjerry.a | 3rd_party/jerryscript/lib/ | 1. JerryScript 模拟接口的静态库(MinGW 编译),包含 jerryscript.h 中声明接口的实现逻辑;
2. 为上层 JS 能力模块(js_ability_thread)提供 JS 引擎调用支持,无需在 Windows 上编译完整 JerryScript 源码。 |
#### 依赖关系
- 无下层依赖,静态库直接编译为 Windows 兼容格式。
- 为上层核心业务层的 js_ability_thread 模块提供 JS 解析、执行相关接口支持。
### 3. 核心业务层(第三层):Ability 框架核心逻辑
#### 层定位
OpenHarmony ability_ability_lite 的核心源码,承载 Ability 的管理、加载、线程调度等核心业务逻辑,是调试的主要对象。
#### 核心组件与文件说明
##### (1)lite_ams:Ability 管理服务
| 文件名 | 所在路径 | 核心功能 |
|--------|----------|----------|
| lite_ams.c | ability/ability/lite/lite_ams/ | 1. 实现 Ability 的生命周期管理,包括启动(LiteAmsStartAbility)、销毁(LiteAmsTerminateAbility);
2. 维护 Ability 实例列表,记录当前运行的 Ability 状态(如前台/后台);
3. 协调 slite_ability_loader 完成 Ability 的加载与初始化。 |
| lite_ams.h | ability/ability/lite/lite_ams/ | 1. 声明 AMS 服务的核心接口(如 LiteAmsStartAbility);
2. 定义 Ability 状态枚举(如 LITE_ABILITY_STATE_FOREGROUND)、Ability 信息结构体(如 LiteAbilityInfo)。 |
##### (2)slite_ability_loader:Ability 加载器
| 文件名 | 所在路径 | 核心功能 |
|--------|----------|----------|
| slite_ability_loader.c | ability/ability/lite/slite_ability_loader/ | 1. 负责从配置(如 app_list.txt)中读取 Ability 信息,加载 Ability 实例;
2. 调用 JS 引擎接口(如 jerryx_context_create)初始化 JS 类型 Ability;
3. 为 AMS 提供 Ability 实例的创建与销毁支持。 |
| slite_ability_loader.h | ability/ability/lite/slite_ability_loader/ | 1. 声明 Ability 加载接口(如 SliteAbilityLoaderLoad);
2. 定义 Ability 加载配置结构体(如 SliteAbilityLoadInfo)。 |
##### (3)js_ability_thread:JS Ability 线程管理
| 文件名 | 所在路径 | 核心功能 |
|--------|----------|----------|
| js_ability_thread.cpp | ability/ability/lite/js_ability_thread/ | 1. 为 JS 类型 Ability 创建独立线程,避免阻塞主线程;
2. 调用基础模拟层的线程接口(SIM_LOS_ThreadCreate)创建线程,调度 JS 代码执行;
3. 处理 JS 线程的同步与销毁逻辑,确保线程安全。 |
| js_ability_thread.h | ability/ability/lite/js_ability_thread/ | 1. 声明 JS 线程管理接口(如 JsAbilityThreadCreate);
2. 定义 JS 线程上下文结构体(如 JsAbilityThreadCtx),存储线程 ID、JS 上下文等信息。 |
#### 依赖关系
- 依赖基础模拟层:调用 sim_layer 提供的线程、同步接口(如 SIM_LOS_ThreadCreate)。
- 依赖第三方依赖层:js_ability_thread 调用 jerryscript 提供的 JS 引擎接口。
- 为上层调试入口层提供 Ability 框架的核心调用入口(如 main.c 调用 LiteAmsStartAbility)。
### 4. 调试入口层(第四层):CLion 编译与测试入口
#### 层定位
为 CLion 提供工程配置、测试触发点与应用配置,支持一键导入编译、模拟设备启动流程,是调试的“入口与控制层”。
#### 核心组件与文件说明
| 文件名 | 所在路径 | 核心功能 |
|--------|----------|----------|
| main.c | 根目录 | 1. 模拟设备开机流程:初始化基础模拟层、第三方依赖层;
2. 模拟 Launcher 行为:调用 AMS 接口(LiteAmsStartAbility)触发 Ability 启动;
3. 提供调试断点入口,可在 Ability 启动、加载等关键流程处设置断点。 |
| CMakeLists.txt | 根目录 | 1. 定义 CLion 编译规则:指定源文件(如 lite_ams.c、js_ability_thread.cpp)、依赖库(如 libjerry.a);
2. 配置编译选项(如 -O0 -g3 开启调试符号),确保断点能命中核心代码;
3. 支持一键编译生成可执行文件,直接在 CLion 中启动调试。 |
| app_list.txt | 根目录 | 1. 替代真实设备中 Flash 存储的 app_list.cfg,配置待调试的应用与 Ability 信息;
2. 内容格式示例:`app_name=demo_ability;ability_name=DemoAbility`,供 slite_ability_loader 读取加载。 |
#### 依赖关系
- 依赖核心业务层:main.c 直接调用 lite_ams、slite_ability_loader 的核心接口。
- 依赖第三方依赖层与基础模拟层:CMakeLists.txt 配置 libjerry.a 与 sim_layer 源文件的编译依赖。
## 四、核心业务流程示例
以“JS 类型 Ability 启动”为例,说明各层协同工作流程,帮助理解架构逻辑:
1. **调试入口层触发**:main.c 调用 `LiteAmsStartAbility`(AMS 接口),传入待启动的 Ability 名称(从 app_list.txt 读取)。
2. **核心业务层调度**:
- lite_ams.c 接收请求,调用 `SliteAbilityLoaderLoad`(加载器接口),请求加载 Ability 实例。
- slite_ability_loader.c 读取 app_list.txt 配置,调用 JerryScript 接口(`jerryx_context_create`)初始化 JS 上下文,创建 Ability 实例。
3. **依赖层提供支持**:
- 第三方依赖层:libjerry.a 执行 JS 上下文初始化逻辑,返回有效上下文句柄。
- 基础模拟层:js_ability_thread.cpp 调用 `SIM_LOS_ThreadCreate`,创建独立线程用于执行 JS 代码。
4. **流程完成**:JS 线程启动,执行 Ability 的 onCreate、onStart 生命周期方法,调试者可在 CLion 中查看断点、跟踪流程。
## 五、JS Ability 启动流程时序图(含各层调用关系)
下面时序图基于项目四层架构,详细拆解“JS 类型 Ability 启动”的完整调用链路,标注了各层组件的交互顺序与核心接口,可直观理解从调试入口触发到 JS 代码执行的全流程。
```mermaid
sequenceDiagram
participant 调试入口层(main.c)
participant 核心业务层-AMS(lite_ams.c)
participant 核心业务层-加载器(slite_ability_loader.c)
participant 核心业务层-JS线程(js_ability_thread.cpp)
participant 第三方依赖层(jerryscript)
participant 基础模拟层(liteos_win_sim.c)
%% 1. 调试入口层触发启动请求
调试入口层(main.c)->>核心业务层-AMS(lite_ams.c): 调用 LiteAmsStartAbility()
Note over 调试入口层(main.c): 从 app_list.txt 读取
待启动Ability名称
%% 2. AMS 调度加载器加载Ability
核心业务层-AMS(lite_ams.c)->>核心业务层-加载器(slite_ability_loader.c): 调用 SliteAbilityLoaderLoad()
Note over 核心业务层-AMS(lite_ams.c): 检查Ability状态
协调加载流程
%% 3. 加载器读取配置并初始化JS环境
核心业务层-加载器(slite_ability_loader.c)->>核心业务层-加载器(slite_ability_loader.c): 读取 app_list.txt 配置
核心业务层-加载器(slite_ability_loader.c)->>第三方依赖层(jerryscript): 调用 jerryx_context_create()
第三方依赖层(jerryscript)-->>核心业务层-加载器(slite_ability_loader.c): 返回 JS 上下文句柄
Note over 第三方依赖层(jerryscript): 模拟JS引擎初始化
创建独立上下文
%% 4. 加载器请求创建JS线程
核心业务层-加载器(slite_ability_loader.c)->>核心业务层-JS线程(js_ability_thread.cpp): 调用 JsAbilityThreadCreate()
Note over 核心业务层-加载器(slite_ability_loader.c): 传入JS上下文句柄
请求独立线程执行JS
%% 5. JS线程模块调用模拟层创建线程
核心业务层-JS线程(js_ability_thread.cpp)->>基础模拟层(liteos_win_sim.c): 调用 SIM_LOS_ThreadCreate()
基础模拟层(liteos_win_sim.c)->>基础模拟层(liteos_win_sim.c): 调用 Windows API CreateThread()
基础模拟层(liteos_win_sim.c)-->>核心业务层-JS线程(js_ability_thread.cpp): 返回模拟线程ID
Note over 基础模拟层(liteos_win_sim.c): 适配Windows线程模型
封装LiteOS接口格式
%% 6. JS线程执行Ability生命周期
核心业务层-JS线程(js_ability_thread.cpp)->>第三方依赖层(jerryscript): 调用 jerry_eval() 执行JS代码
第三方依赖层(jerryscript)-->>核心业务层-JS线程(js_ability_thread.cpp): 返回JS代码执行结果
核心业务层-JS线程(js_ability_thread.cpp)->>核心业务层-AMS(lite_ams.c): 回调 OnAbilityStarted() 通知启动完成
Note over 核心业务层-JS线程(js_ability_thread.cpp): 执行Ability的onCreate/onStart
生命周期方法
```
### 时序图核心说明
1. **分层调用逻辑**:流程严格遵循“上层调用下层”规则,调试入口层仅调用核心业务层,核心业务层按需调用依赖层,无跨层直接调用(如 main.c 不直接调用 jerryscript),确保架构分层清晰。
2. **依赖层价值体现**:第三方依赖层(jerryscript)解决 JS 引擎适配问题,基础模拟层(liteos_win_sim)解决内核接口适配问题,二者共同支撑核心业务层在 Windows 环境运行。
3. **调试关键节点**:时序图中标记的接口(如 `LiteAmsStartAbility`、`SIM_LOS_ThreadCreate`、`jerry_eval`)均为调试高频断点位置,可在 CLion 中针对这些接口设置断点,跟踪 Ability 启动全流程。
```
sequenceDiagram
participant 调试入口层(main.c)
participant 核心业务层-AMS(lite_ams.c)
participant 核心业务层-加载器(slite_ability_loader.c)
participant 核心业务层-JS线程(js_ability_thread.c)
participant 第三方依赖层(jerryscript: libjerry.a)
participant 基础模拟层(liteos_win_sim.c)
%% 1. 工程启动:初始化基础环境与JS引擎
调试入口层(main.c)->>基础模拟层(liteos_win_sim.c): 调用 SIM_LiteOS_Init()
基础模拟层(liteos_win_sim.c)-->>调试入口层(main.c): 返回LOS_OK
调试入口层(main.c)->>核心业务层-JS线程(js_ability_thread.c): 调用 JsAbilityEngineInit()
核心业务层-JS线程(js_ability_thread.c)->>第三方依赖层(jerryscript): 调用 jerry_init(JERRY_INIT_EMPTY)
第三方依赖层(jerryscript)-->>核心业务层-JS线程(js_ability_thread.c): 返回引擎初始化结果
Note over 核心业务层-JS线程(js_ability_thread.c): 源码中通过jerry_init初始化JS引擎,为后续执行做准备
%% 2. 触发Ability启动:AMS调度加载
调试入口层(main.c)->>核心业务层-AMS(lite_ams.c): 调用 LiteAmsStartAbility("DemoAbility")
核心业务层-AMS(lite_ams.c)->>核心业务层-加载器(slite_ability_loader.c): 调用 SliteAbilityLoaderLoad()
核心业务层-加载器(slite_ability_loader.c)-->>核心业务层-AMS(lite_ams.c): 返回SliteAbility实例
核心业务层-AMS(lite_ams.c)->>核心业务层-JS线程(js_ability_thread.c): 调用 JsAbilityThreadCreate(实例)
%% 3. 创建JS线程:初始化同步资源
核心业务层-JS线程(js_ability_thread.c)->>基础模拟层(liteos_win_sim.c): 调用 SIM_sem_init()
基础模拟层(liteos_win_sim.c)-->>核心业务层-JS线程(js_ability_thread.c): 返回信号量初始化结果
核心业务层-JS线程(js_ability_thread.c)->>基础模拟层(liteos_win_sim.c): 调用 SIM_LOS_ThreadCreate(JsAbilityThreadMain)
基础模拟层(liteos_win_sim.c)-->>核心业务层-JS线程(js_ability_thread.c): 返回模拟线程ID
%% 4. 线程执行:注册JS回调+执行代码(源码核心逻辑)
核心业务层-JS线程(js_ability_thread.c)->>核心业务层-JS线程(js_ability_thread.c): 执行JsAbilityThreadMain()
核心业务层-JS线程(js_ability_thread.c)->>第三方依赖层(jerryscript): 调用 jerryx_handler_register()
Note over 核心业务层-JS线程(js_ability_thread.c): 源码中注册JS回调(如Ability生命周期回调),关联C层逻辑
第三方依赖层(jerryscript)-->>核心业务层-JS线程(js_ability_thread.c): 返回回调注册结果
核心业务层-JS线程(js_ability_thread.c)->>核心业务层-JS线程(js_ability_thread.c): 读取JS文件(如main.js)
核心业务层-JS线程(js_ability_thread.c)->>第三方依赖层(jerryscript): 调用 jerry_eval(js_code, len, JERRY_PARSE_NO_OPTS)
Note over 核心业务层-JS线程(js_ability_thread.c): 源码中通过jerry_eval执行JS代码,是JS能力核心执行步骤
第三方依赖层(jerryscript)-->>核心业务层-JS线程(js_ability_thread.c): 返回js_value_t执行结果
%% 5. 执行结果处理:通知AMS启动完成
核心业务层-JS线程(js_ability_thread.c)->>核心业务层-AMS(lite_ams.c): 调用 OnAbilityStarted()
核心业务层-AMS(lite_ams.c)-->>调试入口层(main.c): 返回Ability启动成功
```