小语种网站建设,越秀区手机版网站建设,现代农业园网站建设方案,wordpress处理大数据简介
samgr组件是OpenHarmony的核心组件#xff0c;提供OpenHarmony系统服务启动、注册、查询等功能。
系统架构
图 1 系统服务管理系统架构图 目录
/foundation/systemabilitymgr
├── samgr
│ ├── bundle.json # 部件描述及编译文件
│ ├── frameworks …简介
samgr组件是OpenHarmony的核心组件提供OpenHarmony系统服务启动、注册、查询等功能。
系统架构
图 1 系统服务管理系统架构图 目录
/foundation/systemabilitymgr
├── samgr
│ ├── bundle.json # 部件描述及编译文件
│ ├── frameworks # 框架实现存在目录
│ ├── interfaces # 接口目录
│ ├── services # 组件服务端目录
│ ├── test # 测试代码存放目录
│ ├── utils # 工具类目录说明 samgr服务接收到sa框架层发送的注册消息会在本地缓存中存入系统服务相关信息。 int32_t SystemAbilityManager::AddSystemAbility(int32_t systemAbilityId, const sptrIRemoteObject ability,const SAExtraProp extraProp)
{if (!CheckInputSysAbilityId(systemAbilityId) || ability nullptr) {HILOGE(AddSystemAbilityExtra input params is invalid.);return ERR_INVALID_VALUE;}{unique_lockshared_mutex writeLock(abilityMapLock_);auto saSize abilityMap_.size();if (saSize MAX_SERVICES) {HILOGE(map size error, (Has been greater than %zu), saSize);return ERR_INVALID_VALUE;}SAInfo saInfo;saInfo.remoteObj ability;saInfo.isDistributed extraProp.isDistributed;saInfo.capability extraProp.capability;saInfo.permission Str16ToStr8(extraProp.permission);abilityMap_[systemAbilityId] std::move(saInfo);HILOGI(insert %{public}d. size : %{public}zu, systemAbilityId, abilityMap_.size());}RemoveCheckLoadedMsg(systemAbilityId);if (abilityDeath_ ! nullptr) {ability-AddDeathRecipient(abilityDeath_);}u16string strName Str8ToStr16(to_string(systemAbilityId));if (extraProp.isDistributed dBinderService_ ! nullptr) {dBinderService_-RegisterRemoteProxy(strName, systemAbilityId);HILOGD(AddSystemAbility RegisterRemoteProxy, serviceId is %{public}d, systemAbilityId);}if (systemAbilityId SOFTBUS_SERVER_SA_ID !isDbinderStart_) {if (dBinderService_ ! nullptr rpcCallbackImp_ ! nullptr) {bool ret dBinderService_-StartDBinderService(rpcCallbackImp_);HILOGI(start result is %{public}s, ret ? succeed : fail);isDbinderStart_ true;}}SendSystemAbilityAddedMsg(systemAbilityId, ability);return ERR_OK;
}对于本地服务而言samgr服务接收到sa框架层发送的获取消息会通过服务id查找到对应服务的代理对象然后返回给sa框架。 sptrIRemoteObject SystemAbilityManager::CheckSystemAbility(int32_t systemAbilityId)
{if (!CheckInputSysAbilityId(systemAbilityId)) {HILOGW(CheckSystemAbility CheckSystemAbility invalid!);return nullptr;}shared_lockshared_mutex readLock(abilityMapLock_);auto iter abilityMap_.find(systemAbilityId);if (iter ! abilityMap_.end()) {HILOGI(found service : %{public}d., systemAbilityId);return iter-second.remoteObj;}HILOGI(NOT found service : %{public}d, systemAbilityId);return nullptr;
}动态加载系统服务进程及SystemAbility, 系统进程无需开机启动而是在SystemAbility被访问的时候按需拉起并加载指定SystemAbility。 3.1 继承SystemAbilityLoadCallbackStub类并覆写OnLoadSystemAbilitySuccess(int32_t systemAbilityId, const sptr remoteObject)、OnLoadSystemAbilityFail(int32_t systemAbilityId)方法。 class OnDemandLoadCallback : public SystemAbilityLoadCallbackStub {
public:void OnLoadSystemAbilitySuccess(int32_t systemAbilityId, const sptrIRemoteObject remoteObject) override;void OnLoadSystemAbilityFail(int32_t systemAbilityId) override;
};void OnDemandLoadCallback::OnLoadSystemAbilitySuccess(int32_t systemAbilityId,const sptrIRemoteObject remoteObject) // systemAbilityId为指定加载的SAIDremoteObject为指定systemAbility的代理对象
{cout OnLoadSystemAbilitySuccess systemAbilityId: systemAbilityId IRemoteObject result: ((remoteObject ! nullptr) ? succeed : failed) endl;
}void OnDemandLoadCallback::OnLoadSystemAbilityFail(int32_t systemAbilityId) // systemAbilityId为指定加载的SAID
{cout OnLoadSystemAbilityFail systemAbilityId: systemAbilityId endl;
}3.2 调用samgr提供的动态加载接口LoadSystemAbility(int32_t systemAbilityId, const sptr callback)。 // 构造步骤1的SystemAbilityLoadCallbackStub子类的实例
sptrOnDemandLoadCallback loadCallback_ new OnDemandLoadCallback();
// 调用LoadSystemAbility方法
sptrISystemAbilityManager sm SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
if (sm nullptr) {cout GetSystemAbilityManager samgr object null! endl;return;
}
int32_t result sm-LoadSystemAbility(systemAbilityId, loadCallback_);
if (result ! ERR_OK) {cout systemAbilityId: systemAbilityId load failed, result code: result endl;return;
}说明 1.LoadSystemAbility方法调用成功后指定SystemAbility加载成功后会触发回调OnLoadSystemAbilitySuccess加载失败触发回调OnLoadSystemAbilityFail。 2.动态加载的进程cfg文件不能配置为开机启动需指定ondemand : true, 示例如下: {services : [{name : listen_test,path : [/system/bin/sa_main, /system/profile/listen_test.json],ondemand : true,uid : system,gid : [system, shell]} ]}3.LoadSystemAbility方法适用于动态加载场景其他获取SystemAbility场景建议使用CheckSystemAbility方法。 4.cfg里进程名称需要与SA的配置json文件里进程名保持一致
更多鸿蒙知识已经更新qr23.cn/AKFP8k可以前往了解