0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_46214456 来源:jf_46214456 作者:jf_46214456 2024-03-19 15:52 次阅读

简介

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文件里进程名保持一致

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鸿蒙
    +关注

    关注

    57

    文章

    2348

    浏览量

    42829
  • OpenHarmony
    +关注

    关注

    25

    文章

    3718

    浏览量

    16295
收藏 人收藏

    评论

    相关推荐

    鸿蒙实战开发:【FaultLoggerd组件】讲解

    Faultloggerd部件是OpenHarmony中C/C++运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发部件,Faultloggerd 提供了Rust Panic
    的头像 发表于 03-12 16:22 1036次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>实战</b><b class='flag-5'>开发</b>:【FaultLoggerd组件】讲解

    鸿蒙原生应用/元服务实战-AGC团队账户

    多人及内外结合去开发运营鸿蒙原生应用元服务时,需要用到团队账户,AGC提供了强大的团队角色与权限分工能力。 团队帐号是开发者联盟为实名开发
    发表于 01-18 16:38

    鸿蒙实战项目开发:【短信服务

    数据管理 电话服务 分布式应用开发 通知与窗口管理 多媒体技术 安全技能 任务管理 WebGL 国际化
    发表于 03-03 21:29

    鸿蒙Flutter实战:07混合开发

    # 鸿蒙Flutter实战:混合开发 鸿蒙Flutter混合开发主要有两种形式。 ## 1.基于har 将flutter module
    发表于 10-23 16:00

    鸿蒙原生开发手记:01-元服务开发

    简介 元服务鸿蒙中的一种轻量应用形态,无需下载,直接运行。类似于微信小程序,但与小程序不同的是,元服务更加轻量。 元服务使用原生开发,是
    发表于 11-14 17:28

    【专家问答】杨光明:鸿蒙系统研发工程师教你从0开发鸿蒙PCB开发

    `前言:本期我们邀请到了张飞实战电子团队的鸿蒙系统研发工程师杨光明老师@aMi杨光明,本期高手问答中老师将为我们解答大家在Linux系统开发,单片机
    发表于 09-25 15:24

    《HarmonyOS原子化服务卡片原理与实战》清华大学出版社李洋著

    对原子化服务未来发展的展望;继续努力体验与成长,持续奋斗。本书主要阐述鸿蒙操作系统( HarmonyOS )应用开发中全新的服务形式,原子化
    发表于 12-29 12:14

    鸿蒙原生应用/元服务开发-AGC分发如何下载管理Profile

    一、收到通知 尊敬的开发者: 您好,为支撑鸿蒙生态发展,HUAWEI AppGallery Connect已于X月XX日完成存量HarmonyOS应用/元服务的Profile文件更新,更新后
    发表于 11-29 15:10

    鸿蒙系统是基于什么开发

    争议,那么鸿蒙系统到底是基于什么开发的呢?下面小编就为大家带来鸿蒙系统是基于什么开发的答案。
    的头像 发表于 07-05 17:12 1.2w次阅读

    华为开发者大会2021年亮点:鸿蒙系统的原子化服务开发

    华为开发者大会2021年:鸿蒙系统的原子化服务开发 在2021年华为开发者大会上,原子化
    的头像 发表于 10-22 15:44 2672次阅读
    华为<b class='flag-5'>开发</b>者大会2021年亮点:<b class='flag-5'>鸿蒙</b><b class='flag-5'>系统</b>的原子化<b class='flag-5'>服务</b><b class='flag-5'>开发</b>

    鸿蒙开发实战:【包管理系统

    管理系统负责应用安装包的管理,提供安装包的信息查询、安装、更新、卸载和包信息存储等能力
    的头像 发表于 03-14 15:23 680次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b><b class='flag-5'>实战</b>:【包<b class='flag-5'>管理</b>子<b class='flag-5'>系统</b>】

    鸿蒙开发实战:【电话服务系统

    电话服务系统,提供了一系列的API用于获取无线蜂窝网络和SIM卡相关的一些信息。应用可以通过调用API来获取当前注册网络名称、网络服务状态、信号强度以及SIM卡的相关信息。
    的头像 发表于 03-14 21:49 382次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b><b class='flag-5'>实战</b>:【电话<b class='flag-5'>服务</b>子<b class='flag-5'>系统</b>】

    鸿蒙实战开发学习【FaultLoggerd组件】

    Faultloggerd部件是OpenHarmony中C/C++运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发部件,Faultloggerd 提供了Rust Panic
    的头像 发表于 03-17 20:39 509次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>实战</b><b class='flag-5'>开发</b>学习【FaultLoggerd组件】

    鸿蒙开发实战:【系统服务框架部件

    系统服务管理系统中safwk组件定义OpenHarmony中SystemAbility的实现方法,并提供启动、注册等接口实现。
    的头像 发表于 03-21 15:44 294次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b><b class='flag-5'>实战</b>:【<b class='flag-5'>系统</b><b class='flag-5'>服务</b>框架<b class='flag-5'>部件</b>】

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

    samgr组件是OpenHarmony的核心组件,提供OpenHarmony系统服务启动、注册、查询等功能。
    的头像 发表于 03-21 17:56 352次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b><b class='flag-5'>实战</b>:【<b class='flag-5'>系统</b><b class='flag-5'>服务</b><b class='flag-5'>管理</b><b class='flag-5'>部件</b>】