当前位置: 首页 > article >正文

鸿蒙开发实战:【系统服务管理部件】

简介

samgr组件是OpenHarmony的核心组件,提供OpenHarmony系统服务启动、注册、查询等功能。

系统架构

图 1 系统服务管理系统架构图

目录

/foundation/systemabilitymgr
├── samgr
│   ├── bundle.json  # 部件描述及编译文件
│   ├── frameworks   # 框架实现存在目录
│   ├── interfaces   # 接口目录
│   ├── services     # 组件服务端目录
│   ├── test         # 测试代码存放目录
│   ├── utils        # 工具类目录

说明

  1. samgr服务接收到sa框架层发送的注册消息,会在本地缓存中存入系统服务相关信息。

    int32_t SystemAbilityManager::AddSystemAbility(int32_t systemAbilityId, const sptr<IRemoteObject>& ability,
        const SAExtraProp& extraProp)
    {
        if (!CheckInputSysAbilityId(systemAbilityId) || ability == nullptr) {
            HILOGE("AddSystemAbilityExtra input params is invalid.");
            return ERR_INVALID_VALUE;
        }
        {
            unique_lock<shared_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;
    }
    
  2. 对于本地服务而言,samgr服务接收到sa框架层发送的获取消息,会通过服务id,查找到对应服务的代理对象,然后返回给sa框架。

    sptr<IRemoteObject> SystemAbilityManager::CheckSystemAbility(int32_t systemAbilityId)
    {
        if (!CheckInputSysAbilityId(systemAbilityId)) {
            HILOGW("CheckSystemAbility CheckSystemAbility invalid!");
            return nullptr;
        }
    
        shared_lock<shared_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;
    }
    
  3. 动态加载系统服务进程及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 sptr<IRemoteObject>& remoteObject) override;
        void OnLoadSystemAbilityFail(int32_t systemAbilityId) override;
    };
    
    void OnDemandLoadCallback::OnLoadSystemAbilitySuccess(int32_t systemAbilityId,
        const sptr<IRemoteObject>& remoteObject) // systemAbilityId为指定加载的SAID,remoteObject为指定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子类的实例
    sptr<OnDemandLoadCallback> loadCallback_ = new OnDemandLoadCallback();
    // 调用LoadSystemAbility方法
    sptr<ISystemAbilityManager> 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可以前往了解

5a94ffa1b62d74e6095eff0d95d75612.gif


http://www.kler.cn/a/274644.html

相关文章:

  • 设计模式12:状态模式
  • 【学习总结|DAY021】Java 多线程
  • MyBatis入门的详细应用实例
  • C# winform 字符串通过枚举类型转成int类型的数据
  • [机器学习]XGBoost(3)——确定树的结构
  • ip地址和网络号关系是什么
  • 多特征变量序列预测(11) 基于Pytorch的TCN-GRU预测模型
  • 基于springboot+vue的智慧生活商城系统
  • Stability AI 3D:开创3D视觉技术新篇章,提升多视角连贯性与生成质量
  • 杰发科技AC7801——Flash数据读取
  • 静态页面负载均衡
  • 【NLP笔记】Transformer
  • 多数据源 - dynamic-datasource | 集成 HikariCP 连接池
  • 安卓面试题多线程 96-100
  • es 集群安全认证
  • 【SpringSecurity】十三、基于Session实现授权认证
  • 使用OpenRewrite自动做框架升级比如Spring Boot
  • Siloed No More: How AI-Driven Tech Stack Consolidation Boosts Revenue
  • C# 使用OpenCvSharp4将Bitmap合成为MP4视频的环境
  • O2OA红头文件流转与O2OA版式公文编辑器基本使用
  • java基础-Test03:图书管理系统 超详细注释
  • vue-router(v4.0) 基础3
  • Panasonic松下PLC如何数据采集?如何实现快速接入IIOT云平台?
  • fs方法举例
  • 蓝桥杯day4刷题日记
  • 算法笔记p335堆