自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

OHOS標(biāo)準(zhǔn)系統(tǒng)的SAMGR代碼解讀(v3.1)--1--Safwk

系統(tǒng) OpenHarmony
OHOS標(biāo)準(zhǔn)系統(tǒng)的Safwk組件位于3.1分支代碼的//foundation/distributedschedule/safwk/目錄下,在最新的master分支代碼則是//foundation/systemabilitymgr/safwk/目錄下。

??想了解更多關(guān)于開源的內(nèi)容,請訪問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

OHOS標(biāo)準(zhǔn)系統(tǒng)的safwk組件位于3.1分支代碼的//foundation/distributedschedule/safwk/目錄下,在最新的master分支代碼則是//foundation/systemabilitymgr/safwk/目錄下。

通過tree命令將目錄樹結(jié)構(gòu)打印出來,把測試相關(guān)代碼以及我們暫不關(guān)心的文件去掉后,結(jié)果如下圖所示:

OHOS標(biāo)準(zhǔn)系統(tǒng)的SAMGR代碼解讀(v3.1)--1--safwk-開源基礎(chǔ)軟件社區(qū)

可以看到通過safwk組件中的三個BUILD.gn文件,把safwk組件的配置文件和源代碼分別編譯成以下3個目標(biāo):

  1. 配置文件 profile。
  2. 可執(zhí)行程序sa_main。
  3. 動態(tài)鏈接庫文件 system_ability_fwk(即 libsystem_ability_fwk.z.so)。

下面分別來看一下。

1、配置文件 profile

在3.1 release分支代碼的 safwk/etc/profile/目錄下,只有BUILD.gn和foundation_trust.xml兩個文件(foundation.cfg 文件實際在//foundation/appexecfwk/standard/sa_profile/目錄下)。

在master分支代碼的 safwk/etc/profile/目錄下,除了BUILD.gn、foundation_trust.xml和foundation.cfg外,還新增了一個foundation_permission_desc.json文件(BUILD.gn中未見對該新增文件的使用)。

可見這些配置文件在3.1 release和master分支上有細(xì)微差別,但不影響我們對safwk組件的分析。

(1)foundation.cfg

這是標(biāo)準(zhǔn)系統(tǒng)的foundation進(jìn)程的啟動配置文件,在標(biāo)準(zhǔn)系統(tǒng)的開機(jī)啟動階段,由init進(jìn)程解析 /system/etc/init/foundation.cfg文件,并執(zhí)行其中的命令拉起foundation進(jìn)程(實際上在標(biāo)準(zhǔn)系統(tǒng)中有非常多的進(jìn)程以類似的方式拉起進(jìn)程,可搜索并過濾/system/etc/init/*.cfg文件進(jìn)行確認(rèn))。

查看/system/etc/init/foundation.cfg文件:

......(略)
"services" : [{
"name" : "foundation",
"path" : ["/system/bin/sa_main", "/system/profile/foundation.xml"],
......
"jobs" : {
"on-start" : "services:foundation"
}
}
]

標(biāo)準(zhǔn)系統(tǒng)的foundation進(jìn)程沒有生成自己的可執(zhí)行程序,而是借用了/system/bin/sa_main可執(zhí)行程序創(chuàng)建并初始化foundation進(jìn)程的運(yùn)行環(huán)境,根據(jù)傳入的/system/profile/foundation.xml參數(shù),運(yùn)行foundation.xml文件中指定的各個SA,保證了這組SA能夠順利對系統(tǒng)提供服務(wù)。

(2)foundation.xml

/system/profile/foundation.xml 文件是編譯系統(tǒng)自動生成的,它由一組 serviceid.xml 合并而成。在foundation.xml中可以看到一組SA的ID,如401、3501、4802等,我們可以在系統(tǒng)代碼根目錄下分別搜索401.xml、3501.xml、4802.xml等,可以找到對應(yīng)的文件。在這些文件中都可以看到一個“<process>foundation</process>”字段,表明這些SA都運(yùn)行在foundation進(jìn)程空間,而“<systemability>xxx</systemability>”之間的各個字段,則是SA的詳細(xì)配置信息,在啟動SA時會用得到(這些配置信息的詳情,請查閱safwk/README_zh.md文檔)。

(3)foundation_trust.xml 和 foundation_permission_desc.json

foundation_trust.xml記錄了可以在foundation進(jìn)程中加載和運(yùn)行的SA列表,見4.1節(jié)的分析。

foundation_permission_desc.json目前未見到使用的地方。

(4)其他進(jìn)程的.cfg和.xml

其他進(jìn)程如果也是用sa_main可執(zhí)行程序來拉起進(jìn)程,則它們也必須要有對應(yīng)的.cfg和serviceid.xml文件。

比如softbus_server進(jìn)程,會有dsoftbus/core/frame/standard/init/src/softbus_server.cfg 和 dsoftbus/core/frame/standard/sa_profile/4700.xml。這兩個文件經(jīng)編譯系統(tǒng)的處理后,對應(yīng)生成系統(tǒng)中的/system/etc/init/softbus_server.cfg和/system/profile/softbus_server.xml。(《沉浸式剖析OpenHarmony源代碼》的8.7.1節(jié)內(nèi)容詳細(xì)分析了softbus_server進(jìn)程的啟動流程,本文不再贅述。)

2、可執(zhí)行程序sa_main

可執(zhí)行程序sa_main由 safwk/services/safwk/src/main.cpp 文件單獨(dú)編譯生成。查看其源代碼,可以看到它的實際工作很簡單:

執(zhí)行main()函數(shù),在系統(tǒng)中創(chuàng)建并初始化進(jìn)程的運(yùn)行環(huán)境;然后讀取并解析參數(shù)傳入的.xml文件(如foundation.xml 或softbus_server.xml),將進(jìn)程的名字設(shè)置為.xml文件中“<process>name</process>”字段指定的名字;最后執(zhí)行:

LocalAbilityManager::GetInstance().DoStartSAProcess(profilePath, saId);
//注意:在系統(tǒng)開機(jī)階段自動啟動進(jìn)程時,saId參數(shù)的值此時都是-1,并非傳入具體的SA的ID。

以此啟動.xml文件中指定的一個或多個SA。

3、動態(tài)鏈接庫文件 system_ability_fwk

system_ability_fwk動態(tài)鏈接庫為sa_main啟動具體的SA提供支持,它的源代碼、依賴關(guān)系、類之間的關(guān)系等,如下圖所示:

OHOS標(biāo)準(zhǔn)系統(tǒng)的SAMGR代碼解讀(v3.1)--1--safwk-開源基礎(chǔ)軟件社區(qū)

(1)組件的依賴關(guān)系

注意該庫的依賴關(guān)系。其中依賴與samgr相關(guān)的3個動態(tài)鏈接庫,會在解讀samgr組件時進(jìn)行分析。

依賴的ipc_core組件所提供的IPC功能(對應(yīng)上圖右上角的一組虛基類),本文暫不深入分析。

(2)類的繼承關(guān)系

由上圖藍(lán)色底色部分中的灰色底色所指示的三個類之間的關(guān)系可以看出:

  • LocalAbilityManagerStub 類繼承 ILocalAbilityManager 接口類,為啟動SA提供服務(wù)端(Stub)接口,具體的啟動SA的一般流程(或公共流程)由其子類LocalAbilityManager實現(xiàn)。
  • LocalAbilityManager類實現(xiàn)啟動SA的一般性流程,并記錄了當(dāng)前進(jìn)程內(nèi)的所有SA的詳細(xì)信息、當(dāng)前LocalAbilityManager類對象、SA的任務(wù)信息等等。
  • 每一個SA對應(yīng)一個SystemAbility類的對象,該對象記錄了serviceid.xml文件中的 “<systemability>xxx</systemability>”字段中記錄的信息。
  • LocalAbilityManager類是SystemAbility類的友元類,LocalAbilityManager類可以直接訪問SystemAbility類的所有成員和函數(shù)。

它們的關(guān)系如下圖所示:

OHOS標(biāo)準(zhǔn)系統(tǒng)的SAMGR代碼解讀(v3.1)--1--safwk-開源基礎(chǔ)軟件社區(qū)

4、啟動SA的一般流程

如上面1.1所述,init進(jìn)程讀取和解析 /system/etc/init/*.cfg 文件,在啟動到具體的jobs階段時,執(zhí)行對應(yīng)的命令以啟動服務(wù)(即SA)。

下面以softbus_server(SA4700)的啟動為例,簡單說明與safwk組件相關(guān)的SA一般性啟動流程。

(1)DoStartSAProcess() 函數(shù)

OHOS標(biāo)準(zhǔn)系統(tǒng)的SAMGR代碼解讀(v3.1)--1--safwk-開源基礎(chǔ)軟件社區(qū)

sa_main可執(zhí)行程序的執(zhí)行流程如上圖所示,它的主要工作都在調(diào)用的如下函數(shù)的步驟中了。

LocalAbilityManager::GetInstance().DoStartSAProcess(profilePath, saId);

在DoStartSAProcess()函數(shù)中的4個步驟,簡單說明如下:

步驟[4-1]:調(diào)用InitSystemAbilityProfiles()函數(shù)

主要是分析傳入main()的第2個參數(shù)中指定的.xml文件,并將該文件的<systemability>列表中記錄的各個SA的信息,逐一分析并提取信息記錄到 ParseUtil類的如下兩個字段中:

//當(dāng)前進(jìn)程的SA鏈表,鏈表上的每一個節(jié)點(diǎn)都是一個SaProfile結(jié)構(gòu)體
std::list<SaProfile> saProfiles_;
//當(dāng)前進(jìn)程的名字,如foundation、softbus_server等
std::u16string procName_;

然后還會確認(rèn)是否存在“/system/profile/進(jìn)程名_trust.xml”文件(如1.3中提到的foundation_trust.xml文件)。存在該文件的話,則會通過CheckTrustSa()確認(rèn)上述SA鏈表中的SA是否都允許在當(dāng)前進(jìn)程中加載和運(yùn)行,并將不允許在當(dāng)前進(jìn)程中加載和運(yùn)行的SA從SA鏈表中刪除,在接下來的步驟中就不去加載和運(yùn)行它了。

最后調(diào)用OpenSo()將SA鏈表中的SA指定的動態(tài)鏈接庫加載到當(dāng)前進(jìn)程的運(yùn)行空間中。

void ParseUtil::OpenSo()
{
for (auto& saProfile : saProfiles_) {
if (saProfile.runOnCreate) {
OpenSo(saProfile);
}
}
}

加載動態(tài)鏈接庫時,會根據(jù)不同的SA的類構(gòu)造函數(shù)創(chuàng)建各自的SA服務(wù)對象,并執(zhí)行SystemAbility::MakeAndRegisterAbility(Xxx obj)將SA的服務(wù)對象注冊到 LocalAbilityManager 類的std::map<int32_t, SystemAbility*> abilityMap_ 成員中備用,該成員是一個map數(shù)據(jù)結(jié)構(gòu),key是saId,value對應(yīng)具體的一個SA對象指針。

步驟[4-2] :調(diào)用CheckSystemAbilityManagerReady()函數(shù)

這一步主要是通過嘗試獲取samgrProxy來確認(rèn)遠(yuǎn)程的samgr進(jìn)程的saManager服務(wù)是否可以訪問。

samgr進(jìn)程幾乎是用戶空間上最早運(yùn)行的系統(tǒng)進(jìn)程了,所有的SA都需要依賴samgr提供的服務(wù)。

步驟[4-3] :調(diào)用InitializeSaProfiles()函數(shù)

這一步主要是執(zhí)行InitializeRunOnCreateSaProfiles()函數(shù),將SA鏈表(saProfiles_)中的SA依次在abilityMap_中提取匹配的SA,并根據(jù)SA屬性中的<bootphase>字段的配置,將SA加入到 LocalAbilityManager 類的std::map<uint32_t, std::list<SystemAbility*>> abilityPhaseMap_成員中,該成員是一個map數(shù)據(jù)結(jié)構(gòu),key是如下枚舉中的一個值(表示不同的啟動階段):

enum {
BOOT_START = 1,
CORE_START = 2,
OTHER_START = 3,
};

value則是一個list的鏈表結(jié)構(gòu),鏈表上的每個節(jié)點(diǎn)都是一個SA的對象指針。

當(dāng)系統(tǒng)啟動到枚舉指定的階段時,就會依次啟動list鏈表中的所有SA。

bootphase:可不設(shè)置;可以設(shè)置的值有三種:BootStartPhase、CoreStartPhase、OtherStartPhase(默認(rèn)類型),三種優(yōu)先級依次降低,在同一個進(jìn)程中,會優(yōu)先拉起注冊配置BootStartPhase的SystemAbility,然后是配置了CoreStartPhase的SystemAbility,最后是OtherStartPhase;當(dāng)高優(yōu)先級的SystemAbility全部啟動注冊完畢才會啟動下一級的SystemAbility的注冊啟動。

步驟[4-4] :調(diào)用Run()函數(shù)

這一步調(diào)用Run()函數(shù)向saManager注冊SA并啟動SA對應(yīng)的任務(wù)。

(2)Run() 函數(shù)

LocalAbilityManager::Run() 的流程(見附件大圖),按函數(shù)調(diào)用分為如下5個步驟,簡單分析如下。

OHOS標(biāo)準(zhǔn)系統(tǒng)的SAMGR代碼解讀(v3.1)--1--safwk-開源基礎(chǔ)軟件社區(qū)

步驟[5-1]:向遠(yuǎn)程的samgr注冊當(dāng)前進(jìn)程的 localAbilityManager_ 對象

這一步首先獲取遠(yuǎn)程samgr的服務(wù)代理,通過該代理發(fā)送IPC消息給saManager,把當(dāng)前進(jìn)程的名字和該進(jìn)程的 localAbilityManager_ 對象注冊到samgr的 std::map<std::u16string, sptr<IRemoteObject>> systemProcessMap_ 成員中,該成員是一個map數(shù)據(jù)結(jié)構(gòu),key是進(jìn)程名字符串,value是該進(jìn)程的localAbilityManager_ 對象(也是一個IRemoteObject對象)。

步驟[5-2]:啟動當(dāng)前進(jìn)程的主線程

步驟[5-3]:按啟動的階段(Phase)依次啟動abilityPhaseMap_中對應(yīng)階段的SA鏈表中的每一個SA

這一步相當(dāng)于按SA的優(yōu)先級別先后啟動進(jìn)程中的每一個SA了。如foundation進(jìn)程,它有若干個SA,其中一部分SA是在CORE_START階段先啟動的,另一部分SA是在默認(rèn)的OTHER_START階段后啟動的;而softbus_server進(jìn)程只有一個SA4700,默認(rèn)是在OTHER_START階段啟動的。

進(jìn)程中的每一個SA都會在當(dāng)前進(jìn)程中創(chuàng)建一個任務(wù)(線程),并綁定任務(wù)的入口函數(shù)為 LocalAbilityManager::StartSystemAbilityTask()。任務(wù)啟動后就執(zhí)行該函數(shù),先確認(rèn)SA的依賴關(guān)系,然后進(jìn)入啟動每一個具體的SA的流程(如上圖中的啟動軟總線SA的流程,這就是每一個SA各自獨(dú)特的啟動流程部分了)。

步驟[5-4]:向遠(yuǎn)程的samgr注冊當(dāng)前進(jìn)程的標(biāo)記為按需啟動的SA

run-on-create:true表示進(jìn)程啟動后即向samgr組件注冊該SystemAbility;false表示按需啟動,即在其他模塊訪問到該SystemAbility時啟動,必配項。

這一步首先獲取遠(yuǎn)程samgr的服務(wù)代理,通過該代理發(fā)送IPC消息給saManager,把當(dāng)前進(jìn)程的名字和按需啟動的SA的id注冊到samgr的 std::map<int32_t, std::u16string> onDemandAbilityMap_ 成員中,該成員是一個map數(shù)據(jù)結(jié)構(gòu),key是按需啟動的SA的id,value是該SA所在進(jìn)程的進(jìn)程名字。

注意:此時的按需啟動的SA還沒有啟動,即沒有執(zhí)行步驟[5-3]的流程為SA創(chuàng)建任務(wù)。

當(dāng)有其他進(jìn)程向saManager查詢某個按需啟動的SA時,saManager會通過pendingTask執(zhí)行StartOnDemandAbility()函數(shù)的流程向SA所在的進(jìn)程發(fā)送IPC消息,要求啟動SA,如上圖的右下角綠色部分所示。

步驟[5-5]:停止當(dāng)前進(jìn)程的主線程

(3)啟動按需啟動的SA

saManager向SA所在的進(jìn)程發(fā)送IPC消息要求啟動按需啟動的SA時,SA所在進(jìn)程的LocalAbilityManagerStub::OnRemoteRequest()收到IPC消息,并作進(jìn)一步處理,如下圖右半部分所示。

OHOS標(biāo)準(zhǔn)系統(tǒng)的SAMGR代碼解讀(v3.1)--1--safwk-開源基礎(chǔ)軟件社區(qū)

LocalAbilityManagerStub通過其子類的LocalAbilityManager::StartAbility()流程來啟動對應(yīng)的SA。

StartAbility()首先是創(chuàng)建一個任務(wù)運(yùn)行LocalAbilityManager::StartOndemandSystemAbility(),用以加載SA對應(yīng)的動態(tài)鏈接庫,然后執(zhí)行OnStartAbility()開始啟動SA,最終會進(jìn)入啟動具體的SA的流程(即SA自己獨(dú)特的啟動流程)。

5、小結(jié)

以上便是safwk啟動一個SA的一般性流程。

safwk組件還提供其他一些功能,如添加、通知、刪除SA的監(jiān)聽者,向samgr注銷SA等,這就請小伙伴們自行閱讀源代碼進(jìn)行理解了。

文章相關(guān)附件可以點(diǎn)擊下面的原文鏈接前往下載:

https://ost.51cto.com/resource/2283。

??想了解更多關(guān)于開源的內(nèi)容,請訪問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??。

責(zé)任編輯:jianghua 來源: ??51CTO開源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2022-09-13 15:54:41

samgr鴻蒙

2022-09-27 15:57:20

OHOS代碼倉庫

2022-06-10 14:37:24

鴻蒙操作系統(tǒng)

2022-04-02 20:45:04

Hi3516開發(fā)板操作系統(tǒng)鴻蒙

2009-05-08 09:22:00

Python面向?qū)ο?/a>編譯

2021-11-23 15:35:05

鴻蒙HarmonyOS應(yīng)用

2025-02-20 08:26:28

2021-09-26 10:22:41

鴻蒙HarmonyOS應(yīng)用

2015-04-22 09:41:45

WeX5

2012-05-28 15:25:40

微瘋客棧

2021-09-16 15:04:28

鴻蒙HarmonyOS應(yīng)用

2014-06-13 19:13:50

Cocos2d-JS

2022-10-12 15:14:08

開機(jī)動畫鴻蒙

2022-09-15 14:56:12

GDB調(diào)試鴻蒙

2021-06-03 14:21:44

鴻蒙HarmonyOS應(yīng)用

2021-11-08 07:19:45

鴻蒙HarmonyOS應(yīng)用

2023-12-29 08:45:40

Python3.8鴻蒙解釋器

2022-09-13 16:10:15

鴻蒙操作系統(tǒng)

2022-09-07 15:08:58

操作系統(tǒng)鴻蒙

2022-09-06 15:46:52

speexdsp鴻蒙
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號