1# 系统服务管理部件<a name="ZH-CN_TOPIC_0000001162068341"></a>
2## 简介<a name="section11660541593"></a>
3
4samgr组件是OpenHarmony的核心组件,提供OpenHarmony系统服务启动、注册、查询等功能。
5
6## 系统架构<a name="section342962219551"></a>
7
8**图 1**  系统服务管理系统架构图
9
10
11![](figures/zh-cn_image_0000001115820566.png)
12
13## 目录<a name="section161941989596"></a>
14
15```
16/foundation/systemabilitymgr
17├── samgr
18│   ├── bundle.json  # 部件描述及编译文件
19│   ├── frameworks   # 框架实现存在目录
20│   ├── interfaces   # 接口目录
21│   ├── services     # 组件服务端目录
22│   ├── test         # 测试代码存放目录
23│   ├── utils        # 工具类目录
24```
25
26## 说明<a name="section1312121216216"></a>
27
281.  samgr服务接收到sa框架层发送的注册消息,会在本地缓存中存入系统服务相关信息。
29
30    ```
31    int32_t SystemAbilityManager::AddSystemAbility(int32_t systemAbilityId, const sptr<IRemoteObject>& ability,
32        const SAExtraProp& extraProp)
33    {
34        if (!CheckInputSysAbilityId(systemAbilityId) || ability == nullptr) {
35            HILOGE("AddSystemAbilityExtra input params is invalid.");
36            return ERR_INVALID_VALUE;
37        }
38        {
39            unique_lock<shared_mutex> writeLock(abilityMapLock_);
40            auto saSize = abilityMap_.size();
41            if (saSize >= MAX_SERVICES) {
42                HILOGE("map size error, (Has been greater than %zu)", saSize);
43                return ERR_INVALID_VALUE;
44            }
45            SAInfo saInfo;
46            saInfo.remoteObj = ability;
47            saInfo.isDistributed = extraProp.isDistributed;
48            saInfo.capability = extraProp.capability;
49            saInfo.permission = Str16ToStr8(extraProp.permission);
50            abilityMap_[systemAbilityId] = std::move(saInfo);
51            HILOGI("insert %{public}d. size : %{public}zu", systemAbilityId, abilityMap_.size());
52        }
53        RemoveCheckLoadedMsg(systemAbilityId);
54        if (abilityDeath_ != nullptr) {
55            ability->AddDeathRecipient(abilityDeath_);
56        }
57
58        u16string strName = Str8ToStr16(to_string(systemAbilityId));
59        if (extraProp.isDistributed && dBinderService_ != nullptr) {
60            dBinderService_->RegisterRemoteProxy(strName, systemAbilityId);
61            HILOGD("AddSystemAbility RegisterRemoteProxy, serviceId is %{public}d", systemAbilityId);
62        }
63        if (systemAbilityId == SOFTBUS_SERVER_SA_ID && !isDbinderStart_) {
64            if (dBinderService_ != nullptr && rpcCallbackImp_ != nullptr) {
65                bool ret = dBinderService_->StartDBinderService(rpcCallbackImp_);
66                HILOGI("start result is %{public}s", ret ? "succeed" : "fail");
67                isDbinderStart_ = true;
68            }
69        }
70        SendSystemAbilityAddedMsg(systemAbilityId, ability);
71        return ERR_OK;
72    }
73    ```
74
752.  对于本地服务而言,samgr服务接收到sa框架层发送的获取消息,会通过服务id,查找到对应服务的代理对象,然后返回给sa框架。
76
77    ```
78    sptr<IRemoteObject> SystemAbilityManager::CheckSystemAbility(int32_t systemAbilityId)
79    {
80        if (!CheckInputSysAbilityId(systemAbilityId)) {
81            HILOGW("CheckSystemAbility CheckSystemAbility invalid!");
82            return nullptr;
83        }
84
85        shared_lock<shared_mutex> readLock(abilityMapLock_);
86        auto iter = abilityMap_.find(systemAbilityId);
87        if (iter != abilityMap_.end()) {
88            HILOGI("found service : %{public}d.", systemAbilityId);
89            return iter->second.remoteObj;
90        }
91        HILOGI("NOT found service : %{public}d", systemAbilityId);
92        return nullptr;
93    }
94    ```
95
963. 动态加载系统服务进程及SystemAbility, 系统进程无需开机启动,而是在SystemAbility被访问的时候按需拉起,并加载指定SystemAbility。
97    3.1 继承SystemAbilityLoadCallbackStub类,并覆写OnLoadSystemAbilitySuccess(int32_t systemAbilityId, const sptr<IRemoteObject>& remoteObject)、OnLoadSystemAbilityFail(int32_t systemAbilityId)方法。
98
99    ```
100    class OnDemandLoadCallback : public SystemAbilityLoadCallbackStub {
101    public:
102        void OnLoadSystemAbilitySuccess(int32_t systemAbilityId, const sptr<IRemoteObject>& remoteObject) override;
103        void OnLoadSystemAbilityFail(int32_t systemAbilityId) override;
104    };
105
106    void OnDemandLoadCallback::OnLoadSystemAbilitySuccess(int32_t systemAbilityId,
107        const sptr<IRemoteObject>& remoteObject) // systemAbilityId为指定加载的SAID,remoteObject为指定systemAbility的代理对象
108    {
109        cout << "OnLoadSystemAbilitySuccess systemAbilityId:" << systemAbilityId << " IRemoteObject result:" <<
110            ((remoteObject != nullptr) ? "succeed" : "failed") << endl;
111    }
112
113    void OnDemandLoadCallback::OnLoadSystemAbilityFail(int32_t systemAbilityId) // systemAbilityId为指定加载的SAID
114    {
115        cout << "OnLoadSystemAbilityFail systemAbilityId:" << systemAbilityId << endl;
116    }
117    ```
118
119    3.2 调用samgr提供的动态加载接口LoadSystemAbility(int32_t systemAbilityId, const sptr<ISystemAbilityLoadCallback>& callback)。
120    ```
121    // 构造步骤1的SystemAbilityLoadCallbackStub子类的实例
122    sptr<OnDemandLoadCallback> loadCallback_ = new OnDemandLoadCallback();
123    // 调用LoadSystemAbility方法
124    sptr<ISystemAbilityManager> sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
125    if (sm == nullptr) {
126        cout << "GetSystemAbilityManager samgr object null!" << endl;
127        return;
128    }
129    int32_t result = sm->LoadSystemAbility(systemAbilityId, loadCallback_);
130    if (result != ERR_OK) {
131        cout << "systemAbilityId:" << systemAbilityId << " load failed, result code:" << result << endl;
132        return;
133    }
134    ```
135>说明:
136>1.LoadSystemAbility方法调用成功后,指定SystemAbility加载成功后会触发回调OnLoadSystemAbilitySuccess,加载失败触发回调OnLoadSystemAbilityFail。
137>2.动态加载的进程cfg文件不能配置为开机启动,需指定"ondemand" : true, 示例如下:
138>```
139>{
140>   "services" : [{
141>           "name" : "listen_test",
142>           "path" : ["/system/bin/sa_main", "/system/profile/listen_test.json"],
143>           "ondemand" : true,
144>           "uid" : "system",
145>           "gid" : ["system", "shell"]
146>       }
147>   ]
148>}
149>```
150>3.LoadSystemAbility方法适用于动态加载场景,其他获取SystemAbility场景建议使用CheckSystemAbility方法。
151>4.cfg里进程名称需要与SA的配置json文件里进程名保持一致
152
153## 相关仓<a name="section1371113476307"></a>
154
155系统服务管理子系统
156
157[systemabilitymgr\_safwk](https://gitee.com/openharmony/systemabilitymgr_safwk)
158
159[**systemabilitymgr\_samgr**](https://gitee.com/openharmony/systemabilitymgr_samgr)
160
161[systemabilitymgr\_safwk\_lite](https://gitee.com/openharmony/systemabilitymgr_safwk_lite)
162
163[systemabilitymgr\_samgr\_lite](https://gitee.com/openharmony/systemabilitymgr_samgr_lite)
164
165