用户程序框架子系统

简介

用户程序框架子系统包含两个大的模块:元能力子系统和包管理子系统。

元能力子系统,是OpenHarmony为开发者提供的一套开发OpenHarmony应用的开发框架。元能力子系统由如下模块组成:

图1 元能力子系统框架图

用户程序框架子系统 - 图1

Ability是应用所具备的能力的抽象,一个应用可以包含一个或多个Ability。Ability分为两种类型:FA(Feature Ability)和AA(Atomic Ability)。

  • FA:由三方基于元能力框架开发的、实现单一功能的有UI界面的程序实体,用于支持与用户交互的能力。一个Page实例可以包含一组相关页面,每个页面用一个AbilitySlice实例表示。Page模板是Feature Ability唯一支持的模板。用户可以基于JavaScript语言开发FA,也可以基于C/C++语言开发FA。

    • Page模板的Ability的生命周期流转图

    图2 Ability生命周期流转图

    用户程序框架子系统 - 图2Page模板的Ability生命周期各状态解析

    • UNINITIALIZED:未初始状态,为临时状态,Ability创建后会直接调用Init初始化,进入INITIAL状态;

    • INITIAL:初始化状态,也表示停止状态,表示当前Ability未运行,调用Start后进入INACTIVE,同时回调开发者的OnSatrt生命周期回调;

    • INACTIVE:未激活状态,表示当前窗口已显示但是无焦点状态,由于Window暂未支持焦点的概念,当前状态与ACTIVE一致。调用Active后进入ACTIVE,同时回调开发者的OnActive生命周期回调;调用Background后进入BACKGROUND,同时回调开发者的OnBackground生命周期回调;

    • ACTIVE:前台激活状态,表示当前窗口已显示,并获取焦点。调用Inactive后进入INACTIVE;

    • BACKGROUND: 后台状态,表示当前Ability退到后台。调用Active后进入ACTIVE,同时回调开发者的OnActive生命周期回调;调用Stop后进入INITIAL,同时回调开发者的OnStop生命周期回调;

    • AbilitySlice

      一个使用Page模板的Ability由AbilitySlice构成,AbilitySlice是单个页面及其控制逻辑的总和。一个Page可以包含多个AbilitySlice,此时,这些页面提供的业务能力应当是高度相关的。Page模板的Ability与AbilitySlice的关系如下图:

      图3 Ability与AbilitySlice的关系图

      用户程序框架子系统 - 图3

  • AA:由三方基于元能力框架开发的、实现单一功能的无UI界面的支持后台任务的程序实体。AA与FA的区别是,AA无UI界面。仅对系统服务有依赖关系,AA之间不存在依赖关系 。Service模板是AA支持的模板。
  • 注册Ability

    Ability的模板通过在清单文件中注册时指定。如下所示,开发者可以配置Ability元素的type属性,其取值page、service分别代表Page模板、Service模板。

    1. "module":{
    2. ......
    3. "abilities":[
    4. {
    5. "name":"default",
    6. "type":"pages",
    7. "label":"sdfasf"
    8. }
    9. ],
    10. ......
    11. }
  • AbilityKit:元能力的开发框架,运行在开发者的应用程序进程中,和AbilityMs通过IPC通信,开发者基于该框架开发自己的Ability。

  • AbilityMs:元能力运行管理服务,元能力生命周期的调度统一由AbilityMs管理。

  • AppSpawn:进程孵化器,元能力进程由AppSpawn负责孵化并拉起。

包管理子系统,是OpenHarmony为开发者提供的安装包管理框架。包管理子系统的由如下模块组成:

图4 包管理子系统框架图

用户程序框架子系统 - 图4

  • 包扫描器:用来解析本地预制或者安装的安装包,提取里面的各种信息,供管理子模块进行管理,持久化

  • 包安装子模块:安装,卸载,升级一个包;Installed一个单独进程的用于创建删除安装目录,具有较高的权限。

  • 包管理子模块:管理安装包相关的信息

  • 安全子模块:签名检查、权限授予、权限管理

目录

轻量用户程序框架子系统源代码目录结构如下图所示:

表 1 轻量用户程序用户程序框架子系统源代码目录结构

名称

描述

foundation/aafwk/frameworks/kits/ability_lite

元能力框架核心代码

foundation/aafwk/frameworks/kits/content_lite

元能力之间通信的实体

foundation/aafwk/frameworks/kits/tools_lite

元能力调测工具

foundation/aafwk/interfaces/innerkits/abilitykit_lite

元能力框架对外接口

foundation/aafwk/interfaces/innerkits/abilitymgr_lite

元能力运行管理服务对外接口

foundation/aafwk/interfaces/innerkits/intent_lite

元能力之间通信的实体对外接口

foundation/aafwk/services/abilitymgr_lite

元能力运行管理服务

foundation/appexecfwk/interfaces/innerkits/appexecfwk_lite

用户程序运行的包信息、元能力信息、异步事件处理等基本接口

foundation/appexecfwk/interfaces/innerkits/bundlemgr_lite

用户程序包管理服务对外接口

foundation/appexecfwk/kits/appkit_lite

用户程序运行的包信息、元能力信息、异步事件处理机制的实现逻辑

foundation/appexecfwk/services/bundlemgr_lite

用户程序包管理服务实现逻辑

约束

  • 语言版本

    • C++11版本或以上
  • 框架针对不同的芯片平台和底层OS能力,规格有所区别

    • Cortex-M RAM/ROM:

      • RAM:建议大于20K
      • ROM: > 300K (包含ACE,UIKit及引擎等强相关子系统)
    • Cortex-A RAM/ROM:

      • RAM:建议大于2M
      • ROM:> 2M (包含ACE,UIKit及引擎等强相关子系统)

编译用户程序框架子系统

  • 添加对用户程序框架子系统的编译,以hi3516dv300_liteos_a为例

    • 在build/lite/platform/hi3516dv300_liteos_a/platform.json中的subsystem_list字段下面添加appexecfwk和aafwk,代码如下:
    1. {
    2. "name":"aafwk",
    3. "project":"hmf/aafwk/services/abilitymgr_lite",
    4. "path":"build/lite/config/subsystem/aafwk",
    5. "dir":"foundation/aafwk/services/abilitymgr_lite",
    6. "desc":"Ability Services Manager",
    7. "requirement":"yes",
    8. "default":"yes",
    9. "selected":"yes"
    10. },
    11. {
    12. "name":"appexecfwk",
    13. "project":"hmf/appexecfwk/services/bundlemgr_lite",
    14. "path":"build/lite/config/subsystem/appexecfwk",
    15. "dir":"foundation/appexecfwk/services/bundlemgr_lite",
    16. "desc":"Bundle Services Manager",
    17. "requirement":"yes",
    18. "default":"yes",
    19. "selected":"yes"
    20. },
    • 在build/lite/platform/hi3516dv300_liteos_a/template/ipcamera.json的“template_subsystem_list”字段下面添加”appexecfwk”和”aafwk”,代码如下:
    1. "template_subsystem_list":[
    2. ......
    3. "distributedschedule",
    4. "aafwk",
    5. "appexecfwk",
    6. "communication",
    7. ......
    8. ],
    • 在build/lite/config/subsystem/aafwk/BUILD.gn和/build/lite/config/subsystem/appexecfwk/BUILD.gn中添加对用户程序框架中具体组件的编译,如下:
    1. import("//build/lite/config/subsystem/lite_subsystem.gni")
    2. lite_subsystem("aafwk"){
    3. subsystem_components =[
    4. "//foundation/aafwk/frameworks/kits/ability_lite:aafwk_abilitykit_lite",
    5. "//foundation/aafwk/frameworks/kits/ability_lite:aafwk_abilityMain_lite",
    6. "//foundation/aafwk/services/abilitymgr_lite:aafwk_services_lite",
    7. "//foundation/aafwk/frameworks/kits/tools_lite:tools_lite",
    8. "//foundation/aafwk/frameworks/kits/ability_lite/test:aafwk_testapp_lite",
    9. ]
    10. }
    1. import("//build/lite/config/subsystem/lite_subsystem.gni")
    2. lite_subsystem("appexecfwk"){
    3. subsystem_components =[
    4. "//foundation/appexecfwk/kits/appkit_lite:appexecfwk_kit_lite",
    5. "//foundation/appexecfwk/services/bundlemgr_lite:appexecfwk_services_lite",
    6. ]
    7. }
    • 在foundation/aafwk和foundation/appexecfwk下面添加对业务模块的编译,各个模块都有自己的BUILD.gn文件
  • 添加完上述的配置后,执行如下命令编译整个系统:

  1. python build.py ipcamera -p hi3516dv300_liteos_a -b release

运行用户程序框架子系统的两个服务

  • 用户程序框架有两个系统服务AbilityMs和BundleMs,两系统服务运行于foudation进程中。
  • AbilityMs和BundleMs注册到sa_manager中,sa_manager运行于foundation进程中,sa_manager为AbilityMs和BundleMs创建线程运行环境。具体创建AbilityMs、BundleMs服务的方式以及使用该服务的方式,可参考系统服务框架子系统
  • 在foundation/distributedschedule/services/safwk_lite/BUILD.gn中添加对abilityms和bundlems,如下:
  1. deps =[
  2. "//foundation/distributedschedule/services/samgr_lite/samgr_server:server",
  3. "//base/dfx/lite/liteos-a/source/log:hilog_a_shared",
  4. "//foundation/aafwk/services/abilitymgr_lite:abilityms",
  5. "//foundation/appexecfwk/services/bundlemgr_lite:bundlems",
  6. "//base/security/services/iam_lite:pms_target",
  7. "//foundation/distributedschedule/services/dtbschedmgr_lite:dtbschedmgr",
  8. ]

运行基于AbilityKit开发的Ability

  • 基于AbilityKit开发的Ability的Demo代码位于foundation/aafwk/frameworks/kits/ability_lite/test路径下,如有需要修改其中的功能,可在unittest的文件中修改代码或增加代码文件,并在BUILD.gn中做相应的修改。
  • 编译该Demo,在shell中执行如下命令,编译成功后,在out/ipcamera_hi3516dv300_liteos_a下面生成libLauncher.so文件:

    1. python build.py ipcamera -p hi3516dv300_liteos_a -T //foundation/aafwk/frameworks/kits/ability_lite/test:Launcher
  • 编写config.json,内容如下:

  1. {
  2. "app":{
  3. "bundleName":"com.huawei.launcher",
  4. "vendor":"huawei",
  5. "version":{
  6. "code":1,
  7. "name":"1.0"
  8. }
  9. },
  10. "deviceConfig":{
  11. "default":{
  12. "reqSdk":{
  13. "compatible":"zsdk 1.0.0",
  14. "target":"zsdk 1.0.1"
  15. },
  16. "keepAlive":false
  17. },
  18. },
  19. "module":{
  20. "deviceType":[
  21. "smartCamera"
  22. ],
  23. "distro":{
  24. "deliveryWithInstall":true,
  25. "moduleName":"Launcher",
  26. "moduleType":"entry"
  27. },
  28. "abilities":[{
  29. "name":"MainAbility",
  30. "icon":"res/drawable/phone.png",
  31. "label":"test app 1",
  32. "launchType":"standard",
  33. "type":"page",
  34. "visible":true
  35. },
  36. {
  37. "name":"SecondAbility",
  38. "icon":"res/drawable/phone.png",
  39. "label":"test app 2",
  40. "launchType":"standard",
  41. "type":"page",
  42. "visible":true
  43. },
  44. {
  45. "name":"ServiceAbility",
  46. "icon":"res/drawable/phone.png",
  47. "label":"test app 2",
  48. "launchType":"standard",
  49. "type":"service",
  50. "visible":true
  51. }
  52. ]
  53. }
  54. }
  • 生成hap包

    • 按照如下目录结构存放文件,res/drawable下面放置资源文件:

      用户程序框架子系统 - 图5

    • 将上述文件打包生成zip包,修改后缀为.hap,例如Launcher.hap

  • 安装hap包

    • 将上述hap包放置到指定目录下面
    • 执行安装命令,安装hap包:
    1. ./bin/bm install -p /nfs/hap/Launcher.hap
  • 安装完成后,通过如下命令,运行Demo

  1. ./bin/aa start -p com.huawei.launcher -n MainAbility

涉及仓

aafwk_frameworks_kits_ability_lite

aafwk_interfaces_innerkits_abilitykit_lite

aafwk_frameworks_kits_content_lite

aafwk_interfaces_innerkits_abilitymgr_lite

aafwk_interfaces_innerkits_intent_lite

aafwk_interfaces_kits_ability_lite

aafwk_services_abilitymgr_lite

appexecfwk_frameworks_bundle_lite

appexecfwk_interfaces_innerkits_bundlemgr_lite

appexecfwk_interfaces_innerkits_appexecfwk_lite

appexecfwk_services_bundlemgr_lite

appexecfwk_kits_appkit_lite