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

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

3天内不再提示

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

jf_46214456 来源:jf_46214456 作者:jf_46214456 2024-03-21 15:44 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

简介

在系统服务管理子系统中safwk组件定义OpenHarmony中SystemAbility的实现方法,并提供启动、注册等接口实现。

系统架构

图 1 系统服务框架图

说明

接口说明

image.png

使用说明

SystemAbility实现一般采用XXX.cfg + profile.json + libXXX.z.so的方式由init进程执行对应的XXX.cfg文件拉起相关SystemAbility进程。

C++实现SystemAbility

示例代码如下:

  • 1. 定义IPC对外接口IXXX

定义该服务对外提供的能力集合函数,统一继承IPC接口类IRemoteBroker;同时实现该IPC对外接口唯一标识符DECLARE_INTERFACE_DESCRIPTOR(XXX);该标识符用于IPC通信的校验等目的。

namespace OHOS {
class IListenAbility : public IRemoteBroker {
public:
    virtual int AddVolume(int volume) = 0;

public:
    enum {
        ADD_VOLUME = 1,
    };
public:
    DECLARE_INTERFACE_DESCRIPTOR(u"OHOS.test.IListenAbility");
};
}
  • 2. 定义客户端通信代码XXXProxy
namespace OHOS {
class ListenAbilityProxy : public IRemoteProxy< IListenAbility > {
public:
    int AddVolume(int volume);

    explicit ListenAbilityProxy(const sptr< IRemoteObject >& impl)
        : IRemoteProxy< IListenAbility >(impl)
    {
    }

private:
    static inline BrokerDelegator< ListenAbilityProxy > delegator_;
};
} // namespace OHOS
  • 3. 定义服务端通信代码XXXStub
namespace OHOS {
int32_t ListenAbilityStub::OnRemoteRequest(uint32_t code,
    MessageParcel& data, MessageParcel &reply, MessageOption &option)
{
    switch (code) {
        case ADD_VOLUME: {
            return reply.WriteInt32(AddVolume(data.ReadInt32()));
        }

        default:
            return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
    }
}
}
  • 4. SystemAbility的实现类
namespace {
constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, 0xD001800, "SA_TST"};
}

REGISTER_SYSTEM_ABILITY_BY_ID(ListenAbility, DISTRIBUTED_SCHED_TEST_LISTEN_ID, true);

ListenAbility::ListenAbility(int32_t saId, bool runOnCreate) : SystemAbility(saId, runOnCreate)
{
    HiLog::Info(LABEL, ":%s called", __func__);
    HiLog::Info(LABEL, "ListenAbility()");
}

ListenAbility::~ListenAbility()
{
    HiLog::Info(LABEL, "~ListenAbility()");
}

int ListenAbility::AddVolume(int volume)
{
    pid_t current = getpid();
    HiLog::Info(LABEL, "ListenAbility::AddVolume volume = %d, pid = %d.", volume, current);
    return (volume + 1);
}

void ListenAbility::OnDump()
{
}

void ListenAbility::OnStart()
{
    HiLog::Info(LABEL, "ListenAbility::OnStart()");
    HiLog::Info(LABEL, "ListenAbility:%s called:-----Publish------", __func__);
    bool res = Publish(this);
    if (res) {
        HiLog::Error(LABEL, "ListenAbility: res == false");
    }
    HiLog::Info(LABEL, "ListenAbility:%s called:AddAbilityListener_OS_TST----beg-----", __func__);
    AddSystemAbilityListener(DISTRIBUTED_SCHED_TEST_OS_ID);
    HiLog::Info(LABEL, "ListenAbility:%s called:AddAbilityListener_OS_TST----end-----", __func__);

    HiLog::Info(LABEL, "ListenAbility:%s called:StopAbility_OS_TST----beg-----", __func__);
    StopAbility(DISTRIBUTED_SCHED_TEST_OS_ID);
    HiLog::Info(LABEL, "ListenAbility:%s called:StopAbility_OS_TST----end-----", __func__);
    return;
}

void ListenAbility::OnStop()
{
}
  • 5. SystemAbility配置

以c++实现的SA必须配置相关System Ability的profile配置文件才会完成SA的加载注册逻辑,否则没有编写profile配置的System Ability不会完成注册。配置方法如下:

在子系统的根目录新建一个以sa_profile为名的文件夹,然后在此文件夹中新建两个文件:一个以serviceId为前缀的json文件,另外一个为BUILD.gn文件。

serviceid.json:

{
    "process": "listen_test",
    "systemability": [
        {
            "name": serviceid,
            "libpath": "liblisten_test.z.so",
            "run-on-create": true,
            "distributed": true,
            "dump_level": 1
        }
    ]
}

BUILD.gn:

import("//build/ohos/sa_profile/sa_profile.gni")
ohos_sa_profile("xxx_sa_profile") {
    sources = [
        "serviceid.json"
    ]
    subsystem_name = "systemabilitymgr"
}

说明:

  1. 进程名字即该SystemAbility要运行的进程空间,此字段是必填选项。
  2. 一个SystemAbility配置文件只能配置一个SystemAbility节点,配置多个会导致编译失败。
  3. SystemAbility的name为对应的serviceId必须与代码中注册的serviceId保持一致,必配项。
  4. libpath为SystemAbility的加载路径,必配项。
  5. run-on-create:true表示进程启动后即向samgr组件注册该SystemAbility;false表示按需启动,即在其他模块访问到该SystemAbility时启动,必配项。
  6. distributed:true表示该SystemAbility为分布式SystemAbility,支持跨设备访问;false表示只有本地跨IPC访问。
  7. bootphase:可不设置;可以设置的值有三种:BootStartPhase、CoreStartPhase、OtherStartPhase(默认类型),三种优先级依次降低,当同一个进程中,会优先拉起注册配置BootStartPhase的SystemAbility,然后是配置了CoreStartPhase的SystemAbility,最后是OtherStartPhase;当高优先级的SystemAbility全部启动注册完毕才会启动下一级的SystemAbility的注册启动。
  8. dump-level:表示systemdumper支持的level等级,默认配置1。
  9. BUILD.gn中subsystem_name为相应部件名称;sources表示当前子系统需要配置的SystemAbility列表,可支持配置多个SystemAbility。

以上步骤完成后,全量编译代码后会在out路径向生成一个以进程名为前缀的json文件listen_test.json;路径为:out...systemprofilelisten_test.json。

更多鸿蒙开发知识已更新[qr23.cn/AKFP8k]可前往参考学习。

OpenHarmony高级技能.png

  • 6. cfg配置文件

cfg配置文件为linux提供的native进程拉起策略,开机启动阶段由init进程解析配置的cfg文件进行拉起。

{
    "jobs" : [{
            "name" : "post-fs-data",
            "cmds" : [
                "start listen_test"
            ]
        }
    ],
	"services" : [{
            "name" : "listen_test",
            "path" : ["/system/bin/sa_main", "/system/profile/listen_test.json"],
            "uid" : "system",
            "gid" : ["system", "shell"]
        }
    ]
}

审核编辑 黄宇

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

    关注

    60

    文章

    2858

    浏览量

    45347
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    开源鸿蒙技术大会2025丨开源鸿蒙应用开发再提速,跨平台框架PMC(筹)正式启动孵化

    9月27日,开源鸿蒙技术大会2025在长沙国际会议中心盛大举办。大会现场,开源鸿蒙跨平台框架PMC(筹)正式启动孵化,标志着开源鸿蒙在应用开发
    的头像 发表于 11-10 18:15 1085次阅读
    开源<b class='flag-5'>鸿蒙</b>技术大会2025丨开源<b class='flag-5'>鸿蒙</b>应用<b class='flag-5'>开发</b>再提速,跨平台<b class='flag-5'>框架</b>PMC(筹)正式启动孵化

    知乎开源“智能预渲染框架” 几行代码实现鸿蒙应用页面“秒开”

    近日,知乎在Gitee平台开源了其自研的鸿蒙“智能预渲染框架”,并将该框架的Har包上架到OpenHarmony三方库中心仓。该框架鸿蒙
    的头像 发表于 08-29 14:32 464次阅读
    知乎开源“智能预渲染<b class='flag-5'>框架</b>” 几行代码实现<b class='flag-5'>鸿蒙</b>应用页面“秒开”

    【HarmonyOS 5】金融应用开发鸿蒙组件实践

    【HarmonyOS 5】金融应用开发鸿蒙组件实践 ##鸿蒙开发能力 ##HarmonyOS SDK应用服务##
    的头像 发表于 07-11 18:20 744次阅读
    【HarmonyOS 5】金融应用<b class='flag-5'>开发</b><b class='flag-5'>鸿蒙</b>组件实践

    鸿蒙5开发宝藏案例分享---一多开发实例(音乐)

    关联实际开发中的高频痛点,比如内存泄漏、跨端适配、服务卡片设计等。我整理了一份超全解读,带你解锁鸿蒙开发的“隐藏Buff”! 一、动态布局实战
    的头像 发表于 06-30 11:54 617次阅读

    鸿蒙5开发宝藏案例分享---埋点开发实战指南

    鸿蒙埋点开发宝藏指南:官方案例实战解析,轻松搞定数据追踪! 大家好呀!我是HarmonyOS开发路上的探索者。最近在折腾应用埋点时,意外发现了鸿蒙
    发表于 06-12 16:30

    鸿蒙5开发宝藏案例分享---切面编程实战揭秘

    鸿蒙切面编程(AOP)实战指南:隐藏的宝藏功能大揭秘! 大家好!今天在翻鸿蒙开发者文档时,意外发现了官方埋藏的「切面编程」宝藏案例!实际开发
    发表于 06-12 16:21

    鸿蒙5开发宝藏案例分享---一多开发实例(地图导航)

    ? 鸿蒙开发隐藏宝藏大公开!手把手教你玩转\"一多\"地图导航案例 ? 大家好呀!我是你们的老朋友,今天要给大家扒一扒鸿蒙官方文档里那些\"藏得深\"的实战
    发表于 06-03 16:17

    KaihongOS笔记本电脑开发实战第九节:全功能TypeC驱动框架适配

    《手把手教你做PC》系列直播课再度开播 !《 KaihongOS笔记本电脑开发实战第九节九:全功能TypeC驱动框架适配》将于5月21日19:00开播 ↑扫码入群,领课程讲义资料包↑ 深开鸿资深
    发表于 05-19 18:29

    开源鸿蒙开发新体验,开鸿Bot系列今日开启预售!

    开发者大礼包,其中含KaihongOS桌面版镜像包、KaihongOS桌面版二次开发包、实战课程、烧录指南等。同时,用户还可享受一对一技术顾问服务、优先体验新版本KaihongOS
    发表于 05-16 14:13

    鸿蒙服务实战-笑笑五子棋(1)

    鸿蒙服务实战-笑笑五子棋(1) 前言 作为鸿蒙应用的深度开发者都应该知道,经历了 波澜壮阔 12 月风波 ,到 2025 年新的开始。鸿蒙
    的头像 发表于 03-31 09:23 559次阅读
    <b class='flag-5'>鸿蒙</b>元<b class='flag-5'>服务实战</b>-笑笑五子棋(1)

    【「极速探索HarmonyOS NEXT 」阅读体验】 初印象:一本纯血鸿蒙应用开发入门的好书

    实战,就纯血鸿蒙的整个技术链条进行了简单细致的介绍。 书中先介绍了鸿蒙整体的概念,然后介绍了开发工具DevEco Studio的下载安装和使用以及软件布局,以及如何使用它创建基本工程、
    发表于 03-04 12:41

    震撼发布!CodeArts 解锁全新技能,鸿蒙应用与元服务开发轻松拿捏

    随着物联网和智能设备的迅速发展,操作系统的多元化需求日益凸显。鸿蒙系统作为华为研发的面向全场景的分布式操作系统,旨在打破不同设备之间的生态壁垒,实现跨设备的无缝协同。 在
    的头像 发表于 02-26 11:45 2925次阅读
    震撼发布!CodeArts 解锁全新技能,<b class='flag-5'>鸿蒙</b>应用与元<b class='flag-5'>服务</b><b class='flag-5'>开发</b>轻松拿捏

    名单公布!【书籍评测活动NO.56】极速探索HarmonyOS NEXT:纯血鸿蒙应用开发实践

    开发的核心技术,以及鸿蒙应用在实际开发中的应用方法。 本书共分为四篇,共计16章,分别为鸿蒙开发基础篇、
    发表于 01-20 16:53

    鸿蒙Flutter实战:14-现有Flutter 项目支持鸿蒙 II

    分别安装官方的3.22版本,以及鸿蒙社区的 3.22.0 版本 3.搭建 Flutter鸿蒙开发环境 参考文章《鸿蒙Flutter实战:0
    发表于 12-26 14:59

    名单公布!【书籍评测活动NO.53】鸿蒙操作系统设计原理与架构

    操作系统从2019年8月9日正式发布,历时1778天,历经4代,鸿蒙生态设备数量已超过9亿,已有254万HarmonyOS开发者投入到鸿蒙世界的开发
    发表于 12-16 15:10