OpenHarmony源码解析之Ability运行时调用流程介绍 原创
作者:苟晶晶
1 简介
Ability是应用所具备能力的抽象,也是程序的重要组成部分。OpenHarmony的Ability子系统提供了Ability启动及其生命周期管理的功能。Ability框架模型结构分为FA模型和Stage模型,FA模型Ability 分为 FA (Feature Ability) 和 PA (Particle Ability)两种类,其中 FA 支持 Page Ability,PA 支持 Service Ability 和 Data Ability。本文主要介绍基于FA模型的Page Ability运行时介绍,启动流程贯穿了应用程序用户进程、系统服务进程,其中客户端与服务端发送消息主要采用IPC通信。
1.1 OpenHarmony架构图
1.2 代码目录
2 Ability运行时及生命周期介绍
2.1 启动应用的简图
AbilityManagerService是应用线程管理服务核心类,是操作各类Ability方法的入口。
AppMgrService是应用管理服务主线程类,实现了IPC调用IAppMgr的接口,并通过AMSEventHandler将进程内各类事件及任务投递到主线程。(注:应用进程与服务管理进程之间,通过IDL实现进程间调用。IAppMgr是进程间调用的接口类。)
AppSpawn是app孵化器,负责接受应用程序框架的命令孵化应用进程,设置其对应权限,并调用应用程序框架的入口。
MainThread是应用进程的核心类。应用进程内的各类事件及任务通过MainThread中mainHandler_投递到主线程并调用MainThread中的方法执行。
AbilityThread是应用线程的核心类,操作各种Ability生命周期及方法的入口都在此类,实现IPC调用的各接口。
AbilityImpl派生出不同的子类,用以差异处理各类型Ability的逻辑,如DataAbilityImpl(Data Ability)、PageAbilityImpl(Page Ability)、ServiceAbilityImpl(Service Ability)、NewAbilityImpl(Stage模型)。
2.2 时序图
2.3 源码分析
限于篇幅,只摘抄重要流程源码
1.应用程序调用JS API startAbility函数,通过NAPI机制,调用到Native层的对应函数 NAPI_StartAbility,之后调用到NAPI中的函数StartAbilityExecuteCB,进入Ability主类的start流程中;在Ability主类中,调用了父类Context的StartAbility函数。
foundation/ability/ability_runtime/frameworks/native/ability/native/ability.cpp
foundation/ability/ability_lite/frameworks/ability_lite/src/ability_context.cpp
2.调用到Ability子系统的Client端,进入IPC调用流程。
foundation/ability/ability_runtime/services/abilitymgr/src/ability_manager_client.cpp
foundation/ability/ability_runtime/services/abilitymgr/src/ability_manager_service.cpp
3.在 MissiionListManager 的流程中,初始化目标Ability映射在系统层的AbilityRecord、MissionRecord、MissionList等结构中,随后进入AbilityRecord的创建流程
foundation/ability/ability_runtime/services/abilitymgr/src/mission_list_manager.cpp
4.调用LoadAbility函数,随后进入AppManagerService(用户程序框架)流程
foundation/ability/ability_runtime/services/abilitymgr/src/ability_record.cpp
foundation/ability/ability_runtime/services/abilitymgr/src/app_scheduler.cpp
进入AppManagerService(用户程序框架)流程
foundation/ability/ability_runtime/interfaces/inner_api/app_manager/src/appmgr/app_mgr_client.cpp
foundation/ability/ability_runtime/services/appmgr/src/ams_mgr_scheduler.cpp
foundation/ability/ability_runtime/services/appmgr/src/app_mgr_service_inner.cpp
5.利用app孵化器fork一个子进程,创建子进程的同时创建该进程的主线程MainThread,启动调用MainThread::Start()方法
foundation/ability/ability_runtime/services/appmgr/src/app_mgr_service_inner.cpp
foundation/ability/ability_runtime/services/appmgr/src/app_spawn_client.cpp
foundation/ability/ability_runtime/services/appmgr/src/app_spawn_msg_wrapper.cpp
base/startup/appspawn/standard/appspawn_service.c
base/startup/appspawn/common/appspawn_server.c
base/startup/appspawn/adapter/appspawn_ace.cpp
6.当目标应用程序进程启动完成后,应用端会通过IPC调用AttachApplication函数,再次调回到AppManagerService端
foundation/ability/ability_runtime/frameworks/native/appkit/app/main_thread.cpp
foundation/ability/ability_runtime/interfaces/inner_api/app_manager/src/appmgr/app_mgr_proxy.cpp
foundation/ability/ability_runtime/interfaces/inner_api/app_manager/src/appmgr/app_mgr_stub.cpp
foundation/ability/ability_runtime/services/appmgr/src/app_mgr_service.cpp
7.函数处理逻辑回到服务层之后,此时目标应用程序端状态准备就绪,AppManagerService会真正进入start待启动的Ability的流程LaunchPendingAbilities函数
foundation/ability/ability_runtime/services/appmgr/src/app_mgr_service_inner.cpp
(1)通过appRecord启动Application
foundation/ability/ability_runtime/services/appmgr/src/app_running_record.cpp
foundation/ability/ability_runtime/services/appmgr/src/app_lifecycle_deal.cpp
foundation/ability/ability_runtime/frameworks/native/appkit/app/main_thread.cpp
(2)启动Ability线程,将Ability线程加载上
foundation/ability/ability_runtime/services/appmgr/src/app_running_record.cpp
foundation/ability/ability_runtime/services/appmgr/src/module_running_record.cpp
8.通过IPC调用ScheduleLaunchAbility函数,将操作传递到目标应用程序端,目标应用程序的相应Ability开始其生命周期切换
foundation/ability/ability_runtime/services/appmgr/src/app_lifecycle_deal.cpp
foundation/ability/ability_runtime/frameworks/native/appkit/app/main_thread.cpp
foundation/ability/ability_runtime/frameworks/native/ability/native/ability_thread.cpp
通过ipc调用AbilityManagerService的AttachAbilityThread
foundation/ability/ability_runtime/services/abilitymgr/src/ability_manager_service.cpp
foundation/ability/ability_runtime/services/abilitymgr/src/mission_list_manager.cpp
/foundation/ability/ability_runtime/services/abilitymgr/src/app_scheduler.cpp
通过IPC调用,进入AppManagerService(用户程序框架)流程,更新ability状态
foundation\aafwk\standard\services\appmgr\src\app_mgr_service_inner.cpp
foundation\aafwk\standard\services\appmgr\src\app_running_record.cpp
9.通过IPC调用应用程序的ScheduleForegroundApplication, 从AppLifeCycle到MainThread
foundation/ability/ability_runtime/services/appmgr/src/app_lifecycle_deal.cpp
客户端发送SCHEDULE_FOREGROUND_APPLICATION_TRANSACTION请求
/foundation/ability/ability_runtime/interfaces/inner_api/app_manager/src/appmgr/app_scheduler_proxy.cpp
服务端收到SCHEDULE_FOREGROUND_APPLICATION_TRANSACTION请求
foundation/ability/ability_runtime/interfaces/inner_api/app_manager/src/appmgr/app_scheduler_host.cpp
foundation/ability/ability_runtime/frameworks/native/appkit/app/main_thread.cpp
10.通过IPC调用AppMgrService的HandleApplicationForegrounded, 从MainThred到AppMgrService
客户端发送 APP_APPLICATION_FOREGROUNDED 请求
foundation/ability/ability_runtime/interfaces/inner_api/app_manager/src/appmgr/app_mgr_proxy.cpp
服务端收到 APP_APPLICATION_FOREGROUNDED 请求
foundation/ability/ability_runtime/interfaces/inner_api/app_manager/src/appmgr/app_mgr_stub.cpp
foundation/ability/ability_runtime/services/appmgr/src/app_mgr_service.cpp
foundation/ability/ability_runtime/services/appmgr/src/app_mgr_service_inner.cpp
- 从AppMgrService到AbilityThread
foundation/ability/ability_runtime/services/appmgr/src/app_running_record.cpp
foundation/ability/ability_runtime/services/appmgr/src/module_running_record.cpp
foundation/ability/ability_runtime/services/appmgr/src/app_mgr_service_inner.cpp
foundation/ability/ability_runtime/services/abilitymgr/src/app_scheduler.cpp
foundation/ability/ability_runtime/services/abilitymgr/src/ability_manager_service.cpp
foundation/ability/ability_runtime/services/abilitymgr/src/mission_list_manager.cpp
foundation/ability/ability_runtime/services/abilitymgr/src/ability_record.cpp
通过IPC调用应用程序的Ability线程的ForegroundNew
foundation\aafwk\standard\services\abilitymgr\src\lifecycle_deal.cpp
客户端发送 SCHEDULE_ABILITY_TRANSACTION
foundation/ability/ability_runtime/services/abilitymgr/src/ability_scheduler_proxy.cpp
服务端收到 SCHEDULE_ABILITY_TRANSACTION
foundation/ability/ability_runtime/services/abilitymgr/src/ability_scheduler_stub.cpp
foundation/ability/ability_runtime/frameworks/native/ability/native/ability_thread.cpp
foundation/ability/ability_runtime/frameworks/native/ability/native/page_ability_impl.cpp
foundation\aafwk\standard\frameworks\kits\ability\native\src\ability_impl.cpp
3 总结
Ability 子系统与用户程序框架,ArkUI以及图形子系统联系紧密,对于系统开发者/ 应用开发者来说,都很有必要去深入了解。以上流程简要阐述了启动PageAbility的流程;通过本例,可以大致了解Ability运行时调用的重要方法与类,从而了解启动PageAbility的大致框架流程;本篇文档并未深究细节,若需了解更多Ability子系统相关知识,后续内容会持续发布。
更多原创内容请关注:深开鸿技术团队
入门到精通、技巧到案例,系统化分享OpenHarmony开发技术,欢迎投稿和订阅,让我们一起携手前行共建生态。
老师时序图能传一份到附件中吗,文中的实在看不清
老师时序图能传一份到附件中吗,文中的实在看不清
老师时序图能传一份到附件中吗,文中的实在看不清
老师时序图能传一份到附件中吗,文中的实在看不清