簡介
在系統(tǒng)服務(wù)管理子系統(tǒng)中safwk組件定義OpenHarmony中SystemAbility的實(shí)現(xiàn)方法,并提供啟動(dòng)、注冊等接口實(shí)現(xiàn)。
系統(tǒng)架構(gòu)
圖 1 系統(tǒng)服務(wù)框架圖
說明
接口說明
使用說明
SystemAbility實(shí)現(xiàn)一般采用XXX.cfg + profile.json + libXXX.z.so的方式由init進(jìn)程執(zhí)行對應(yīng)的XXX.cfg文件拉起相關(guān)SystemAbility進(jìn)程。
C++實(shí)現(xiàn)SystemAbility
示例代碼如下:
- 1. 定義IPC對外接口IXXX
定義該服務(wù)對外提供的能力集合函數(shù),統(tǒng)一繼承IPC接口類IRemoteBroker;同時(shí)實(shí)現(xiàn)該IPC對外接口唯一標(biāo)識符DECLARE_INTERFACE_DESCRIPTOR(XXX);該標(biāo)識符用于IPC通信的校驗(yàn)等目的。
namespace OHOS {
class IListenAbility : public IRemoteBroker {
public:
virtual int AddVolume(int volume) = 0;
public:
enum {
ADD_VOLUME = 1,
};
public:
DECLARE_INTERFACE_DESCRIPTOR(u"OHOS.test.IListenAbility");
};
}
- 2. 定義客戶端通信代碼XXXProxy
namespace OHOS {
class ListenAbilityProxy : public IRemoteProxy< IListenAbility > {
public:
int AddVolume(int volume);
explicit ListenAbilityProxy(const sptr< IRemoteObject >& impl)
: IRemoteProxy< IListenAbility >(impl)
{
}
private:
static inline BrokerDelegator< ListenAbilityProxy > delegator_;
};
} // namespace OHOS
- 3. 定義服務(wù)端通信代碼XXXStub
namespace OHOS {
int32_t ListenAbilityStub::OnRemoteRequest(uint32_t code,
MessageParcel& data, MessageParcel &reply, MessageOption &option)
{
switch (code) {
case ADD_VOLUME: {
return reply.WriteInt32(AddVolume(data.ReadInt32()));
}
default:
return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
}
}
}
- 4. SystemAbility的實(shí)現(xiàn)類
namespace {
constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, 0xD001800, "SA_TST"};
}
REGISTER_SYSTEM_ABILITY_BY_ID(ListenAbility, DISTRIBUTED_SCHED_TEST_LISTEN_ID, true);
ListenAbility::ListenAbility(int32_t saId, bool runOnCreate) : SystemAbility(saId, runOnCreate)
{
HiLog::Info(LABEL, ":%s called", __func__);
HiLog::Info(LABEL, "ListenAbility()");
}
ListenAbility::~ListenAbility()
{
HiLog::Info(LABEL, "~ListenAbility()");
}
int ListenAbility::AddVolume(int volume)
{
pid_t current = getpid();
HiLog::Info(LABEL, "ListenAbility::AddVolume volume = %d, pid = %d.", volume, current);
return (volume + 1);
}
void ListenAbility::OnDump()
{
}
void ListenAbility::OnStart()
{
HiLog::Info(LABEL, "ListenAbility::OnStart()");
HiLog::Info(LABEL, "ListenAbility:%s called:-----Publish------", __func__);
bool res = Publish(this);
if (res) {
HiLog::Error(LABEL, "ListenAbility: res == false");
}
HiLog::Info(LABEL, "ListenAbility:%s called:AddAbilityListener_OS_TST----beg-----", __func__);
AddSystemAbilityListener(DISTRIBUTED_SCHED_TEST_OS_ID);
HiLog::Info(LABEL, "ListenAbility:%s called:AddAbilityListener_OS_TST----end-----", __func__);
HiLog::Info(LABEL, "ListenAbility:%s called:StopAbility_OS_TST----beg-----", __func__);
StopAbility(DISTRIBUTED_SCHED_TEST_OS_ID);
HiLog::Info(LABEL, "ListenAbility:%s called:StopAbility_OS_TST----end-----", __func__);
return;
}
void ListenAbility::OnStop()
{
}
- 5. SystemAbility配置
以c++實(shí)現(xiàn)的SA必須配置相關(guān)System Ability的profile配置文件才會(huì)完成SA的加載注冊邏輯,否則沒有編寫profile配置的System Ability不會(huì)完成注冊。配置方法如下:
在子系統(tǒng)的根目錄新建一個(gè)以sa_profile為名的文件夾,然后在此文件夾中新建兩個(gè)文件:一個(gè)以serviceId為前綴的json文件,另外一個(gè)為BUILD.gn文件。
serviceid.json:
{
"process": "listen_test",
"systemability": [
{
"name": serviceid,
"libpath": "liblisten_test.z.so",
"run-on-create": true,
"distributed": true,
"dump_level": 1
}
]
}
BUILD.gn:
import("http://build/ohos/sa_profile/sa_profile.gni")
ohos_sa_profile("xxx_sa_profile") {
sources = [
"serviceid.json"
]
subsystem_name = "systemabilitymgr"
}
說明:
- 進(jìn)程名字即該SystemAbility要運(yùn)行的進(jìn)程空間,此字段是必填選項(xiàng)。
- 一個(gè)SystemAbility配置文件只能配置一個(gè)SystemAbility節(jié)點(diǎn),配置多個(gè)會(huì)導(dǎo)致編譯失敗。
- SystemAbility的name為對應(yīng)的serviceId必須與代碼中注冊的serviceId保持一致,必配項(xiàng)。
- libpath為SystemAbility的加載路徑,必配項(xiàng)。
- run-on-create:true表示進(jìn)程啟動(dòng)后即向samgr組件注冊該SystemAbility;false表示按需啟動(dòng),即在其他模塊訪問到該SystemAbility時(shí)啟動(dòng),必配項(xiàng)。
- distributed:true表示該SystemAbility為分布式SystemAbility,支持跨設(shè)備訪問;false表示只有本地跨IPC訪問。
- bootphase:可不設(shè)置;可以設(shè)置的值有三種:BootStartPhase、CoreStartPhase、OtherStartPhase(默認(rèn)類型),三種優(yōu)先級依次降低,當(dāng)同一個(gè)進(jìn)程中,會(huì)優(yōu)先拉起注冊配置BootStartPhase的SystemAbility,然后是配置了CoreStartPhase的SystemAbility,最后是OtherStartPhase;當(dāng)高優(yōu)先級的SystemAbility全部啟動(dòng)注冊完畢才會(huì)啟動(dòng)下一級的SystemAbility的注冊啟動(dòng)。
- dump-level:表示systemdumper支持的level等級,默認(rèn)配置1。
- BUILD.gn中subsystem_name為相應(yīng)部件名稱;sources表示當(dāng)前子系統(tǒng)需要配置的SystemAbility列表,可支持配置多個(gè)SystemAbility。
以上步驟完成后,全量編譯代碼后會(huì)在out路徑向生成一個(gè)以進(jìn)程名為前綴的json文件listen_test.json;路徑為:out...systemprofilelisten_test.json。
更多鴻蒙開發(fā)知識已更新[qr23.cn/AKFP8k
]可前往參考學(xué)習(xí)。
- 6. cfg配置文件
cfg配置文件為linux提供的native進(jìn)程拉起策略,開機(jī)啟動(dòng)階段由init進(jìn)程解析配置的cfg文件進(jìn)行拉起。
{
"jobs" : [{
"name" : "post-fs-data",
"cmds" : [
"start listen_test"
]
}
],
"services" : [{
"name" : "listen_test",
"path" : ["/system/bin/sa_main", "/system/profile/listen_test.json"],
"uid" : "system",
"gid" : ["system", "shell"]
}
]
}
審核編輯 黃宇
-
鴻蒙
+關(guān)注
關(guān)注
59文章
2491瀏覽量
43716
發(fā)布評論請先 登錄
KaihongOS筆記本電腦開發(fā)實(shí)戰(zhàn)第九節(jié):全功能TypeC驅(qū)動(dòng)框架適配
鴻蒙元服務(wù)實(shí)戰(zhàn)-笑笑五子棋(1)

名單公布!【書籍評測活動(dòng)NO.56】極速探索HarmonyOS NEXT:純血鴻蒙應(yīng)用開發(fā)實(shí)踐
鴻蒙Flutter實(shí)戰(zhàn):14-現(xiàn)有Flutter 項(xiàng)目支持鴻蒙 II
HarmonyOS NEXT應(yīng)用元服務(wù)開發(fā)Intents Kit(意圖框架服務(wù))綜述
鴻蒙原生開發(fā)手記:03-元服務(wù)開發(fā)全流程(開發(fā)元服務(wù),只需要看這一篇文章)
HarmonyOS NEXT應(yīng)用元服務(wù)開發(fā)Intents Kit(意圖框架服務(wù))習(xí)慣推薦方案概述
HarmonyOS NEXT應(yīng)用元服務(wù)開發(fā)Intents Kit(意圖框架服務(wù))事件推薦開發(fā)者測試
鴻蒙原生開發(fā)手記:01-元服務(wù)開發(fā)
HarmonyOS NEXT應(yīng)用元服務(wù)開發(fā)Intents Kit(意圖框架服務(wù))事件推薦方案概述
HarmonyOS NEXT應(yīng)用元服務(wù)開發(fā)Intents Kit(意圖框架服務(wù))本地搜索方案概述
鴻蒙Flutter實(shí)戰(zhàn):08-如何調(diào)試代碼
鴻蒙Flutter實(shí)戰(zhàn):07混合開發(fā)
京東金融APP的鴻蒙之旅系列專題 新特性篇:意圖框架接入

萬里紅榮獲“首批鴻蒙原生應(yīng)用開發(fā)服務(wù)商和培訓(xùn)服務(wù)商”授牌

評論