精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

    文章

    2310

    瀏覽量

    42745
  • OpenHarmony
    +關注

    關注

    25

    文章

    3660

    瀏覽量

    16158
收藏 人收藏

    評論

    相關推薦

    鴻蒙實戰開發:【FaultLoggerd組件】講解

    Faultloggerd部件是OpenHarmony中C/C++運行時崩潰臨時日志的生成及管理模塊。面向基于 Rust 開發部件,Faultloggerd 提供了Rust Panic
    的頭像 發表于 03-12 16:22 ?987次閱讀
    <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 ?2641次閱讀
    華為<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 ?626次閱讀
    <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 ?340次閱讀
    <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 ?453次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>實戰</b><b class='flag-5'>開發</b>學習【FaultLoggerd組件】

    鴻蒙開發實戰:【系統服務框架部件

    系統服務管理系統中safwk組件定義OpenHarmony中SystemAbility的實現方法,并提供啟動、注冊等接口實現。
    的頭像 發表于 03-21 15:44 ?279次閱讀
    <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 ?323次閱讀
    <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>】