0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙開發(fā)實(shí)戰(zhàn):【系統(tǒng)服務(wù)管理部件】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-03-21 17:56 ? 次閱讀

簡(jiǎn)介

samgr組件是OpenHarmony的核心組件,提供OpenHarmony系統(tǒng)服務(wù)啟動(dòng)、注冊(cè)、查詢等功能。

系統(tǒng)架構(gòu)

圖 1 系統(tǒng)服務(wù)管理系統(tǒng)架構(gòu)圖

說明

  1. samgr服務(wù)接收到sa框架層發(fā)送的注冊(cè)消息,會(huì)在本地緩存中存入系統(tǒng)服務(wù)相關(guān)信息。

    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. 對(duì)于本地服務(wù)而言,samgr服務(wù)接收到sa框架層發(fā)送的獲取消息,會(huì)通過服務(wù)id,查找到對(duì)應(yīng)服務(wù)的代理對(duì)象,然后返回給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. 動(dòng)態(tài)加載系統(tǒng)服務(wù)進(jìn)程及SystemAbility, 系統(tǒng)進(jìn)程無需開機(jī)啟動(dòng),而是在SystemAbility被訪問的時(shí)候按需拉起,并加載指定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的代理對(duì)象
    {
        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 調(diào)用samgr提供的動(dòng)態(tài)加載接口LoadSystemAbility(int32_t systemAbilityId, const sptr& callback)。

    // 構(gòu)造步驟1的SystemAbilityLoadCallbackStub子類的實(shí)例
    sptr< OnDemandLoadCallback > loadCallback_ = new OnDemandLoadCallback();
    // 調(diào)用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;
    }
    

鴻蒙開發(fā)知識(shí)更新,前往[qr23.cn/AKFP8k]可參考

鴻蒙開發(fā)OpenHarmony就業(yè)必修技能.png

說明:
1.LoadSystemAbility方法調(diào)用成功后,指定SystemAbility加載成功后會(huì)觸發(fā)回調(diào)OnLoadSystemAbilitySuccess,加載失敗觸發(fā)回調(diào)OnLoadSystemAbilityFail。
2.動(dòng)態(tài)加載的進(jìn)程cfg文件不能配置為開機(jī)啟動(dòng),需指定"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方法適用于動(dòng)態(tài)加載場(chǎng)景,其他獲取SystemAbility場(chǎng)景建議使用CheckSystemAbility方法。
4.cfg里進(jìn)程名稱需要與SA的配置json文件里進(jìn)程名保持一致

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2302

    瀏覽量

    42689
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3636

    瀏覽量

    16061
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙實(shí)戰(zhàn)開發(fā):【FaultLoggerd組件】講解

    Faultloggerd部件是OpenHarmony中C/C++運(yùn)行時(shí)崩潰臨時(shí)日志的生成及管理模塊。面向基于 Rust 開發(fā)部件,F(xiàn)aultloggerd 提供了Rust Panic
    的頭像 發(fā)表于 03-12 16:22 ?962次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>開發(fā)</b>:【FaultLoggerd組件】講解

    鴻蒙原生應(yīng)用/元服務(wù)實(shí)戰(zhàn)-AGC團(tuán)隊(duì)賬戶

    多人及內(nèi)外結(jié)合去開發(fā)運(yùn)營(yíng)鴻蒙原生應(yīng)用元服務(wù)時(shí),需要用到團(tuán)隊(duì)賬戶,AGC提供了強(qiáng)大的團(tuán)隊(duì)角色與權(quán)限分工能力。 團(tuán)隊(duì)帳號(hào)是開發(fā)者聯(lián)盟為實(shí)名開發(fā)
    發(fā)表于 01-18 16:38

    鴻蒙實(shí)戰(zhàn)項(xiàng)目開發(fā):【短信服務(wù)

    數(shù)據(jù)管理 電話服務(wù) 分布式應(yīng)用開發(fā) 通知與窗口管理 多媒體技術(shù) 安全技能 任務(wù)管理 WebGL 國(guó)際化
    發(fā)表于 03-03 21:29

    鴻蒙Flutter實(shí)戰(zhàn):07混合開發(fā)

    # 鴻蒙Flutter實(shí)戰(zhàn):混合開發(fā) 鴻蒙Flutter混合開發(fā)主要有兩種形式。 ## 1.基于har 將flutter module
    發(fā)表于 10-23 16:00

    【專家問答】楊光明:鴻蒙系統(tǒng)研發(fā)工程師教你從0開發(fā)鴻蒙PCB開發(fā)

    `前言:本期我們邀請(qǐng)到了張飛實(shí)戰(zhàn)電子團(tuán)隊(duì)的鴻蒙系統(tǒng)研發(fā)工程師楊光明老師@aMi楊光明,本期高手問答中老師將為我們解答大家在Linux系統(tǒng)開發(fā),單片機(jī)
    發(fā)表于 09-25 15:24

    《HarmonyOS原子化服務(wù)卡片原理與實(shí)戰(zhàn)》清華大學(xué)出版社李洋著

    對(duì)原子化服務(wù)未來發(fā)展的展望;繼續(xù)努力體驗(yàn)與成長(zhǎng),持續(xù)奮斗。本書主要闡述鴻蒙操作系統(tǒng)( HarmonyOS )應(yīng)用開發(fā)中全新的服務(wù)形式,原子化
    發(fā)表于 12-29 12:14

    鴻蒙原生應(yīng)用/元服務(wù)開發(fā)-AGC分發(fā)如何下載管理Profile

    一、收到通知 尊敬的開發(fā)者: 您好,為支撐鴻蒙生態(tài)發(fā)展,HUAWEI AppGallery Connect已于X月XX日完成存量HarmonyOS應(yīng)用/元服務(wù)的Profile文件更新,更新后
    發(fā)表于 11-29 15:10

    鴻蒙系統(tǒng)是基于什么開發(fā)

    爭(zhēng)議,那么鴻蒙系統(tǒng)到底是基于什么開發(fā)的呢?下面小編就為大家?guī)?b class='flag-5'>鴻蒙系統(tǒng)是基于什么開發(fā)的答案。
    的頭像 發(fā)表于 07-05 17:12 ?1.2w次閱讀

    華為開發(fā)者大會(huì)2021年亮點(diǎn):鴻蒙系統(tǒng)的原子化服務(wù)開發(fā)

    華為開發(fā)者大會(huì)2021年:鴻蒙系統(tǒng)的原子化服務(wù)開發(fā) 在2021年華為開發(fā)者大會(huì)上,原子化
    的頭像 發(fā)表于 10-22 15:44 ?2631次閱讀
    華為<b class='flag-5'>開發(fā)</b>者大會(huì)2021年亮點(diǎn):<b class='flag-5'>鴻蒙</b><b class='flag-5'>系統(tǒng)</b>的原子化<b class='flag-5'>服務(wù)</b><b class='flag-5'>開發(fā)</b>

    華為開發(fā)者大會(huì)分論壇HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-鴻蒙智聯(lián)認(rèn)證生態(tài)設(shè)備測(cè)試挑戰(zhàn)

    HDC 2021華為開發(fā)者大會(huì)分論壇HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-鴻蒙智聯(lián)認(rèn)證生態(tài)設(shè)備測(cè)試挑戰(zhàn)
    的頭像 發(fā)表于 10-23 16:40 ?1775次閱讀
    華為<b class='flag-5'>開發(fā)</b>者大會(huì)分論壇HarmonyOS測(cè)試技術(shù)與<b class='flag-5'>實(shí)戰(zhàn)</b>-<b class='flag-5'>鴻蒙</b>智聯(lián)認(rèn)證生態(tài)設(shè)備測(cè)試挑戰(zhàn)

    鴻蒙開發(fā)實(shí)戰(zhàn):【包管理系統(tǒng)

    管理系統(tǒng)負(fù)責(zé)應(yīng)用安裝包的管理,提供安裝包的信息查詢、安裝、更新、卸載和包信息存儲(chǔ)等能力
    的頭像 發(fā)表于 03-14 15:23 ?600次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b>:【包<b class='flag-5'>管理</b>子<b class='flag-5'>系統(tǒng)</b>】

    鴻蒙開發(fā)實(shí)戰(zhàn):【電話服務(wù)系統(tǒng)

    電話服務(wù)系統(tǒng),提供了一系列的API用于獲取無線蜂窩網(wǎng)絡(luò)和SIM卡相關(guān)的一些信息。應(yīng)用可以通過調(diào)用API來獲取當(dāng)前注冊(cè)網(wǎng)絡(luò)名稱、網(wǎng)絡(luò)服務(wù)狀態(tài)、信號(hào)強(qiáng)度以及SIM卡的相關(guān)信息。
    的頭像 發(fā)表于 03-14 21:49 ?320次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b>:【電話<b class='flag-5'>服務(wù)</b>子<b class='flag-5'>系統(tǒng)</b>】

    鴻蒙實(shí)戰(zhàn)開發(fā)學(xué)習(xí)【FaultLoggerd組件】

    Faultloggerd部件是OpenHarmony中C/C++運(yùn)行時(shí)崩潰臨時(shí)日志的生成及管理模塊。面向基于 Rust 開發(fā)部件,F(xiàn)aultloggerd 提供了Rust Panic
    的頭像 發(fā)表于 03-17 20:39 ?443次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>開發(fā)</b>學(xué)習(xí)【FaultLoggerd組件】

    鴻蒙開發(fā)實(shí)戰(zhàn):【系統(tǒng)服務(wù)管理部件

    samgr組件是OpenHarmony的核心組件,提供OpenHarmony系統(tǒng)服務(wù)啟動(dòng)、注冊(cè)、查詢等功能。
    的頭像 發(fā)表于 03-19 15:52 ?299次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b>:【<b class='flag-5'>系統(tǒng)</b><b class='flag-5'>服務(wù)</b><b class='flag-5'>管理</b><b class='flag-5'>部件</b>】

    鴻蒙開發(fā)實(shí)戰(zhàn):【系統(tǒng)服務(wù)框架部件

    系統(tǒng)服務(wù)管理系統(tǒng)中safwk組件定義OpenHarmony中SystemAbility的實(shí)現(xiàn)方法,并提供啟動(dòng)、注冊(cè)等接口實(shí)現(xiàn)。
    的頭像 發(fā)表于 03-21 15:44 ?265次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b>:【<b class='flag-5'>系統(tǒng)</b><b class='flag-5'>服務(wù)</b>框架<b class='flag-5'>部件</b>】