成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇帶你了解Ability啟動過程

系統 OpenHarmony
Ability可以分為FA(Feature Ability)和PA(Particle Ability)兩種類型,每種類型為開發者提供了不同的模板,以便實現不同的業務功能。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

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

Ability是應用所具備能力的抽象,也是應用程序的重要組成部分。一個應用可以具備多種能力(即可以包含多個Ability),OpenHarmony OS支持應用以Ability為單位進行部署。Ability可以分為FA(Feature Ability)和PA(Particle Ability)兩種類型,每種類型為開發者提供了不同的模板,以便實現不同的業務功能。

以上摘自官方文檔,本文簡要介紹Page應用(AceAbility為例)啟動過程 ,減少入手難度。

1、AppSpawn進程響應應用start請求

啟動應用命令:

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 調用OnReceiveRequest()處理請求,fork子進程 *childPid = AppSpawnFork(AppSpawnChild, (void *)sandbox);

2、fork子進程(aka.應用)

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

Ability啟動過程-開源基礎軟件社區

AppSpawnChild中執行應用啟動前步驟,如清理環境、權限鑒權等后,調用content->runChildProcessor(content, client)。

3、應用主線程Start

//startup/appspawn/adapter/appspawn_ace.cpp

Ability啟動過程-開源基礎軟件社區

在Start()中裝備應用MainThread的EventRunner和MainHandler,在EventRunner::Run等待event分發處理和event循環,這里是應用的主線程,也負責拉起其他的線程。這里有必要簡要說明OHOS的事件通知機制。

ohos基礎框架中的notification機制

代碼路徑:

Ability啟動過程-開源基礎軟件社區

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

UML類圖:

Ability啟動過程-開源基礎軟件社區

說明:

(1). EventHandler負責投遞封裝好的event到EventRunner的EventQueue中,并提供ProcessEvent接口供子類重寫業務邏輯。

(2). EventRunner負責線程運行的抽象,實際線程運行委托給EventInnerRunner實現。

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

4、MainThread::Init初始化

Ability啟動過程-開源基礎軟件社區

拉起看DFX的看門狗線程和信號處理線程,設置應用主線程狀態。

5、向AMS注冊應用,并調度運行

應用調用Attach(),需要向AMS注冊表項資源。

Ability啟動過程-開源基礎軟件社區

MainThread是IRemoteStub<IAppScheduler>子類,向AMS注冊反向死亡通知,應用退出能及時釋放AMS相關資源。

獲取AppMgr Proxy對象 AttachApplication之后,AMS調度Application狀態。

Ability啟動過程-開源基礎軟件社區

說明:

MainThread、AMS、ABMS運行在不同進程中,其中AMS、ABMS是SA,使用ohos IPC機制通信。

1.MainThread 是IRemoteStub<IAppScheduler> 子類,是一個匿名IPC對象(匿名這里指的是沒有注冊到samgr,無said),反向死亡通知到AMS,應用結束時候可以通知AMS回收已分配的AppRunningRecord資源。

2.AppThread(應用主線程,即MainThread)向AMS發送APP_ATTACH_APPLICATION請求并置MainThread狀態為Attach,AMS側收到請求創建appRecord,標記APP_STATE_CREATE。

3.AMS判斷appRecord 為ApplicationState::APP_STATE_CREATE,向Application發送SCHEDULE_LAUNCH_APPLICATION_TRANSACTION請求。

4.AMS標記appRecord狀態為APP_STATE_READY。

5.AppThread接收到AMS的SCHEDULE_LAUNCH_APPLICATION_TRANSACTION請求后,調用ScheduleLaunchApplication向MainThread投遞任務。

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被執行時調用MainThread::HandleLaunchApplication,調用LoadAbilityLibrary(如加載libace.z.so等庫保存句柄)、LoadNativeLiabrary、LoadAppLibrary、設置Application上下文信息、從BundleMgr獲取Bundle信息、初始化資源管理器InitResourceManager。(此處有區分應用模型,一般是FA模型或者Stage,不做詳細介紹,有興趣自己研究)。

6.AppThread收到AMS的SCHEDULE_LAUNCH_ABILITY_TRANSACTION請求,調用HandleLaunchAbility()->AbilityThread::AbilityThreadMain(),創建AbilityThread,調用AbilityThread::Attach(),依據AbilityType創建相應的Ability(這里以AceAbility為例),初始化Ability 。

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

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

(2)、創建AbilityThread的AbilityHandler時候,將MainEventRunner 作為參數傳入,因此AbilityThread用的還是MainEventRunner事件循環。

(3)、在這里創建AbilityWindow(初始化等到Ability的OnStart)、注冊監聽(AbilityWindow和圖形相關,比較重要)。

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

備注:AMS在AppMgrServiceInner::LaunchApplication中會調用appRecord->LaunchPendingAbilities(),調度應用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 根據不同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 創建不同的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.調用AttachAbilityThread ,want:PARAM_RESV_CALL_TO_FOREGROUND,將Ability調度到前端。

8.ABMS發送ATTACH_ABILITY_THREAD請求到AMS。

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

10.App線程調用ScheduleForegroundApplication主要是設置App狀態,并發送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收到請求,標記相應AppRecord狀態為ApplicationState::APP_STATE_FOREGROUND,應用和AMS進程狀態同步。

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

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

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

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區
相關推薦

2021-05-20 06:57:16

RabbitMQ開源消息

2021-07-14 08:24:23

TCPIP 通信協議

2021-07-28 10:02:54

建造者模式代碼

2021-06-30 00:20:12

Hangfire.NET平臺

2023-05-12 08:19:12

Netty程序框架

2021-08-11 07:02:21

npm包管理器工具

2021-11-24 08:51:32

Node.js監聽函數

2021-08-02 06:34:55

Redis刪除策略開源

2021-11-08 08:42:44

CentOS Supervisor運維

2021-12-15 11:52:34

GPLLinuxGNU

2021-07-08 06:30:03

Linux CPULinux 系統

2021-08-14 10:01:43

Python條件語句Python基礎

2021-08-26 05:27:08

Base64 字節流算法

2022-02-17 08:35:59

OLTPOLAP數據倉庫

2022-11-10 16:55:41

ReactFiber

2021-06-04 09:56:01

JavaScript 前端switch

2021-02-02 18:39:05

JavaScript

2020-11-10 10:48:10

JavaScript屬性對象

2021-01-29 18:41:16

JavaScript函數語法

2022-02-23 09:36:11

GoRuby編程語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 最新高清无码专区 | 懂色中文一区二区三区在线视频 | 美女视频一区二区 | 欧美精三区欧美精三区 | 一道本视频 | 亚洲成人网在线播放 | 99久久婷婷国产精品综合 | 日本黄视频在线观看 | 久久久久av| 极品一区| 秋霞国产| 在线观看国产h | 日韩一二区 | 国产69精品久久99不卡免费版 | 亚洲一区二区三 | 成人在线视频免费观看 | 久久青 | 天天玩天天操天天干 | 中文字幕乱码一区二区三区 | 国产免费又色又爽又黄在线观看 | 国产精品2 | 欧美久久久网站 | 一级片av | 国产精品无码久久久久 | 岛国毛片 | 综合色播 | 国产原创在线观看 | 日韩视频一区二区 | 日本超碰| 亚洲区一区二区 | 成人网址在线观看 | 国产一区二区三区四区 | 午夜影视 | 自拍视频网站 | 欧美日韩综合 | 国产一级淫片a直接免费看 免费a网站 | 国产精品久久久久无码av | 欧美久久视频 | 99re在线视频观看 | 九九久久国产 | 国产人免费人成免费视频 |