如何使用cpp编写用于小型系统的app

本文将介绍如何使用 cpp 编写用于小型系统的 app。
ability 相关介绍
    ability 是应用所具备能力的抽象,也是应用程序的重要组成部分。ability 是系统调度应用的最小单元,是能够完成一个独立功能的组件。
一个应用可以包含一个或多个 ability。其中 ability 又分为 page 类型的和 service 类型的,前者是为用户提供人机交互能力的,后者是提供后台任务机制的。
简单来讲就是 page 带界面,service 不带界面。这里将重点介绍 page 类型的 ability。
使用到的子系统有 ability 子系统、包管理子系统和图形 ui 子系统。
ability 子系统是管理 openharmony 应用运行状态的开发框架;包管理子系统是 openharmony 为开发者提供的安装包管理框架;图形 ui 子系统提供基础 ui 组件和容器类组件。
  简单实现
    ①ability 和 abilityslice
abilityslice 是单个页面及其控制逻辑的总和,是 page 类型 ability 特有的组件。
一个 page 类型的 ability 可以包含多个 abilityslice,此时,这些页面提供的业务能力应当是高度相关的。 ②生命周期
整体流程下来大致有 onstart()、onavtive()、oninactive()、onbackground() 和 onstop() 五阶段。
abilityslice 生命周期与 ability 相似,但是仍要区分。 ③hello world
./helloworld/├── config.json                         //配置文件├── resource                            //资源└── src                                 //主要文件    ├── include    │   ├── main_ability.h    │   └── main_ability_slice.h    └── main        ├── main_ability.cpp        └── main_ability_slice.cpp 首先定义并注册 ability:// main_ability.h#ifndef hello_main_ability_h#define hello_main_ability_h#include ability_loader.hnamespace ohos {class mainability : public ability {protected:    void onstart(const want &want) override; //want结构体,ability的相关信息    /*     * 由于在这里我们只要简单的展示helloworld标签,其它函数不需要重载。     */    // void oninactive() override;    // void onactive(const want &want) override;    // void onbackground() override;    // void onstop() override;};}#endif //main_ability.cpp#include main_ability.hnamespace ohos {register_aa(mainability) //使用register_aa注册abilityvoid mainability::onstart(const want &want){    printf(this is mainability onstart status!);    setmainroute(mainabilityslice); //设置主页面为mainabilityslice,这要与后续的slice名字匹配    ability::onstart(want);}}
最后编写 slice 界面://main_ability_slice.h#ifndef hello_ability_slice_h#define hello_ability_slice_h#include ability_loader.h#include ability_manager.h#include bundle_manager.h#include components/ui_label.hnamespace ohos {class mainabilityslice : public abilityslice { //创建abilityslice类 与上面同名public:    mainabilityslice() = default;    virtual ~mainabilityslice();protected:    void onstart(const want &want) override;    /*     * 同理     */    // void oninactive() override;    // void onactive(const want &want) override;    // void onbackground() override;    // void onstop() override;};}#endif //main_ability_slice.cpp#include main_ability_slice.hconst int screen_width = 720;const int screen_height = 1280;namespace ohos {register_as(mainabilityslice)mainabilityslice::~mainabilityslice(){    printf(this is ~mainabilityslice!rn);}void mainabilityslice::onstart(const want& want){    abilityslice::onstart(want);    rootview* rootview_ = rootview::getwindowrootview(); //创建底层界面    rootview_->setposition(0, 0, screen_width, screen_height);    rootview_->setstyle(style_background_color, color::black()));    rootview_->setfocusable(true);    rootview_->setinterceptfocus(false);    uilabel* label = new uilabel(); //创建label写入hello world    label->setposition(0, 0, 720, 64);    label->settext(hello world!);    label->setfont(sourcehansanssc-regular.otf, 64);    label->setstyle(style_text_color, color::white()));    rootview_->add(label); //将label放入rootview    setuicontent(rootview_); //设置显示rootview ui}}#endif
④config.json 的编写
//config.json{    app: {        bundlename: com.sample.hello,        vendor: sample,        version: {            code: 1,            name: 1.0        },        apiversion: {            compatible: 3,            target: 4        }    },    deviceconfig: {        default: {        }    },    module: {        package: com.sample.hello,        name: .myharmonyabilitypackage,        devicetype: [            phone,            tv,            tablet,            pc,            car,            smartwatch,            sportswatch,            smartvision        ],        distro: {            deliverywithinstall: true,            modulename: hello,            moduletype: entry        },        abilities: [ //ability配置声明            {                name: mainability,                label: hello world app,                launchtype: standard,                type: page,                visible: true            }        ]    }}   hap 编译
   ①通过 build.gn 与系统一并编译 使用到编译链中的 hap_pack,添加配置:
import(“/ildte/config/hap_pack.gni”)   import(//build/lite/config/hap_pack.gni)shared_library(hello) {  sources = [    src/main/main_ability.cpp,    src/main/main_ability_slice.cpp  ] #将主要文件编译出库  deps = [    ${aafwk_lite_path}/frameworks/ability_lite:aafwk_abilitykit_lite,    ${appexecfwk_lite_path}/frameworks/bundle_lite:bundle,    //foundation/graphic/ui:lite_ui,    //foundation/graphic/utils:lite_graphic_utils,    //foundation/systemabilitymgr/samgr_lite/samgr:samgr,  ]  include_dirs = [    src/include,    ${aafwk_lite_path}/interfaces/kits/ability_lite,    ${aafwk_lite_path}/interfaces/kits/want_lite,    ${appexecfwk_lite_path}/interfaces/kits/bundle_lite,  ]  ldflags = [ -shared ]  ldflags += [ -lstdc++ ]  ldflags += [ -l$ohos_root_path/sysroot/usr/lib ]  ldflags += [ -wl,-rpath-link=$ohos_root_path/sysroot/usr/lib ]  ldflags += [    -lui,    -lability,  ] #添加依赖  defines = [    enable_window=1,    ability_window_support,    ohos_appexecfwk_bms_bundlemanager,  ] #配置定义}hap_pack(hello_hap) { #打包成hap  deps = [ :hello ]  mode = hap  json_path = config.json  ability_so_path = $root_out_dir/libhello.so #编译后的库文件  force = true  cert_profile = com.huawei.launcher_appprovision_release.p7b #由于不清楚获取证书方法 先用源码案例自带的证书代替  resources_path = resources  hap_name = hello} ②通过 app_packing_tool 单独编译
该打包工具在源码目录 developtools/packing_tool/jar 下。
主要参数如下:
具体操作:还是得先将动态库编译出来,然后将动态库 libhello.so 和 config.json 放到一个文件夹里。./out/├── config.json└── libhello.so 最后使用 java -jar app_packing_tool.jar 进行打包,如下:java -jar app_packing_tool.jar |--mode hap |--json-path ./config.json |--ability-out-path ./libhello.so |--out-path ./hello.hap   hap 安装
    ①安装命令 bm
由于小型系统不支持使用 hdc 工具,我们需要使用到 bm 命令进行安装程序。bm set -s disable //取消签名安装。bm install -p system/internal/hello.hap //使用build.gn一起编译的hap默认会在这个路径,如果使用工具打包的,视情况填写路径。 ②相关参数
# bmusage: install hap-path [options]description:        --help|-h                   help menu        --happath|-p           location of the hap to installusage: uninstall bundle-name [options]description:        --help|-h                   help menu        --bundlename|-n           name of the bundle to uninstallusage: dump [options]option description:        --help|-h                   help menu        --list|-l                   app list        --bundlename|-n           dump installed hap's info        --metadatakey|-m           dump bundlenames match metadata keyusage: set [options]option description:        --externalmode|-e status    enable externalmode        --debugmode|-d  status      enable debugmode        --signmode|-s  status      enable signmode 小型系统的 bm 指令是标准系统的阉割版。
安装成功后就可以打开该 app,部分小型系统的设备屏幕没有触摸功能和鼠标驱动,我们可以使用 aa 命令来启动 app。aa start -p com.sample.hello -n mainability //包名和ability名都在config.json中定义 # aausage:aa start -p bundlename -n ability_nameaa stopability -p bundlename -n ability_nameaa terminate -p bundlenameaa dump -p bundlename -n ability_name -e extra_optionaa dump -aoptions: -h (--help)                show the help information.             [eg: aa -h] -p (--bundlename)          appoint the bundlename name.           [eg: -p com.huawei] -n (--abilityname)         appoint the ability name.              [eg: -n myability] -a (--all)                 [unnecessary]dump all ability info.    [eg: -a] -e (--extra)               [unnecessary]extra info when dump.     [eg: -e]commands:aa start                    start the target ability.aa stopability              stop the target service ability.aa terminate                terminate the target app.aa dump                     dump ability   总结
    使用 cpp 编写用户应用程序,我们可以更方便有效的调用南向接口,这将会在开发和调试的过程中给我们带来极大的便利。


中国联通在第一视角直播领域展开探索
无线医疗设备-超低功耗射频技术详解
电线电缆拉力测试全解析:如何使用电子拉力试验机进行测试?原理流程解密!
苹果专利:探索力感知织物手套,支持手势控制输入
半导体光放大器SOA的电光转化效率
如何使用cpp编写用于小型系统的app
8051单片机进行8路LED模拟分支控制
电动机轴承损坏的因素有哪些
浅谈芯片间互联技术CCIX分层结构及拓扑结构
特斯拉为何要选择4D毫米波雷达?
多名科学家获资金资助 将开发新一代液流电池技术
华为P20Pro高清图赏
安全存储功能中使用的重要结构体
凌特推出具输出跟踪功能的双输出两相同步控制器
AI赋生“纸片人”你陷入了他们的世界?
手机被监控,教你几招绝对安全
高精度加速度计分辨率测试方法
mtk mt6577双核处理器分析
Lattice公司的系统内可编程PLD
如何才能将DTU与PLC二者之间实现连接通信