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

OSCHINA-MIRROR/openharmony-systemabilitymgr_samgr

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

Самгр

Введение

Компонент Управителя Возможностей Системы (Samgr) является основным компонентом OpenHarmony. Он предоставляет функции, связанные с системными возможностями (также называемыми системными службами), включая запуск, регистрацию и запрос.

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

Рисунок 1. Аппаратная архитектура Samgr

Аппаратная архитектура Samgr

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

/foundation/systemabilitymgr
├── samgr
│   ├── bundle.json  # Описание и файл сборки Samgr
│   ├── frameworks   # Реализация фреймворка
│   ├── interfaces   # API
│   ├── services     # Директория для службы Samgr
│   ├── test         # Код тестирования
│   ├── utils        # Инструменты

Описание

  1. При получении сообщения регистрации от фреймворка системной возможности, служба Samgr сохраняет информацию о системной возможности в локальном кэше.

    int32_t SystemAbilityManager::AddSystemAbility(int32_t systemAbilityId, const sptr<IRemoteObject>& ability,
        const SAExtraProp& extraProp)
    {
        if (!CheckInputSysAbilityId(systemAbilityId) || ability == nullptr) {
            HILOGE("AddSystemAbilityExtra входные параметры недействительны.");
            return ERR_INVALID_VALUE;
        }
        {
            unique_lock<shared_mutex> writeLock(abilityMapLock_);
            auto saSize = abilityMap_.size();
            if (saSize >= MAX_SERVICES) {
                HILOGE("размер карты ошибочен, (уже больше чем %zu)", saSize);
                return ERR_INVALID_VALUE;
            }
            SAInfo saInfo;
            saInfo.remoteObj = ability;
            saInfo.isDistributed = extraProp.isDistributed;
            saInfo.capability = extraProp.capability;
            saInfo.permission = Str16ToStr8(extraProp.permission);
            abilityMap_[systemAbilityId] = std::move(saInfo);
            HILOGI("вставка %{public}d. размер : %{public}zu", systemAbilityId, abilityMap_.size());
        }
        RemoveCheckLoadedMsg(systemAbilityId);
        if (abilityDeath_ != nullptr) {
            ability->AddDeathRecipient(abilityDeath_);
        }
    
        u16string strName = Str8ToStr16(to_string(systemAbilityId));
        if (extraProp.isDistributed && dBinderService_ != nullptr) {
            dBinderService_->RegisterRemoteProxy(strName, systemAbilityId);
            HILOGD("AddSystemAbility RegisterRemoteProxy, serviceId is %{public}d", systemAbilityId);
        }
        if (systemAbilityId == SOFTBUS_SERVER_SA_ID && !isDbinderStart_) {
            if (dBinderService_ != nullptr && rpcCallbackImp_ != nullptr) {
                bool ret = dBinderService_->StartDBinderService(rpcCallbackImp_);
                HILOGI("результат старта %{public}s", ret ? "удачный" : "неудачный");
                isDbinderStart_ = true;
            }
        }
        SendSystemAbilityAddedMsg(systemAbilityId, ability);
        return ERR_OK;
    }
  2. Если система просит службу, которая является локальной службой, служба Samgr находит объект-посредник службы на основе идентификатора службы и возвращает объект-посредник обратно в фреймворк системной возможности.

    sptr<IRemoteObject> SystemAbilityManager::CheckSystemAbility(int32_t systemAbilityId)
    {
        if (!CheckInputSysAbilityId(systemAbilityId)) {
            HILOGW("CheckSystemAbility проверка неверна!");
            return nullptr;
        }
    
        shared_lock<shared_mutex> readLock(abilityMapLock_);
        auto iter = abilityMap_.find(systemAbilityId);
        if (iter != abilityMap_.end()) {
            HILOGI("найдена служба : %{public}d.", systemAbilityId);
            return iter->second.remoteObj;
        }
        HILOGI("служба не найдена : %{public}d", systemAbilityId);
        return nullptr;
    }
  3. Служба Samgr динамически загружает процесс системы и системные возможности. Вместо того чтобы начинаться при запуске системы, процесс начинается при доступе к системной возможности и загружает указанную системную возможность.

    3.1 Наследуйте от класса SystemAbilityLoadCallbackStub и переопределите методы OnLoadSystemAbilitySuccess(int32_t systemAbilityId, const sptr& remoteObject) и OnLoadSystemAbilityFail(int32_t systemAbilityId).

    class OnDemandLoadCallback : public SystemAbilityLoadCallbackStub {
    public:
        void OnLoadSystemAbilitySuccess(int32_t systemAbilityId, const sptr<IRemoteObject>& remoteObject) override;
        void OnLoadSystemAbilityFail(int32_t systemAbilityId) override;
    };
    
    void OnDemandLoadCallback::OnLoadSystemAbilitySuccess(int32_t systemAbilityId,
        const sptr<IRemoteObject>& remoteObject) // systemAbilityId - это идентификатор загружаемой системной возможности, а remoteObject указывает на объект-посредник этой системы.
    {
        cout << "OnLoadSystemAbilitySuccess systemAbilityId:" << systemAbilityId << " IRemoteObject result:" <<
            ((remoteObject != nullptr) ? "удачный" : "неудачный") << endl;
    }
    
    void OnDemandLoadCallback::OnLoadSystemAbilityFail(int32_t systemAbilityId) // systemAbilityId - это идентификатор загружаемой системной возможности.
    {
        cout << "OnLoadSystemAbilityFail systemAbilityId:" << systemAbilityId << endl;
    }

    3.2 Вызовите метод LoadSystemAbility(int32_t systemAbilityId, const sptr& callback), предоставленный Samgr.

    // Создайте экземпляр класса SystemAbilityLoadCallbackStub (описано в шаге 3.1).
    sptr<OnDemandLoadCallback> loadCallback_ = new OnDemandLoadCallback();
    // Вызовите метод LoadSystemAbility.
    sptr<ISystemAbilityManager> sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
    if (sm == nullptr) {
        cout << "Получение объекта Samgr GetSystemAbilityManager null!" << endl;
        return;
    }
    int32_t result = sm->LoadSystemAbility(systemAbilityId, loadCallback_);
    if (result != ERR_OK) {
        cout << "systemAbilityId:" << systemAbilityId << " загрузка не удалась, код результата:" << result << endl;
        return;
    }

ЗАМЕЧАНИЕ

  1. После вызова LoadSystemAbility, если указанная системная возможность успешно загружается, будет вызван обратный вызов OnLoadSystemAbilitySuccess, а если загрузка завершается неудачей, будет вызван обратный вызов OnLoadSystemAbilityFail.

  2. Динамически загружаемый процесс не может начинаться при запуске системы. Вам необходимо установить "ondemand": true в файле .cfg. Пример ниже:

{
  "services" : [{
          "name" : "listen_test",
          "path" : ["/system/bin/sa_main", "/system/profile/listen_test.json"],
          "ondemand" : true,
          "uid" : "system",
          "gid" : ["system", "shell"]
      }
  ]
}
  1. Метод LoadSystemAbility применим к динамической загрузке системных возможностей. В других случаях используйте метод CheckSystemAbility для получения системной возможности.
  2. Имя процесса в файле .cfg должно совпадать с именем процесса в файле конфигурации .json системы.

Вовлечённые репозитории

Samgr

systemabilitymgr_safwk

systemabilitymgr_samgr

systemabilitymgr_safwk_lite

systemabilitymgr_samgr_lite

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

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

Введение

Систем сервис мэнеджмент | System ability manager. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

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

Участники

все

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

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