午夜理论片在线播放_欧美日本自慰喷水_最近最新最好看的2018_嫩模写真影院_国产精品欧美韩在线

首頁(yè) > 快訊  >  正文
一篇帶你了解Ability啟動(dòng)過(guò)程
2023-05-07 07:25:35 來(lái)源:清一色財(cái)經(jīng)

Ability可以分為FA(Feature Ability)和PA(Particle Ability)兩種類(lèi)型,每種類(lèi)型為開(kāi)發(fā)者提供了不同的模板,以便實(shí)現(xiàn)不同的業(yè)務(wù)功能。


【資料圖】

??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??

??清一色開(kāi)源基礎(chǔ)軟件社區(qū)??

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

Ability是應(yīng)用所具備能力的抽象,也是應(yīng)用程序的重要組成部分。一個(gè)應(yīng)用可以具備多種能力(即可以包含多個(gè)Ability),OpenHarmony OS支持應(yīng)用以Ability為單位進(jìn)行部署。Ability可以分為FA(Feature Ability)和PA(Particle Ability)兩種類(lèi)型,每種類(lèi)型為開(kāi)發(fā)者提供了不同的模板,以便實(shí)現(xiàn)不同的業(yè)務(wù)功能。

以上摘自官方文檔,本文簡(jiǎn)要介紹Page應(yīng)用(AceAbility為例)啟動(dòng)過(guò)程 ,減少入手難度。

1、AppSpawn進(jìn)程響應(yīng)應(yīng)用start請(qǐng)求

啟動(dòng)應(yīng)用命令:

aa start -a  -b e.g. aa start -a com.example.myapplication.MainAbility -b com.example.myapplication//startup/appspawn/standard/appspawn_service.cappspawn_service.c 調(diào)用OnReceiveRequest()處理請(qǐng)求,fork子進(jìn)程 *childPid = AppSpawnFork(AppSpawnChild, (void *)sandbox);

2、fork子進(jìn)程(aka.應(yīng)用)

//base/startup/appspawn/common/appspawn_server.c*childPid = AppSpawnFork(AppSpawnChild, (void *)sandbox);

AppSpawnChild中執(zhí)行應(yīng)用啟動(dòng)前步驟,如清理環(huán)境、權(quán)限鑒權(quán)等后,調(diào)用content->runChildProcessor(content, client)。

3、應(yīng)用主線程Start

//startup/appspawn/adapter/appspawn_ace.cpp

在Start()中裝備應(yīng)用MainThread的EventRunner和MainHandler,在EventRunner::Run等待event分發(fā)處理和event循環(huán),這里是應(yīng)用的主線程,也負(fù)責(zé)拉起其他的線程。這里有必要簡(jiǎn)要說(shuō)明OHOS的事件通知機(jī)制。

ohos基礎(chǔ)框架中的notification機(jī)制

代碼路徑:

OHOS event-notification機(jī)制可以保證一個(gè)線程中可以安全地向其他線程投遞任務(wù),只要拿到其他線程的Handler或者EventRunner即可。

UML類(lèi)圖:

說(shuō)明:

(1). EventHandler負(fù)責(zé)投遞封裝好的event到EventRunner的EventQueue中,并提供ProcessEvent接口供子類(lèi)重寫(xiě)業(yè)務(wù)邏輯。

(2). EventRunner負(fù)責(zé)線程運(yùn)行的抽象,實(shí)際線程運(yùn)行委托給EventInnerRunner實(shí)現(xiàn)。

(3). EventInnerRunner/EventRunnerImpl類(lèi)是線程運(yùn)行具體實(shí)現(xiàn),提供ThreadMain()作為std::thread運(yùn)行入口,在Run()完成event分發(fā)處理和event循環(huán)(EventHanlder在投遞event時(shí)候,將handler本身封裝在event中,之所以這樣做,可能是為了同時(shí)支持callback型task和EventHandler中重寫(xiě)ProcessEvent處理方式)。

4、MainThread::Init初始化

拉起看DFX的看門(mén)狗線程和信號(hào)處理線程,設(shè)置應(yīng)用主線程狀態(tài)。

5、向AMS注冊(cè)應(yīng)用,并調(diào)度運(yùn)行

應(yīng)用調(diào)用Attach(),需要向AMS注冊(cè)表項(xiàng)資源。

MainThread是IRemoteStub子類(lèi),向AMS注冊(cè)反向死亡通知,應(yīng)用退出能及時(shí)釋放AMS相關(guān)資源。

獲取AppMgr Proxy對(duì)象 AttachApplication之后,AMS調(diào)度Application狀態(tài)。

說(shuō)明:

MainThread、AMS、ABMS運(yùn)行在不同進(jìn)程中,其中AMS、ABMS是SA,使用ohos IPC機(jī)制通信。

1.MainThread 是IRemoteStub 子類(lèi),是一個(gè)匿名IPC對(duì)象(匿名這里指的是沒(méi)有注冊(cè)到samgr,無(wú)said),反向死亡通知到AMS,應(yīng)用結(jié)束時(shí)候可以通知AMS回收已分配的AppRunningRecord資源。

2.AppThread(應(yīng)用主線程,即MainThread)向AMS發(fā)送APP_ATTACH_APPLICATION請(qǐng)求并置MainThread狀態(tài)為Attach,AMS側(cè)收到請(qǐng)求創(chuàng)建appRecord,標(biāo)記APP_STATE_CREATE。

3.AMS判斷appRecord 為ApplicationState::APP_STATE_CREATE,向Application發(fā)送SCHEDULE_LAUNCH_APPLICATION_TRANSACTION請(qǐng)求。

4.AMS標(biāo)記appRecord狀態(tài)為APP_STATE_READY。

5.AppThread接收到AMS的SCHEDULE_LAUNCH_APPLICATION_TRANSACTION請(qǐng)求后,調(diào)用ScheduleLaunchApplication向MainThread投遞任務(wù)。

void MainThread::ScheduleLaunchApplication(const AppLaunchData &data, const Configuration &config)        {            ......            wptr weak = this;            auto task = [weak, data, config]()            {                auto appThread = weak.promote();                if (appThread == nullptr)                {                    HILOG_ERROR("appThread is nullptr, HandleLaunchApplication failed.");                    return;                }                appThread->HandleLaunchApplication(data, config);            };            if (!mainHandler_->PostTask(task))            ......        }

該task被執(zhí)行時(shí)調(diào)用MainThread::HandleLaunchApplication,調(diào)用LoadAbilityLibrary(如加載libace.z.so等庫(kù)保存句柄)、LoadNativeLiabrary、LoadAppLibrary、設(shè)置Application上下文信息、從BundleMgr獲取Bundle信息、初始化資源管理器InitResourceManager。(此處有區(qū)分應(yīng)用模型,一般是FA模型或者Stage,不做詳細(xì)介紹,有興趣自己研究)。

6.AppThread收到AMS的SCHEDULE_LAUNCH_ABILITY_TRANSACTION請(qǐng)求,調(diào)用HandleLaunchAbility()->AbilityThread::AbilityThreadMain(),創(chuàng)建AbilityThread,調(diào)用AbilityThread::Attach(),依據(jù)AbilityType創(chuàng)建相應(yīng)的Ability(這里以AceAbility為例),初始化Ability 。

Ability 初始化這里有幾處值得注意。

(1)、Ability有若干類(lèi)型如: AceAbility、AceFormAbility、AceServiceAbility、AceDataAbility等,代碼中有相關(guān)類(lèi)。

(2)、創(chuàng)建AbilityThread的AbilityHandler時(shí)候,將MainEventRunner 作為參數(shù)傳入,因此AbilityThread用的還是MainEventRunner事件循環(huán)。

(3)、在這里創(chuàng)建AbilityWindow(初始化等到Ability的OnStart)、注冊(cè)監(jiān)聽(tīng)(AbilityWindow和圖形相關(guān),比較重要)。

if (info && info->type == AbilityType::PAGE) {ability_->SetSceneListener(sptr(new WindowLifeCycleImpl(token_, shared_from_this())));}

備注:AMS在AppMgrServiceInner::LaunchApplication中會(huì)調(diào)用appRecord->LaunchPendingAbilities(),調(diào)度應(yīng)用Ability,感興趣可以自行研究。

void AbilityThread::Attach(std::shared_ptr &application,    const std::shared_ptr &abilityRecord, const std::shared_ptr &mainRunner,    const std::shared_ptr &stageContext){// 1.new AbilityHandler  根據(jù)不同AbilityType獲得abilityNamestd::string abilityName = CreateAbilityName(abilityRecord, application);if (abilityName == "") {    HILOG_ERROR("Attach ability failed, abilityInfo is nullptr.");    return;}HILOG_DEBUG("Attach ability begin, ability:%{public}s.", abilityRecord->GetAbilityInfo()->name.c_str());abilityHandler_ = std::make_shared(mainRunner);if (abilityHandler_ == nullptr) {    HILOG_ERROR("Attach ability failed, abilityHandler_ is nullptr.");    return;}// 2.new ability  創(chuàng)建不同的ability,這里以AceAbility為例auto ability = AbilityLoader::GetInstance().GetAbilityByName(abilityName);if (ability == nullptr) {    HILOG_ERROR("Attach ability failed, load ability failed.");    return;}......// 3.new abilityImplabilityImpl_ =    DelayedSingleton::GetInstance()->MakeAbilityImplObject(abilityRecord->GetAbilityInfo());if (abilityImpl_ == nullptr) {    HILOG_ERROR("Attach ability failed, abilityImpl_ == nullptr.");    return;}    // 這里初始化abilityWindow及AbilityLifeCycleabilityImpl_->Init(application, abilityRecord, currentAbility_, abilityHandler_, token_, contextDeal);// 4. ability attach : ipcErrCode err = AbilityManagerClient::GetInstance()->AttachAbilityThread(this, token_);if (err != ERR_OK) {    HILOG_ERROR("Attach ability failed, err = %{public}d.", err);    return;}

7.調(diào)用AttachAbilityThread ,want:PARAM_RESV_CALL_TO_FOREGROUND,將Ability調(diào)度到前端。

8.ABMS發(fā)送ATTACH_ABILITY_THREAD請(qǐng)求到AMS。

9.AMS調(diào)用AppThread->ScheduleForegroundApplication()。

10.App線程調(diào)用ScheduleForegroundApplication主要是設(shè)置App狀態(tài),并發(fā)送APP_APPLICATION_FOREGROUNDED通知AMS。

if (((curState_ == APP_STATE_READY) || (curState_ == APP_STATE_BACKGROUND)) && application_ != nullptr) {        application_->OnForeground();        curState_ = APP_STATE_FOREGROUND;        return true;    }

11.AMS收到請(qǐng)求,標(biāo)記相應(yīng)AppRecord狀態(tài)為ApplicationState::APP_STATE_FOREGROUND,應(yīng)用和AMS進(jìn)程狀態(tài)同步。

備注:后續(xù)AMS觸發(fā)ABMS調(diào)用ScheduleAbilityTransaction調(diào)用PageAbilityImpl::HandleAbilityTransaction()->AceAbility::OnStart()、Ability::OnStart() InitWindow初始化窗口、加載Dom控件樹(shù)、圖形渲染等。

??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??

??清一色開(kāi)源基礎(chǔ)軟件社區(qū)??

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

標(biāo)簽:

精彩放送