OpenHarmony系统服务的核心组件

news/2024/5/9 14:31:14/文章来源:https://blog.csdn.net/weixin_61845324/article/details/137015778

简介

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

系统架构

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

目录

/foundation/distributedschedule
├── 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;
}
  1. 对于本地服务而言,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;
}
  1. 动态加载系统服务进程及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.xml"],"ondemand" : true,"uid" : "system","gid" : ["system", "shell"]}]
}

3.LoadSystemAbility方法适用于动态加载场景,其他获取SystemAbility场景建议使用CheckSystemAbility方法。
4.cfg里进程名称需要与SA的配置xml文件里进程名保持一致

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1023460.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git的配置与简单的使用

Git概述 Git的工作流程 Git的配置与简单的使用 配置用户信息 配置用户名以及邮箱 邮箱尽量自己能够记住&#xff0c;以后会用到 git config --global user.name "Your name" git config --global user.email "Your email"查看用户信息 git config --…

警务数据仓库的实现

目录 一、SQL Server 2008 R2&#xff08;一&#xff09;SQL Server 的服务功能&#xff08;二&#xff09;SQL Server Management Studio&#xff08;三&#xff09;Microsoft Visual Studio 二、创建集成服务项目三、配置“旅馆_ETL”数据流任务四、配置“人员_ETL”数据流任…

ORA-29548

ORA-29548: Java system class reported: release of Java system classes in the database ( being determined) does not match that of the oracle executable (11.2.0.4.221018) 执行 java 报错 create or replace and compile java source named preg_replace aspackage…

深入解析MySQL的四种打开方式

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

嵌入式开发--STM32G431RBTx-定时器中断流水灯

嵌入式开发–STM32G431RBTx-定时器中断流水灯 定时器工作原理 如图有反映stm32g431的定时器资源。 共10个定时器 定时器定时器类型个数TIM6&#xff0c;7基本定时器2TIM2&#xff0c;3&#xff0c;4全功能通用定时器3TIM15&#xff0c;16&#xff0c;17通用定时器(只有1或2个…

51单片机中断信号的种类及应用场景

在嵌入式系统中&#xff0c;中断是一种重要的事件处理机制&#xff0c;它可以在程序执行的任何时候暂停当前任务&#xff0c;转而执行与之相关的特殊任务或事件。51单片机作为一种常见的微控制器&#xff0c;其中断功能在各种应用中起着关键作用。然而&#xff0c;对于初学者和…

权限提升-Win系统权限提升篇计算机管理用户进程注入令牌窃取服务启动远程控制

知识点 1、计算机管理用户到System-入口点和应用点 2、计算机管理用户到System-服务启动&远程控制 3、计算机管理用户到System-进程注入&令牌窃取 普通用户是没办法用(服务启动&远程控制、进程注入&令牌窃取等方法)提权到administrator、system权限的 而syst…

Git Commit 提交规范,变更日志、版本发布自动化和 Emoji 提交标准

前言 Git Commit 是开发的日常操作, 一个优秀的 Commit Message 不仅有助于他人 Review, 还可以有效的输出 CHANGELOG, 对项目的管理实际至关重要, 但是实际工作中却常常被大家忽略&#xff0c;希望通过本文&#xff0c;能够帮助大家规范 Git Commit&#xff0c;并且展示相关 …

Apache SeaTunnel和SeaTunnel Web 安装部署

Apache SeaTunnel和SeaTunnel Web 安装部署 前面我们介绍已经介绍过了Apache SeaTunnel,这里我们看一下SeaTunnel 的安装部署,早期的SeaTunnel 是没有web 页面的,只能在命令行里使用,现在SeaTunnel 已经有了web 端了,这就降低了我们的使用门槛 下载配置 我们可以去下面的…

【Word自动化办公】使用python-docx对Word进行操作

目录 一、环境安装 二、文档各组成结构获取 2.1 组成结构讲解 2.2 段落run对象的切分标准 三、获取整篇文档内容 四、写入指定样式的数据 4.1 通过add_paragraph与add_run参数添加样式 4.2 单独设置文本样式 五、添加标题 六、换行符&换页符 七、添加图片数据 …

Linux:rpm部署Jenkins(1)

1.获取Jenkins安装包 我这里使用的是centos7系统&#xff0c;ip为&#xff1a;192.168.6.6 2G运存 连接外网 Jenkins需要java环境&#xff0c;java的jdk包你可以去网上下载离线包&#xff0c;或者直接去yum安装&#xff0c;我这里使用的是yum安装 再去获取Jenkins的rpm包…

RabbitMQ的使用—实战

RabbitMQ的使用—实战 ​ RabbitMQ是一个开源的消息代理中间件&#xff0c;在分布式系统开发中被广泛应用。它实现了高级消息队列协议&#xff08;AMQP&#xff09;&#xff0c;提供可靠的消息传递、灵活的路由、消息确认等功能。下面是使用RabbitMQ的基本流程&#xff1a; 安…

(附源码)基于Spring Boot和Vue的前后端分离考研资料分享平台的设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2024年Java精品实战案例《100套》 &#x1f345;文末获取源码联系&#x1f345; &#x1f31…

vue 消息左右滚动(前后无缝衔接)

之前一直用vue-seamless-scroll&#xff0c;无奈此组件有两个缺点不满足实际效果&#xff1a;1&#xff09;标题过长被截取、2&#xff09;标题果断也会滚动&#xff0c;无奈我自己封装一个&#xff0c;满足此两个弊端&#xff0c;也能达到vue-seamless-scroll组件的功能&#…

约数个数(数论,蓝桥杯)

题目描述&#xff1a; 给定一个数n&#xff0c;再给出n个数&#xff0c;现在要求你求出这些数的乘积的约数个数总和&#xff0c;结果对1e97取模。 取值范围&#xff1a;1<n<100; 1<ni<2e9; 分析步骤&#xff1a; 第一&#xff1a;要求约数的个数&#xff0c;我们有…

Canine IP-10/CXCL 10 ELISA试剂盒上新

科研用Canine IP-10/CXCL 10 ELISA试剂盒重磅来袭&#xff0c;将在免疫学、癌症研究与神经科学等多个领域助力各位老师们的研究&#xff01; 图1&#xff1a;犬IP-10/CXCL10结构预测&#xff08;图片来源&#xff1a;UniProt&#xff09; C-X-C基序趋化因子(C-X-C motif chemok…

【k8s网络】梳理cni发展脉络

参考 《深入剖析 Kubernetes&#xff08;张磊&#xff09;》 补充 详解 Calico 三种模式&#xff08;与 Fannel 网络对比学习&#xff09;_calico vxlan-CSDN博客 容器网络 容器的网络栈 每个容器有自己的 net namespace net namespace 可以称之为网络栈所谓“网络栈”&…

vue.js+element-ui的基础表单

遇到原生的html小型单页应用时&#xff0c;是脱离了vue框架&#xff0c;而我们又想使用vue的语法和element的组件加快我们的开发速度&#xff0c;这个时候就需要引用他们的js了。技术栈即htmlvue.jselement-ui。而使用它们的方法也很简单&#xff0c;引入对应的js和css文件即可…

智慧交通(代码实现案例)

1.项目简介 目标: 了解智慧交通项目的架构知道智慧交通项目中的模块能够完成智慧交通项目的环境搭建 该项目是智慧交通项目&#xff0c;通过该项目掌握计算机视觉的方法在交通领域的相关应用&#xff0c;包括车道线检测的方法&#xff0c;多目标车辆追踪及流量统计方法&#…

C#学习笔记3:Windows窗口计时器

今日继续我的C#学习之路&#xff0c;今日学习自己制作一个Windows窗口计时器程序&#xff1a; 文章提供源码解释、步骤操作、整体项目工程下载 完成后的效果大致如下&#xff1a;&#xff08;可选择秒数&#xff0c;有进度条&#xff0c;开始计时按钮等&#xff09; &#xf…