Files
ability_ability_runtime/tools/test
openharmony_ci 45658770a9 !18760 merge aa_start into master
aa start: add multi-user support

Created-by: Luobniz21
Commit-by: Luobniz21
Merged-by: openharmony_ci
Description: **IssueNo**:

**Description**:

**稳定性自检:**
| 自检项                                                       | 自检结果  |
| ------------------------------------------------------------ | -------- |
| 涉及跨进程调用的相关操作需要抛至主线程或加锁防止并发              |    √      |
| 成员变量进行赋值或创建需要排查并发                               |   √       |
| 谨慎在lambda表达式中使用引用捕获                                |    √      |
| 谨慎在未经拷贝的情况下使用外部传入的string、C字符串               |      √    |
| map\vector\list\set等stl模板类使用时需要排查并发                |    √      |
| 谨慎考虑加锁范围                                               |   √       |
| 在IPC通信中谨慎使用同步通信方式                                 |   √       |
| 禁止传递this指针至其他模块或线程(特别是eventhandler任务)        |  √        |
| 禁止将外部传入的裸指针在内部直接构造智能指针                      |   √       |
| 禁止多个独立创建的智能指针管理同一地址                           |    √      |
| 禁止在析构函数中抛异步任务                                      |      √    |
| 禁止js对象在非js线程(例如在IPC线程)创建、使用或销毁             |   √       |
| 禁止在对外接口中未经判空直接使用外部传入的指针                    |    √      |
| 禁止接口返回局部变量引用                                        |     √     |
| 禁止在信号函数中加锁                                            |     √     |
| 禁止在关键流程(SA启动、应用启动等主流程)执行耗时的操作           |   √       |
| 禁止将同一个cpp编译在不同的so中                                 |    √      |

**安全编码自检:**
| 自检项                                                          | 自检结果 |
| -------------------------------------------------------------- | -------- |
| 裸指针避免通过隐式转换构造为sptr                                 |     √     |
| json对象在取值之前必须先判断类型,避免类型不匹配                   |    √      |
| 序列化时必须对传入的数组大小进行校验,避免出现超大数组              |      √    |
| 避免使用未明确位宽的整型,选择使用int8_t、uint8_t等类型            |  √        |
| 外部传入的路径要做规范化校验,对路径中的.、..、../等特殊字符严格校验 |     √     |
| 指针变量、表示资源描述符的变量、bool变量必须赋初值                  |     √     |
| readParcelable获取的对象使用前需要判空                            |     √     |
| 分配和释放内存的函数需要成对出现                                   |     √     |
| 申请内存后异常退出前需要及时进行内存释放                            |       √   |
| 内存申请前必须对内存大小进行合法性校验                              |   √       |
| 内存分配后必须判断是否成功                                         |      √    |
| 禁止使用realloc、alloca函数                                       |     √     |
| 禁止打印文件路径、口令等敏感信息,如有需要,使用private修饰          |    √      |
| 禁止打印内存地址                                                  |       √   |
| 整数之间运算时必须严格检查,确保不会出现溢出、反转、除0               |      √    |
| 禁止对有符号整数进行位操作符运算                                    |   √       |
| 禁止对指针进行逻辑或位运算                                         |       √   |
| 循环次数如果收外部数据控制,需要检验其合法性                         |    √      |
| 禁止使用内存操作类危险函数,需要使用安全函数                         |   √       |
| 谨慎使用不可重入函数                                               |     √     |
| 必须检查安全函数的返回值,并进行正确处理                             |    √      |
| 禁止仅通过TokenType类型判断绕过权限校验                             |     √     |

**TDD Result**:
![image.png](https://raw.gitcode.com/user-images/assets/4421702/eb0f58dd-875b-44b6-a4d2-f46d38ed470a/image.png 'image.png')
**XTS Result**:

### 是否已执行L0用例
- [x] 已验证
- [ ] 不涉及。如不涉及,请写明理由



1. 添加命令行选项支持                                                                                                                                                                                                                                          
  
  - SHORT_OPTIONS: 添加了 u: 选项(需要参数)
  - LONG_OPTIONS: 添加了 {"userId", required_argument, nullptr, 'u'}

  2. 修改核心函数

  RunAsStartAbility 函数 (ability_command.cpp:447-484):
  - 添加了 int32_t userId = DEFAULT_INVAL_VALUE 变量
  - 将 userId 传递给 StartAbility 方法

  MakeWantFromCmd 函数 (ability_command.cpp:1620-2186):
  - 添加了带 int32_t& userId 参数的版本
  - 保留了不带 userId 参数的重载版本,保持向后兼容
  - 在 switch 语句中添加了 case 'u' 处理,解析用户 ID

  StartAbilityWithWait 函数 (ability_command.cpp:2586-2610):
  - 添加了 int32_t userId 参数
  - 对于隐式启动,将 userId 传递给 StartAbility
  - 对于显式启动,如果指定了 userId 则输出警告(因为 StartAbilityWithWait 接口本身不支持 userId)

  3. 更新头文件 (ability_command.h)

  - 更新了 MakeWantFromCmd 和 StartAbilityWithWait 的函数声明
  - 更新了帮助信息 HELP_MSG_START,添加了 -u <user-id> 和 --userId <user-id> 选项说明

  4. 添加错误处理

  - 在参数缺失处理中添加了对 -u 选项没有参数的情况处理

  使用方法

  现在可以使用以下命令启动指定用户的应用:

  使用短选项
  aa start -a <ability-name> -b <bundle-name> -u <user-id>

  使用长选项
  aa start -a <ability-name> -b <bundle-name> --userId <user-id>

  示例:为用户 100 启动应用
  aa start -a MainAbility -b com.example.app -u 100

  注意:-W (wait) 选项与 -u 选项同时使用时,userId 会被忽略(因为 StartAbilityWithWait 接口本身不支持 userId 参数)。
  
  问题1:传入无效值
  当用户输入 aa start -a MainAbility -b com.example.app u 101 时:

  1. aa 工具 (ability_command.cpp):
    - getopt_long 解析完 -a MainAbility -b com.example.app
    - 遇到 u(不带 -)→ 停止解析
    - u 101 被忽略
    - userId 保持为 DEFAULT_INVAL_VALUE(-1)
  2. 传递给服务端:
    - StartAbility(want, ..., userId=−1)
  3. 服务端 (ability_manager_service.cpp:693):
  if (userId == DEFAULT_INVAL_VALUE) {
      userId = GetValidUserId(userId);  // 返回当前用户ID(通常是100)
  }
  4. 结果:
    - userId 被转换为当前用户(100)
    - 应用在用户 100 下启动

See merge request: openharmony/ability_ability_runtime!18760
2026-03-28 19:51:27 +08:00
..
2026-03-26 22:32:05 +08:00
2025-03-11 11:14:34 +08:00
2026-03-26 13:55:27 +08:00
2025-07-03 16:59:24 +08:00
2025-08-15 14:51:30 +08:00