Компонент System Ability Framework (safwk) определяет методы реализации системных возможностей в OpenHarmony и предоставляет API для запуска и регистрации системных возможностей.
Рисунок 1 Актуальная архитектура safwk
/foundation/systemabilitymgr
│── safwk # Директория safwk
│ ├── bundle.json # Описание и файл сборки safwk
│ ├── etc # Конфигурационные файлы
│ ├── interfaces # Экспортированные внешние API
│ ├── services # Реализация сервисов
│ ├── test # Тестовые случаи
API | Описание |
---|---|
sptr<IRemoteObject> GetSystemAbility(int32_t systemAbilityId) ; |
Получает объект удаленного вызова процедур (RPC) для указанной системной возможности. |
bool Publish(sptr<IRemoteObject> systemAbility) ; |
Объявляет системную возможность. |
virtual void DoStartSAProcess(const std::string& profilePath) = 0 ; |
Включает системную возможность на основе её профиля. |
Системная возможность реализуется с помощью файла XXX.cfg, файла profile.json и библиотеки libXXX.z.so. Процесс инициализации запускает процесс SystemAbility путём выполнения соответствующего файла XXX.cfg.
Пример кода приведён ниже:
Класс IXxx используется для определения функций, предоставляющих конкретные возможности системной возможности. Для определения этого класса следует наследовать от класса IRemoteBroker, предоставленного OpenHarmony для межпроцессного взаимодействия (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");
};
}
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
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);
}
}
}
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()
{
}
Настройте профиль системной возможности так, чтобы она могла быть загружена и зарегистрирована. Процесс настройки следующий:
Создайте папку с названием sa_profile в корневой директории подсистемы. Затем создайте два файла в этой папке, включая 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("//build/ohos/sa_profile/sa_profile.gni")
ohos_sa_profile("xxx_sa_profile") {
sources = [
"serviceid.json"
]
subsystem_name = "systemabilitymgr"
}
```>**ЗАМЕЧАНИЕ**
>
>1. Установите параметр **process** на имя процесса, где будет выполняться система. Этот параметр обязателен.
>2. Файл *serviceid*.json может содержать только один узел **systemability**. Наличие нескольких узлов **systemability** приведёт к ошибке сборки.
>3. Установите параметр **name** на идентификатор службы, зарегистрированный в коде для системной возможности. Этот параметр обязателен.
>4. Установите параметр **libpath** на путь загрузки системной возможности. Этот параметр обязателен.
>5. Установите параметр **run-on-create** на значение **true**, если вы хотите немедленно зарегистрировать эту системную возможность после старта процесса. Установите его на значение **false**, если вы хотите запустить системную возможность только при обращении к ней. Этот параметр обязателен.
>6. Установите параметр **distributed** на значение **true**, если эта системная возможность позволяет доступ между устройствами. Установите его на значение **false**, если она позволяет только IPC на локальном устройстве.
>7. Параметр **bootphase** указывает приоритет старта системной возможности. Возможные значения: **BootStartPhase** (наивысший), **CoreStartPhase**, или **OtherStartPhase** (наименьший). В одном процессе системные возможности с более низким приоритетом могут быть запущены и зарегистрированы только после того, как все системные возможности с более высоким приоритетом будут запущены и зарегистрированы. Этот параметр является необязательным. Значение по умолчанию — **OtherStartPhase**.
>8. Параметр **dump-level** указывает уровень, поддерживаемый системным дампером. Значение по умолчанию — **1**.
>9. В файле **BUILD.gn** установите параметр **subsystem_name** на имя подсистемы и добавьте список системных возможностей для конфигурирования подсистемы в **sources**. Можно конфигурировать несколько системных возможностей.
После выполнения вышеописанных шагов будет создан файл json с именем процесса в директории **out**, например, **out\...\system\profile\listen_test.json**.
##### 6. Настройка файла .cfg.
Файл .cfg содержит политику запуска нативного процесса, предоставленную Linux. Во время процесса старта системы процесс инициализации парсит файл .cfg для запуска нативного процесса.
```json
{
"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"]
}
]
}
ЗАМЕЧАНИЕ
Для получения подробной информации о реализации listen_ability обратитесь к test/services/safwk/unittest/common/listen_ability.
Samgr
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )