Компонент Управителя Возможностей Системы (Samgr) является основным компонентом OpenHarmony. Он предоставляет функции, связанные с системными возможностями (также называемыми системными службами), включая запуск, регистрацию и запрос.
Рисунок 1. Аппаратная архитектура Samgr
/foundation/systemabilitymgr
├── samgr
│ ├── bundle.json # Описание и файл сборки Samgr
│ ├── frameworks # Реализация фреймворка
│ ├── interfaces # API
│ ├── services # Директория для службы Samgr
│ ├── test # Код тестирования
│ ├── utils # Инструменты
При получении сообщения регистрации от фреймворка системной возможности, служба 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;
}
Если система просит службу, которая является локальной службой, служба 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;
}
Служба 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;
}
ЗАМЕЧАНИЕ
После вызова LoadSystemAbility, если указанная системная возможность успешно загружается, будет вызван обратный вызов OnLoadSystemAbilitySuccess, а если загрузка завершается неудачей, будет вызван обратный вызов OnLoadSystemAbilityFail.
Динамически загружаемый процесс не может начинаться при запуске системы. Вам необходимо установить "ondemand": true в файле .cfg. Пример ниже:
{ "services" : [{ "name" : "listen_test", "path" : ["/system/bin/sa_main", "/system/profile/listen_test.json"], "ondemand" : true, "uid" : "system", "gid" : ["system", "shell"] } ] }
- Метод LoadSystemAbility применим к динамической загрузке системных возможностей. В других случаях используйте метод CheckSystemAbility для получения системной возможности.
- Имя процесса в файле .cfg должно совпадать с именем процесса в файле конфигурации .json системы.
Samgr
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )