模块概述
SAMGR(System Ability Manager)是OpenHarmony系统服务管理的核心组件,负责系统服务的注册、查询、启动、停止等生命周期管理。该模块位于foundation/systemabilitymgr/samgr
目录下,是系统服务框架的基础支撑模块。
核心特性
- 统一服务管理: 集中管理所有系统服务(SystemAbility)
- 动态加载: 支持按需启动系统服务进程
- 分布式支持: 支持跨设备服务发现和调用
- 权限控制: 基于能力模型的权限验证机制
- 故障恢复: 服务死亡通知和自动重启机制
- 性能监控: 内置DFX(Design for X)监控能力
系统定位
在OpenHarmony架构中,SAMGR作为系统服务的中枢神经,连接着:
- 上层应用: 通过SystemAbilityManagerClient访问系统服务
- 系统服务: 各类SystemAbility的宿主进程
- 内核服务: 通过IPC与底层驱动交互
- 分布式能力: 通过dBinder实现跨设备服务调用
架构设计
核心组件架构
/foundation/systemabilitymgr/samgr/
├── interfaces/ # 接口定义层
│ └── innerkits/samgr_proxy/include/
│ ├── if_system_ability_manager.h # 系统能力管理器接口定义
│ └── iservice_registry.h # 服务注册接口定义
├── services/ # 服务实现层
│ └── samgr/native/
│ ├── source/
│ │ ├── system_ability_manager.cpp # 系统能力管理器核心实现
│ │ ├── service_registry.cpp # 服务注册实现
│ │ ├── main.cpp # 服务启动入口
│ │ └── ability_death_recipient.cpp # 能力死亡通知处理
│ └── include/ # 头文件
├── test/ # 测试代码
├── utils/ # 工具类
└── README_zh.md # 中文说明文档
核心类关系图
┌─────────────────────┐ ┌─────────────────────┐
│ SystemAbilityManager │ │ SystemAbilityManagerClient │
│ (服务端实现) │ │ (客户端代理) │
├─────────────────────┤ ├─────────────────────┤
│ - AddSystemAbility() │ │ - GetInstance() │
│ - CheckSystemAbility()│ │ - GetSystemAbilityManager()│
│ - RemoveSystemAbility()│ │ - DestroySystemAbilityManagerObject()│
│ - SubscribeSystemAbility()│ └─────────────────────┘
│ - LoadSystemAbility() │
└─────────────────────┘
│
│ IPC通信
│
┌─────────────────────┐
│ ISystemAbilityManager │
│ (接口定义) │
└─────────────────────┘
进程间通信架构
SAMGR通过Binder机制实现进程间通信,架构如下:
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 客户端进程 │ │ SAMGR进程 │ │ 服务进程 │
│ │ │ │ │ │
│ ┌─────────────┐ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │
│ │SystemAbility│ │ │ │SystemAbility│ │ │ │SystemAbility│ │
│ │ManagerClient│ │◄──►│ │ Manager │ │◄──►│ │ 实现类 │ │
│ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │
│ │ │ │ │ │
│ BinderProxy │ │ BinderStub │ │ BinderNative │
└─────────────────┘ └─────────────────┘ └─────────────────┘
分层架构详解
1. 应用层(Application Layer)
- SystemAbilityManagerClient: 单例模式,提供静态访问接口
- API接口: 封装底层IPC调用,提供简洁的API
2. 框架层(Framework Layer)
- SystemAbilityManager: 核心服务管理器实现
- ServiceRegistry: 服务注册中心
- OnDemandPolicy: 按需加载策略管理
3. IPC层(IPC Layer)
- IServiceRegistry: 服务注册接口
- ISystemAbilityManager: 系统能力管理接口
- Binder机制: 跨进程通信实现
4. 系统服务层(System Service Layer)
- 各类SystemAbility: 具体系统服务实现
- 死亡通知机制: 服务状态监控
- 权限验证: 基于能力模型的安全检查
核心功能实现
1. 系统服务注册机制
源码位置
- 实现文件:
foundation/systemabilitymgr/samgr/services/samgr/native/source/system_ability_manager.cpp
- 接口定义:
foundation/systemabilitymgr/interfaces/innerkits/samgr_proxy/include/if_system_ability_manager.h
注册流程详解
// 系统服务注册核心方法
int32_t SystemAbilityManager::AddSystemAbility(
int32_t systemAbilityId,
const sptr<IRemoteObject>& ability,
const SAExtraProp& extraProp)
{
// 1. 参数校验
if (!CheckInputSysAbilityId(systemAbilityId) || ability == nullptr) {
HILOGW("AddSystemAbility saId %{public}d failed, invalid input", systemAbilityId);
return ERR_INVALID_VALUE;
}
// 2. 容量检查
{
unique_lock<shared_mutex> writeLock(abilityMapLock_);
if (abilityMap_.size() >= MAX_SERVICES) {
HILOGE("AddSystemAbility failed, reach max capacity");
return ERR_INVALID_VALUE;
}
// 3. 构建SA信息
SAInfo saInfo;
saInfo.remoteObj = ability;
saInfo.isDistributed = extraProp.isDistributed;
saInfo.capability = Str16ToStr8(extraProp.capability);
saInfo.permission = Str16ToStr8(extraProp.permission);
// 4. 添加到能力映射表
abilityMap_[systemAbilityId] = std::move(saInfo);
}
// 5. 死亡通知注册
if (abilityDeath_ != nullptr) {
ability->AddDeathRecipient(abilityDeath_);
}
// 6. 分布式注册
if (extraProp.isDistributed && dBinderService_ != nullptr) {
std::string strName = std::to_string(systemAbilityId);
dBinderService_->RegisterRemoteProxy(strName, systemAbilityId);
}
// 7. 发送添加通知
SendSystemAbilityAddedMsg(systemAbilityId, ability);
// 8. 触发DFX监控
DfxAddSystemAbility(systemAbilityId);
return ERR_OK;
}
参数验证机制
bool SystemAbilityManager::CheckInputSysAbilityId(int32_t systemAbilityId)
{
// 有效SAID范围检查
if (systemAbilityId < FIRST_SYS_ABILITY_ID ||
systemAbilityId >= MAX_SYS_ABILITY_ID) {
return false;
}
// 保留SAID检查
if (IsReservedSystemAbilityId(systemAbilityId)) {
return false;
}
return true;
}