OpenHarmony-UI框架適配層淺析之一
??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??
前言
方舟開發(fā)框架(簡稱:ArkUI),是一套UI開發(fā)框架,提供開發(fā)者進(jìn)行應(yīng)用UI開發(fā)時所必須的能力。提供跨平臺能力,集成了類Web開發(fā)范式與聲明式開發(fā)范式兩種開發(fā)范式??蚣芊譃閼?yīng)用層、框架層、渲染引擎、平臺適配和橋接層。本文主要對適配層的部分核心類進(jìn)行簡單介紹,通過這些核心類的關(guān)系圖和流程交互說明來一窺適配層的部分面貌。
核心類簡介
類關(guān)系圖
- AceEngine: 全局唯一,提供實例的開門狗注冊、垃圾回收能力,同時也作為AceContainer的容器。
- AceContainer:顧名思義,是一個容器類,由前端、任務(wù)執(zhí)行器、資源管理器、渲染管線、視圖等聚合而成,提供了生命周期對接、功能調(diào)度接口和UI渲染的各項能力,是平臺適配中非常重要的模塊。
- AceAbility: 對應(yīng)的是FA模型中的PageAbility,是用戶具體可見并可以交互的Ability實例。
- Frontend: 前端框架的抽象,由DeclarativeFrontend、JsFrontend和CardFrontend繼承來實現(xiàn)聲明式、類WEB及Card方式的實現(xiàn)。
- PlatformEventCallback:平臺事件回調(diào)的抽象,不同ability實現(xiàn)各自的回調(diào)接口。目前僅支持OnFinish和OnStatusBarBgColorChanged兩個事件的回調(diào)。
- AssetManager: 資源管理器的抽象,由FlutterAssetManager實現(xiàn),最終由FileAssetProvider提供資源文件加載。
- AceView: 渲染生成視圖節(jié)點(diǎn)。
- TaskExecutor: 任務(wù)管理器。
- PipelineContext: 渲染管線。
- PlatformResRegister: 平臺資源的注冊和管理,通過接口回調(diào)實現(xiàn)平臺層的渲染。
協(xié)作說明
這里我們以一個典型的APP窗口尺寸發(fā)生變化的實現(xiàn)流程來幫助大家理解ACE框架類之間是如何交互的,參見時序圖:
步驟說明:
- WindowImpl窗口對象感知窗口發(fā)生變化,調(diào)用監(jiān)聽者的OnSizeChange方法。
- 根據(jù)ability ID獲取對應(yīng)的AceContainer。
- 從AceContainer中獲取TaskExecutor任務(wù)管理器。
- 通過任務(wù)管理器創(chuàng)建任務(wù)。
- 從AceContainer中獲取當(dāng)前View。
- 調(diào)用FlutterAceView::SurfaceChanged處理界面的變化。
- FlutterAceView回調(diào)AceContainer注冊的viewChangeCallback方法。
- viewChangeCallback從PipelineContext渲染管線對象中獲取TaskExecutor任務(wù)管理器。
- 通過任務(wù)管理器創(chuàng)建任務(wù)。
- 任務(wù)方法調(diào)用渲染管線PipelineContext::OnSurfaceChanged方法處理。
- 渲染管線最終調(diào)用前端框架OnSurfaceChanged處理界面發(fā)生的變化。
關(guān)鍵代碼實現(xiàn):
AceAbility繼承自O(shè)HOS::Rosen::IWindowChangeListener,作為監(jiān)聽者在OnStart啟動的時候向windows對象進(jìn)行了注冊。
void AceAbility::OnStart(const Want& want) {
// register surface change callback
OHOS::sptr<OHOS::Rosen::IWindowChangeListener> thisAbility(this);
window->RegisterWindowChangeListener(thisAbility);
}
當(dāng)界面發(fā)生變化,WindowImpl::UpdateRect調(diào)用監(jiān)聽者的OnSizeChange處理。
void WindowImpl::UpdateRect(const struct Rect& rect, WindowSizeChangeReason reason)
{
for (auto& listener : windowChangeListeners_) {
if (listener != nullptr) {
listener->OnSizeChange(rect, reason);
}
}
AceAbility::OnSizeChange()。
void AceAbility::OnSizeChange(OHOS::Rosen::Rect rect, OHOS::Rosen::WindowSizeChangeReason reason)
{
auto container = Platform::AceContainer::GetContainer(abilityId_);
auto taskExecutor = container->GetTaskExecutor();
taskExecutor->PostTask([rect, abilityId = abilityId_, density = density_, reason]() {
auto flutterAceView = static_cast<Platform::FlutterAceView*>(container->GetView());
Platform::FlutterAceView::SurfaceChanged(
flutterAceView, width, height, 0, static_cast<WindowSizeChangeReason>(reason));
}, TaskExecutor::TaskType::PLATFORM);
}
Platform::FlutterAceView::SurfaceChanged()。
void FlutterAceView::SurfaceChanged(
FlutterAceView* view, int32_t width, int32_t height, int32_t orientation, WindowSizeChangeReason type)
{
view->NotifySurfaceChanged(width, height, type);
auto platformView = view->GetShellHolder()->GetPlatformView();
if (platformView) {
platformView->NotifyChanged(SkISize::Make(width, height));
}
}
viewChangeCallback()回調(diào)函數(shù)。
auto&& viewChangeCallback = [context = pipelineContext_, id = instanceId_](
int32_t width, int32_t height, WindowSizeChangeReason type) {
ContainerScope scope(id);
ACE_SCOPED_TRACE("ViewChangeCallback(%d, %d)", width, height);
context->GetTaskExecutor()->PostTask(
[context, width, height, type]() { context->OnSurfaceChanged(width, height, type); },
TaskExecutor::TaskType::UI);
};
aceView_->RegisterViewChangeCallback(viewChangeCallback);
PipelineContext::OnSurfaceChanged()。
void PipelineContext::OnSurfaceChanged(int32_t width, int32_t height, WindowSizeChangeReason type)
{
auto frontend = weakFrontend_.Upgrade();
if (frontend) {
frontend->OnSurfaceChanged(width, height);
}
}
延伸
OpenHarmony用戶程序的開發(fā)本質(zhì)上就是開發(fā)Ability。OpenHarmony系統(tǒng)是通過對Ability調(diào)度,結(jié)合系統(tǒng)提供的一致性調(diào)度契約對Ability進(jìn)行生命周期管理,從而實現(xiàn)對用戶程序的調(diào)度。
Ability框架在API 8及更早版本使用FA模型。FA模型中Ability分為PageAbility、ServiceAbility、DataAbility、FormAbility幾種類型。其中:
- PageAbility是具備ArkUI實現(xiàn)的Ability,是用戶具體可見并可以交互的Ability實例。
- ServiceAbility也是Ability一種,但是沒有UI,提供其他Ability調(diào)用自定義的服務(wù),在后臺運(yùn)行。
- DataAbility也是沒有UI的Ability,提供其他Ability進(jìn)行數(shù)據(jù)的增刪查服務(wù),在后臺運(yùn)行。
- FormAbility是卡片Ability,是一種界面展示形式。
AceAbility對應(yīng)的是FA模型中的PageAbility,和AceContainer容器類搭配管理。其它幾種ability在ACE框架中分別對應(yīng)AceDataAbility、AceFormAbility和AceServiceAbility,使用PaContainer容器類進(jìn)行管理,關(guān)系如下圖:
小結(jié)
- AceAbility是帶UI界面的Ability,非UI界面的ability是AceDataAbility、AceFormAbility和AceServiceAbility。
- AceContainer是一個容器,聚合了前端、渲染管線和任務(wù)執(zhí)行器等核心功能,相當(dāng)于一個大總管,ability的關(guān)鍵流程都要經(jīng)過它調(diào)度。
- 通過Frontend、PlatformEventCallback、AssetManager和AceView等抽象類,提供了對平臺的抽象,通過擴(kuò)展實現(xiàn),滿足不同平臺的適配。
參考鏈接
方舟開發(fā)框架概述:
https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ui/arkui-overview.md。
Ability框架概述:
https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ability/ability-brief.md。
FA模型綜述:
https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ability/fa-brief.md。
OpenHarmony 源碼解析之ACE:
https://ost.51cto.com/posts/7908。
??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??