用鸿蒙开发AI应用(七)触摸屏控制LED 原创 精华
前言
上一篇,我们体验了一下鸿蒙上的界面的开发流程,这一篇我们继续深入一点点,尝试打通从用户态UI到内核态HDF之间的联系。其中涉及到的调用关系比较复杂,建议在“用鸿蒙开发AI应用(五)HDF 驱动补光灯”的基础上阅读本文,HDF的相关细节这里就不在赘述了。
背景知识
用户程序框架子系统包含两个大的模块:Ability子系统和包管理子系统。
1. Ability子系统
1.1 Ability
Ability是系统调度应用的最小单元,是能够完成一个独立功能的组件,一个应用可以包含一个或多个Ability。Ability分为两种类型:Page类型的Ability和Service类型的Ability
Page类型的Ability:带有界面,为用户提供人机交互的能力。
Service类型的Ability:不带界面,为用户提供后台任务机制。
1.2 AbilitySlice
AbilitySlice是单个页面及其控制逻辑的总和,是Page类型Ability特有的组件,一个Page类型的Ability可以包含多个AbilitySlice,此时,这些页面提供的业务能力应当是高度相关的。
1.3 生命周期
生命周期是Ability被调度到启动、激活、隐藏和退出等各个状态的的统称。
Ability生命周期各状态解析:
UNINITIALIZED:未初始状态,为临时状态,Ability被创建后会由UNINITIALIZED状态进入INITIAL状态;
INITIAL:初始化状态,也表示停止状态,表示当前Ability未运行,调用Start后进入INACTIVE,同时回调开发者的OnStart生命周期回调;
INACTIVE:未激活状态,表示当前窗口已显示但是无焦点状态,由于Window暂未支持焦点的概念,当前状态与ACTIVE一致。
ACTIVE:前台激活状态,表示当前窗口已显示,并获取焦点,Ability在退到后台之前先由ACTIVE状态进入INACTIVE状态;
BACKGROUND: 后台状态,表示当前Ability退到后台,Ability在被销毁后由BACKGROUND状态进入INITIAL状态,或者重新被激活后由BACKGROUND状态进入ACTIVE状态。
1.4 AbilityLoader
AbilityLoader负责注册和加载开发者Ability的模块。开发者开发的Ability先要调用AbilityLoader的注册接口注册到框架中,接着Ability启动时会被实例化。
1.5 AbilityManager
AbilityManager负责AbilityKit和Ability管理服务进行IPC的通信。
1.6 EventHandler
EventHandler是AbilityKit提供给开发者的用于在Ability中实现线程间通信的一个模块。
1.7 Ability运行管理服务
Ability运行管理服务是用于协调各Ability运行关系、及生命周期进行调度的系统服务。
其中,服务启动模块负责Ability管理服务的启动、注册等。
服务接口管理模块负责Ability管理服务对外能力的管理。
进程管理模块负责Ability应用所在进程的启动和销毁、及其进程信息维护等功能。Ability栈管理模块负责维护各个Ability之间跳转的先后关系。
生命周期调度模块是Ability管理服务根据系统当前的操作调度Ability进入相应的状态的模块。
连接管理模块是Ability管理服务对Service类型Ability连接管理的模块。
1.8 AppSpawn
AppSpawn是负责创建Ability应用所在进程的系统服务,该服务有较高的权限,为Ability应用设置相应的权限,并预加载一些通用的模块,加速应用的启动。
2. 包管理子系统
包管理子系统,是OpenHarmony为开发者提供的安装包管理框架。
BundleKit:是包管理服务对外提供的接口,有安装/卸载接口、包信息查询接口、包状态变化监听接口。
包扫描器:用来解析本地预制或者安装的安装包,提取里面的各种信息,供管理子模块进行管理,持久化。
包安装子模块:安装,卸载,升级一个包;包安装服务一个单独进程的用于创建删除安装目录,具有较高的权限。
包管理子模块:管理安装包相关的信息,存储持久化包信息。
包安全管理子模块:签名检查、权限授予、权限管理。
HDF驱动LED(可选)
之前在内核中已经注册过一个led_driver驱动,并以led_service服务发布,这一节稍微重构一下代码,功能上没有变化,我们快速过一遍,熟悉HDF的可以自行跳过。
1. 业务代码
先新建头文件vendor\huawei\hdf\led\include\led_ctrl.h。
再新建源文件 vendor\huawei\hdf\led\led_ctrl.c
先完成对绿色指示灯的控制逻辑。
2. 驱动实现
在 huawei/hdf 目录下新建一个文件夹 led, 然后在其中新建一个源文件 led.c。
3. 驱动编译
在 huawei/hdf/led 目录下新建编译文件 Makefile。
4. 编译结果链接到内核镜像
修改 huawei/hdf/hdf_vendor.mk 文件,添加以下代码
5. 驱动配置
修改 vendor/hisi/hi35xx/hi3516dv300/config/device_info/device_info.hcs配置文件,添加驱动的设备描述。
编译用户程序框架子系统
1. 添加配置文件
在 build/lite/platform/hi3516dv300_liteos_a/platform.json中的subsystems字段下面添加appexecfwk和aafwk。
2. 添加编译文件
新建build\lite\config\subsystem\aafwk\BUILD.gn文件,
新建/build/lite/config/subsystem/appexecfwk/BUILD.gn文件,
3. 运行管理服务
用户程序框架有两个系统服务ability管理服务(abilityms)和(bundlems),两系统服务运行于foundation进程中。
abilityms和bundlems注册到sa_manager中,sa_manager运行于foundation进程中,sa_manager为abilityms和bundlems创建线程运行环境。
在foundation/distributedschedule/services/safwk_lite/BUILD.gn中添加对abilityms和bundlems
基于AbilityKit开发的Ability
1. 主页面实现
新建源文件applications\sample\camera\myLedApp\src\main_ability.cpp
2. 分片页面
2.1 定义控件常量
新建源文件main_ability_slice.cpp, 屏幕大小为960x480
2.2 创建按钮和布局
在生命周期函数OnStart中,全屏放置一个rootView_,居中位置放置一个按钮button1。
2.3 实现驱动消息机制
这里顺便提一下,文档中DevSvcManagerClntGetService接口仅在内核态有效,可以方便的获取服务并直接调用。鸿蒙作为微内核的OS,想从用户态调用内核态函数,要么用框架的消息机制,要么自己用中断服务实现。
2.4 加入点击事件
每次点击按钮,向内核态发送一次消息。
2.5 注销页面
在生命周期函数OnStop中,删除所有节点,回收系统资源。
3. 编译配置
新增 applications\sample\camera\myLedApp\BUILD.gn文件
4. 应用配置文件
新建 applications\sample\camera\myLedApp\config.json
5. 板级编译配置
复制 build/lite/product/ipcamera_hi3516dv300.json,改名为my_hi3516dv300在子系统里加入
6. 编译应用
将系统烧录到开发板上。
7. 打包应用
在 assets\entry\resources\base\media\目录下放置一个icon.png作为启动图标。
将applications\sample\camera\myLedApp\config.json和 Z:\openharmony\out\my_hi3516dv300\dev_tools\led\libledability.so打包压缩成zip包
改名为ledability.hap ,复制到NFS共享目录
8. 安装Hap
9. 运行程序
完美!
总结
整理一下思路,
我们先用AbilityKit绘制Ability页面,在其button1上绑定一个按钮事件;
触发后,由用户子系统寻找到led_server服务,向HDF框架发送消息;
内核驱动led_driver接收到消息后,调用底层GPIO控制LED翻转,并将操作状态以reply消息的形式传回用户侧;
后续可以接着根据返回状态更新下界面。
好了,在此基础上美化下界面,接个继电器做个智能家居的App应该不是难事了。
源码下载
PS:最近收到了社区之星的礼物,还有前沿新书《鸿蒙应用开发实战》,感谢一下小编的辛苦工作。
下一篇预告
用C++来写UI开发效率总是不如java和js高的,
何况还没法用上DevEco Studio辅助设计,
下一篇我们尝试实现更多的设备能力,
并用JS框架来访问内核层,
敬请期待...
图片好像挂了,方便楼主补一下吗?
楼主...有两张图片看不到呀╯︿╰
好像已经修复了,感谢小编。
看到礼物收到了,也就放心了!