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

描述

   

本文将介绍如何使用 cpp 编写用于小型系统的 app。

 

       

Ability 相关介绍

   

Ability 是应用所具备能力的抽象,也是应用程序的重要组成部分。Ability 是系统调度应用的最小单元,是能够完成一个独立功能的组件。

一个应用可以包含一个或多个 Ability。其中 Ability 又分为 Page 类型的和 Service 类型的,前者是为用户提供人机交互能力的,后者是提供后台任务机制的。

简单来讲就是 Page 带界面,Service 不带界面。这里将重点介绍 Page 类型的 Ability。

APP

使用到的子系统有 Ability 子系统、包管理子系统和图形 UI 子系统。

Ability 子系统是管理 OpenHarmony 应用运行状态的开发框架;包管理子系统是 OpenHarmony 为开发者提供的安装包管理框架;图形 UI 子系统提供基础 UI 组件和容器类组件。

APP

 

简单实现

   

①ability 和 abilityslice

abilityslice 是单个页面及其控制逻辑的总和,是 Page 类型 Ability 特有的组件。

一个 Page 类型的 Ability 可以包含多个 AbilitySlice,此时,这些页面提供的业务能力应当是高度相关的。APP

②生命周期

整体流程下来大致有 OnStart()、OnAvtive()、OnInactive()、OnBackground() 和 OnStop() 五阶段。

abilityslice 生命周期与 ability 相似,但是仍要区分。APP

③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.h"

namespace 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.h"

namespace OHOS {
REGISTER_AA(MainAbility) //使用REGISTER_AA注册ability

void MainAbility::OnStart(const Want &want)
{
    printf("This is MainAbility OnStart status!
");
    SetMainRoute("MainAbilitySlice"); //设置主页面为MainAbilitySlice,这要与后续的slice名字匹配

    Ability::OnStart(want);
}
}

APP

最后编写 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.h"

namespace 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.h"
const 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(00, 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(0072064);
    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

APP

④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 下。

主要参数如下:

APP

具体操作:还是得先将动态库编译出来,然后将动态库 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默认会在这个路径,如果使用工具打包的,视情况填写路径。

②相关参数

# bm
Usage: install hap-path [options]
Description:
        --help|-h                   help menu
        --happath|-p           location of the hap to install
Usageuninstall bundle-name [options]
Description:
        --help|-h                   help menu
        --bundlename|-n           name of the bundle to uninstall
Usage: 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 key
Usageset [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中定义
# aa
Usage:
aa start -p bundlename -n ability_name
aa stopability -p bundlename -n ability_name
aa terminate -p bundlename
aa dump -p bundlename -n ability_name -e extra_option
aa dump -a

Options:
 -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 编写用户应用程序,我们可以更方便有效的调用南向接口,这将会在开发和调试的过程中给我们带来极大的便利。

审核编辑 :李倩


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分