1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/openharmony-systemabilitymgr_safwk

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

safwk

Введение

Компонент System Ability Framework (safwk) определяет методы реализации системных возможностей в OpenHarmony и предоставляет API для запуска и регистрации системных возможностей.

Архитектура системы

Рисунок 1 Актуальная архитектура safwk

Структура директорий

/foundation/systemabilitymgr
│── safwk                # Директория safwk
│  ├── bundle.json      # Описание и файл сборки safwk
│  ├── etc              # Конфигурационные файлы
│  ├── interfaces       # Экспортированные внешние API
│  ├── services         # Реализация сервисов
│  ├── test             # Тестовые случаи

Пример использования

Доступные API

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.

Реализация системной возможности на C++

Пример кода приведён ниже:

1. Определение класса IXxx для IPC.

Класс 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");
};
}
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. Реализация системной возможности.
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. Настройка системной возможности.

Настройте профиль системной возможности так, чтобы она могла быть загружена и зарегистрирована. Процесс настройки следующий:

Создайте папку с названием 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

systemabilitymgr_safwk

systemabilitymgr_samgr

systemabilitymgr_safwk_lite

systemabilitymgr_samgr_lite

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/openharmony-systemabilitymgr_safwk.git
git@api.gitlife.ru:oschina-mirror/openharmony-systemabilitymgr_safwk.git
oschina-mirror
openharmony-systemabilitymgr_safwk
openharmony-systemabilitymgr_safwk
master