簡介
在系統服務管理子系統中safwk組件定義OpenHarmony中SystemAbility的實現方法,并提供啟動、注冊等接口實現。
系統架構
圖 1 系統服務框架圖
說明
接口說明
使用說明
SystemAbility實現一般采用XXX.cfg + profile.json + libXXX.z.so的方式由init進程執行對應的XXX.cfg文件拉起相關SystemAbility進程。
C++實現SystemAbility
示例代碼如下:
- 1. 定義IPC對外接口IXXX
定義該服務對外提供的能力集合函數,統一繼承IPC接口類IRemoteBroker;同時實現該IPC對外接口唯一標識符DECLARE_INTERFACE_DESCRIPTOR(XXX);該標識符用于IPC通信的校驗等目的。
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. 定義服務端通信代碼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的實現類
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++實現的SA必須配置相關System Ability的profile配置文件才會完成SA的加載注冊邏輯,否則沒有編寫profile配置的System Ability不會完成注冊。配置方法如下:
在子系統的根目錄新建一個以sa_profile為名的文件夾,然后在此文件夾中新建兩個文件:一個以serviceId為前綴的json文件,另外一個為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"
}
說明:
- 進程名字即該SystemAbility要運行的進程空間,此字段是必填選項。
- 一個SystemAbility配置文件只能配置一個SystemAbility節點,配置多個會導致編譯失敗。
- SystemAbility的name為對應的serviceId必須與代碼中注冊的serviceId保持一致,必配項。
- libpath為SystemAbility的加載路徑,必配項。
- run-on-create:true表示進程啟動后即向samgr組件注冊該SystemAbility;false表示按需啟動,即在其他模塊訪問到該SystemAbility時啟動,必配項。
- distributed:true表示該SystemAbility為分布式SystemAbility,支持跨設備訪問;false表示只有本地跨IPC訪問。
- bootphase:可不設置;可以設置的值有三種:BootStartPhase、CoreStartPhase、OtherStartPhase(默認類型),三種優先級依次降低,當同一個進程中,會優先拉起注冊配置BootStartPhase的SystemAbility,然后是配置了CoreStartPhase的SystemAbility,最后是OtherStartPhase;當高優先級的SystemAbility全部啟動注冊完畢才會啟動下一級的SystemAbility的注冊啟動。
- dump-level:表示systemdumper支持的level等級,默認配置1。
- BUILD.gn中subsystem_name為相應部件名稱;sources表示當前子系統需要配置的SystemAbility列表,可支持配置多個SystemAbility。
以上步驟完成后,全量編譯代碼后會在out路徑向生成一個以進程名為前綴的json文件listen_test.json;路徑為:out...systemprofilelisten_test.json。
更多鴻蒙開發知識已更新[qr23.cn/AKFP8k
]可前往參考學習。
- 6. cfg配置文件
cfg配置文件為linux提供的native進程拉起策略,開機啟動階段由init進程解析配置的cfg文件進行拉起。
{
"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"]
}
]
}
審核編輯 黃宇
-
鴻蒙
+關注
關注
57文章
2345瀏覽量
42822
發布評論請先 登錄
相關推薦
評論