

OpenHarmony-UI框架适配层浅析之一
source link: https://os.51cto.com/article/706782.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

方舟开发框架(简称:ArkUI),是一套UI开发框架,提供开发者进行应用UI开发时所必须的能力。提供跨平台能力,集成了类Web开发范式与声明式开发范式两种开发范式。框架分为应用层、框架层、渲染引擎、平台适配和桥接层。本文主要对适配层的部分核心类进行简单介绍,通过这些核心类的关系图和流程交互说明来一窥适配层的部分面貌。
核心类简介
- AceEngine: 全局唯一,提供实例的开门狗注册、垃圾回收能力,同时也作为AceContainer的容器。
- AceContainer:顾名思义,是一个容器类,由前端、任务执行器、资源管理器、渲染管线、视图等聚合而成,提供了生命周期对接、功能调度接口和UI渲染的各项能力,是平台适配中非常重要的模块。
- AceAbility: 对应的是FA模型中的PageAbility,是用户具体可见并可以交互的Ability实例。
- Frontend: 前端框架的抽象,由DeclarativeFrontend、JsFrontend和CardFrontend继承来实现声明式、类WEB及Card方式的实现。
- PlatformEventCallback:平台事件回调的抽象,不同ability实现各自的回调接口。目前仅支持OnFinish和OnStatusBarBgColorChanged两个事件的回调。
- AssetManager: 资源管理器的抽象,由FlutterAssetManager实现,最终由FileAssetProvider提供资源文件加载。
- AceView: 渲染生成视图节点。
- TaskExecutor: 任务管理器。
- PipelineContext: 渲染管线。
- PlatformResRegister: 平台资源的注册和管理,通过接口回调实现平台层的渲染。
这里我们以一个典型的APP窗口尺寸发生变化的实现流程来帮助大家理解ACE框架类之间是如何交互的,参见时序图:
步骤说明:
- WindowImpl窗口对象感知窗口发生变化,调用监听者的OnSizeChange方法。
- 根据ability ID获取对应的AceContainer。
- 从AceContainer中获取TaskExecutor任务管理器。
- 通过任务管理器创建任务。
- 从AceContainer中获取当前View。
- 调用FlutterAceView::SurfaceChanged处理界面的变化。
- FlutterAceView回调AceContainer注册的viewChangeCallback方法。
- viewChangeCallback从PipelineContext渲染管线对象中获取TaskExecutor任务管理器。
- 通过任务管理器创建任务。
- 任务方法调用渲染管线PipelineContext::OnSurfaceChanged方法处理。
- 渲染管线最终调用前端框架OnSurfaceChanged处理界面发生的变化。
关键代码实现:
AceAbility继承自OHOS::Rosen::IWindowChangeListener,作为监听者在OnStart启动的时候向windows对象进行了注册。
void AceAbility::OnStart(const Want& want) {
...
// register surface change callback
OHOS::sptr<OHOS::Rosen::IWindowChangeListener> thisAbility(this);
window->RegisterWindowChangeListener(thisAbility);
...
}
当界面发生变化,WindowImpl::UpdateRect调用监听者的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()回调函数。
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用户程序的开发本质上就是开发Ability。OpenHarmony系统是通过对Ability调度,结合系统提供的一致性调度契约对Ability进行生命周期管理,从而实现对用户程序的调度。
Ability框架在API 8及更早版本使用FA模型。FA模型中Ability分为PageAbility、ServiceAbility、DataAbility、FormAbility几种类型。其中:
- PageAbility是具备ArkUI实现的Ability,是用户具体可见并可以交互的Ability实例。
- ServiceAbility也是Ability一种,但是没有UI,提供其他Ability调用自定义的服务,在后台运行。
- DataAbility也是没有UI的Ability,提供其他Ability进行数据的增删查服务,在后台运行。
- FormAbility是卡片Ability,是一种界面展示形式。
AceAbility对应的是FA模型中的PageAbility,和AceContainer容器类搭配管理。其它几种ability在ACE框架中分别对应AceDataAbility、AceFormAbility和AceServiceAbility,使用PaContainer容器类进行管理,关系如下图:
- AceAbility是带UI界面的Ability,非UI界面的ability是AceDataAbility、AceFormAbility和AceServiceAbility。
- AceContainer是一个容器,聚合了前端、渲染管线和任务执行器等核心功能,相当于一个大总管,ability的关键流程都要经过它调度。
- 通过Frontend、PlatformEventCallback、AssetManager和AceView等抽象类,提供了对平台的抽象,通过扩展实现,满足不同平台的适配。
方舟开发框架概述:
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。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK