本文將介紹如何使用 cpp 編寫用于小型系統(tǒng)的 app。
Ability相關(guān)介紹
Ability 是應(yīng)用所具備能力的抽象,也是應(yīng)用程序的重要組成部分。Ability 是系統(tǒng)調(diào)度應(yīng)用的最小單元,是能夠完成一個(gè)獨(dú)立功能的組件。
一個(gè)應(yīng)用可以包含一個(gè)或多個(gè) Ability。其中 Ability 又分為 Page 類型的和 Service 類型的,前者是為用戶提供人機(jī)交互能力的,后者是提供后臺(tái)任務(wù)機(jī)制的。
簡單來講就是 Page 帶界面,Service 不帶界面。這里將重點(diǎn)介紹 Page 類型的 Ability。
使用到的子系統(tǒng)有 Ability 子系統(tǒng)、包管理子系統(tǒng)和圖形 UI 子系統(tǒng)。
Ability 子系統(tǒng)是管理 OpenHarmony 應(yīng)用運(yùn)行狀態(tài)的開發(fā)框架;包管理子系統(tǒng)是 OpenHarmony 為開發(fā)者提供的安裝包管理框架;圖形 UI 子系統(tǒng)提供基礎(chǔ) UI 組件和容器類組件。
簡單實(shí)現(xiàn)
①ability 和 abilityslice
abilityslice 是單個(gè)頁面及其控制邏輯的總和,是 Page 類型 Ability 特有的組件。
一個(gè) Page 類型的 Ability 可以包含多個(gè) AbilitySlice,此時(shí),這些頁面提供的業(yè)務(wù)能力應(yīng)當(dāng)是高度相關(guān)的。②生命周期
整體流程下來大致有 OnStart()、OnAvtive()、OnInactive()、OnBackground() 和 OnStop() 五階段。
abilityslice 生命周期與 ability 相似,但是仍要區(qū)分。③hello world
./helloworld/
├──config.json//配置文件
├──resource//資源
└──src//主要文件
├──include
│├──main_ability.h
│└──main_ability_slice.h
└──main
├──main_ability.cpp
└──main_ability_slice.cpp
首先定義并注冊(cè) ability:
//main_ability.h
#ifndefHELLO_MAIN_ABILITY_H
#defineHELLO_MAIN_ABILITY_H
#include"ability_loader.h"
namespaceOHOS{
classMainAbility:publicAbility{
protected:
voidOnStart(constWant&want)override;//Want結(jié)構(gòu)體,ability的相關(guān)信息
/*
*由于在這里我們只要簡單的展示helloworld標(biāo)簽,其它函數(shù)不需要重載。
*/
//voidOnInactive()override;
//voidOnActive(constWant&want)override;
//voidOnBackground()override;
//voidOnStop()override;
};
}
#endif
//main_ability.cpp
#include"main_ability.h"
namespaceOHOS{
REGISTER_AA(MainAbility)//使用REGISTER_AA注冊(cè)ability
voidMainAbility::OnStart(constWant&want)
{
printf("ThisisMainAbilityOnStartstatus!
");
SetMainRoute("MainAbilitySlice");//設(shè)置主頁面為MainAbilitySlice,這要與后續(xù)的slice名字匹配
Ability::OnStart(want);
}
}
最后編寫 slice 界面:
//main_ability_slice.h
#ifndefHELLO_ABILITY_SLICE_H
#defineHELLO_ABILITY_SLICE_H
#include"ability_loader.h"
#include"ability_manager.h"
#include"bundle_manager.h"
#include"components/ui_label.h"
namespaceOHOS{
classMainAbilitySlice:publicAbilitySlice{//創(chuàng)建AbilitySlice類與上面同名
public:
MainAbilitySlice()=default;
virtual~MainAbilitySlice();
protected:
voidOnStart(constWant&want)override;
/*
*同理
*/
//voidOnInactive()override;
//voidOnActive(constWant&want)override;
//voidOnBackground()override;
//voidOnStop()override;
};
}
#endif
//main_ability_slice.cpp
#include"main_ability_slice.h"
constintscreen_width=720;
constintscreen_height=1280;
namespaceOHOS{
REGISTER_AS(MainAbilitySlice)
MainAbilitySlice::~MainAbilitySlice()
{
printf("Thisis~MainAbilitySlice!rn");
}
voidMainAbilitySlice::OnStart(constWant&want)
{
AbilitySlice::OnStart(want);
RootView*rootView_=RootView::GetWindowRootView();//創(chuàng)建底層界面
rootView_->SetPosition(0,0,screen_width,screen_height);
rootView_->SetStyle(STYLE_BACKGROUND_COLOR,Color::Black()));
rootView_->SetFocusable(true);
rootView_->SetInterceptFocus(false);
UILabel*label=newUILabel();//創(chuàng)建label寫入HelloWorld
label->SetPosition(0,0,720,64);
label->SetText("HelloWorld!");
label->SetFont("SourceHanSansSC-Regular.otf",64);
label->SetStyle(STYLE_TEXT_COLOR,Color::White()));
rootView_->Add(label);//將label放入rootView
SetUIContent(rootView_);//設(shè)置顯示RootViewUI
}
}
#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":"helloworldapp",
"launchType":"standard",
"type":"page",
"visible":true
}
]
}
}
hap編譯
①通過 BUILD.gn 與系統(tǒng)一并編譯使用到編譯鏈中的 hap_pack,添加配置:
import(“/ildte/config/hap_pack.gni”)
import("http://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",
"http://foundation/graphic/ui:lite_ui",
"http://foundation/graphic/utils:lite_graphic_utils",
"http://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 單獨(dú)編譯
該打包工具在源碼目錄 developtools/packing_tool/jar 下。
主要參數(shù)如下:具體操作:還是得先將動(dòng)態(tài)庫編譯出來,然后將動(dòng)態(tài)庫 libhello.so 和 config.json 放到一個(gè)文件夾里。
./out/
├──config.json
└──libhello.so
最后使用 java -jar app_packing_tool.jar 進(jìn)行打包,如下:
java-jarapp_packing_tool.jar|
--modehap|
--json-path./config.json|
--ability-out-path./libhello.so|
--out-path./hello.hap
hap安裝
①安裝命令 bm
由于小型系統(tǒng)不支持使用 HDC 工具,我們需要使用到 bm 命令進(jìn)行安裝程序。
bmset-sdisable//取消簽名安裝。
bminstall-psystem/internal/hello.hap//使用BUILD.gn一起編譯的hap默認(rèn)會(huì)在這個(gè)路徑,如果使用工具打包的,視情況填寫路徑。
②相關(guān)參數(shù)
#bm
Usage:installhap-path[options]
Description:
--help|-hhelpmenu
--happath|-plocationofthehaptoinstall
Usage:uninstallbundle-name[options]
Description:
--help|-hhelpmenu
--bundlename|-nnameofthebundletouninstall
Usage:dump[options]
OptionDescription:
--help|-hhelpmenu
--list|-lapplist
--bundlename|-ndumpinstalledhap'sinfo
--metadatakey|-mdumpbundleNamesmatchmetaDatakey
Usage:set[options]
OptionDescription:
--externalmode|-estatusenableexternalmode
--debugmode|-dstatusenabledebugmode
--signmode|-sstatusenablesignmode
小型系統(tǒng)的 bm 指令是標(biāo)準(zhǔn)系統(tǒng)的閹割版。
安裝成功后就可以打開該 app,部分小型系統(tǒng)的設(shè)備屏幕沒有觸摸功能和鼠標(biāo)驅(qū)動(dòng),我們可以使用 aa 命令來啟動(dòng) app。
aastart-pcom.sample.hello-nMainAbility//包名和ability名都在config.json中定義
#aa
Usage:
aastart-pbundlename-nability_name
aastopability-pbundlename-nability_name
aaterminate-pbundlename
aadump-pbundlename-nability_name-eextra_option
aadump-a
Options:
-h(--help)Showthehelpinformation.[eg:aa-h]
-p(--bundlename)Appointthebundlenamename.[eg:-pcom.huawei]
-n(--abilityname)Appointtheabilityname.[eg:-nMyAbility]
-a(--all)[Unnecessary]dumpallabilityinfo.[eg:-a]
-e(--extra)[Unnecessary]extrainfowhendump.[eg:-e]
Commands:
aastartStartthetargetability.
aastopabilityStopthetargetserviceability.
aaterminateTerminatethetargetapp.
aadumpDumpability
總結(jié)
使用 cpp 編寫用戶應(yīng)用程序,我們可以更方便有效的調(diào)用南向接口,這將會(huì)在開發(fā)和調(diào)試的過程中給我們帶來極大的便利。
審核編輯 :李倩
-
APP
+關(guān)注
關(guān)注
33文章
1576瀏覽量
72639 -
應(yīng)用程序
+關(guān)注
關(guān)注
38文章
3287瀏覽量
57814 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3744瀏覽量
16470
原文標(biāo)題:OpenHarmony上編寫app
文章出處:【微信號(hào):gh_834c4b3d87fe,微信公眾號(hào):OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論