一篇帶你了解Ability啟動(dòng)過(guò)程
??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??
??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??
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)用命令:
2、fork子進(jìn)程(aka.應(yīng)用)
AppSpawnChild中執(zhí)行應(yīng)用啟動(dòng)前步驟,如清理環(huán)境、權(quán)限鑒權(quán)等后,調(diào)用content->runChildProcessor(content, client)。
3、應(yīng)用主線程Start
在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類圖:
說(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初始化
拉起看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<IAppScheduler>子類,向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<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ù)。
該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),比較重要)。
備注:AMS在AppMgrServiceInner::LaunchApplication中會(huì)調(diào)用appRecord->LaunchPendingAbilities(),調(diào)度應(yīng)用Ability,感興趣可以自行研究。
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。
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):??