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

一篇帶你了解Ability啟動(dòng)過(guò)程

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

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

??51CTO 開(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)兩種類型,每種類型為開(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 <ability-name> -b <bundle-name>
e.g. aa start -a com.example.myapplication.MainAbility -b com.example.myapplication
//startup/appspawn/standard/appspawn_service.c
appspawn_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);

Ability啟動(dòng)過(guò)程-開(kāi)源基礎(chǔ)軟件社區(qū)

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

Ability啟動(dòng)過(guò)程-開(kāi)源基礎(chǔ)軟件社區(qū)

在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ī)制

代碼路徑:

Ability啟動(dòng)過(guò)程-開(kāi)源基礎(chǔ)軟件社區(qū)

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

UML類圖:

Ability啟動(dòng)過(guò)程-開(kāi)源基礎(chǔ)軟件社區(qū)

說(shuō)明:

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

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

(3). EventInnerRunner/EventRunnerImpl類是線程運(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初始化

Ability啟動(dòng)過(guò)程-開(kāi)源基礎(chǔ)軟件社區(qū)

拉起看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)資源。

Ability啟動(dòng)過(guò)程-開(kāi)源基礎(chǔ)軟件社區(qū)

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

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

Ability啟動(dòng)過(guò)程-開(kāi)源基礎(chǔ)軟件社區(qū)

說(shuō)明:

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

1.MainThread 是IRemoteStub<IAppScheduler> 子類,是一個(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<MainThread> 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有若干類型如: AceAbility、AceFormAbility、AceServiceAbility、AceDataAbility等,代碼中有相關(guān)類。

(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<WindowLifeCycleImpl>(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<OHOSApplication> &application,
const std::shared_ptr<AbilityLocalRecord> &abilityRecord, const std::shared_ptr<EventRunner> &mainRunner,
const std::shared_ptr<AbilityRuntime::Context> &stageContext)
{
// 1.new AbilityHandler 根據(jù)不同AbilityType獲得abilityName
std::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<AbilityHandler>(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 abilityImpl
abilityImpl_ =
DelayedSingleton<AbilityImplFactory>::GetInstance()->MakeAbilityImplObject(abilityRecord->GetAbilityInfo());
if (abilityImpl_ == nullptr) {
HILOG_ERROR("Attach ability failed, abilityImpl_ == nullptr.");
return;
}
// 這里初始化abilityWindow及AbilityLifeCycle
abilityImpl_->Init(application, abilityRecord, currentAbility_, abilityHandler_, token_, contextDeal);
// 4. ability attach : ipc
ErrCode 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):??

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

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

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

2021-05-20 06:57:16

RabbitMQ開(kāi)源消息

2023-05-12 08:19:12

Netty程序框架

2021-06-30 00:20:12

Hangfire.NET平臺(tái)

2021-07-28 10:02:54

建造者模式代碼

2021-07-14 08:24:23

TCPIP 通信協(xié)議

2021-08-11 07:02:21

npm包管理器工具

2021-08-02 06:34:55

Redis刪除策略開(kāi)源

2021-11-08 08:42:44

CentOS Supervisor運(yùn)維

2021-11-24 08:51:32

Node.js監(jiān)聽(tīng)函數(shù)

2021-12-15 11:52:34

GPLLinuxGNU

2020-11-10 10:48:10

JavaScript屬性對(duì)象

2021-01-29 18:41:16

JavaScript函數(shù)語(yǔ)法

2021-02-02 18:39:05

JavaScript

2021-06-04 09:56:01

JavaScript 前端switch

2022-11-10 16:55:41

ReactFiber

2021-08-14 10:01:43

Python條件語(yǔ)句Python基礎(chǔ)

2021-07-08 06:30:03

Linux CPULinux 系統(tǒng)

2022-02-23 09:36:11

GoRuby編程語(yǔ)言

2022-02-17 08:35:59

OLTPOLAP數(shù)據(jù)倉(cāng)庫(kù)

2021-08-26 05:27:08

Base64 字節(jié)流算法
點(diǎn)贊
收藏

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