当前位置:首页 > 通信资讯 > 正文

OpenHarmony开源(openharmony原生应用)

OpenHarmony开源(openharmony原生应用)

1.简介

安全子系统为OpenHarmony提供有效保护应用和用户数据的能力。

主要功能: 系统安全、数据安全、应用安全等;

目前开源功能: 应用完整性保护、应用权限管理、设备认证、密钥管理服务、数据分级保护;

应用权限管理: 为程序框架子系统提供权限管理功能,并且为上层应用提供权限申请和授权状态查询接口。

本文将介绍标准系统下安全子系统应用权限管理部分如何在系统内适配及实现,尽力深入细节部分。

1.1 OpenHarmony 架构图

OpenHarmony开源(openharmony原生应用)

1.2 安全子系统

OpenHarmony开源(openharmony原生应用)

1.3 应用权限管理

OpenHarmony中应用和系统服务均运行在独立的沙箱中,进程空间和程序数据都是相互隔离的,以保护应用数据的安全性;但是运行在独立沙箱中的服务或应用同时需要对外提供一些API以实现所需功能,其他独立沙箱中的应用在跨进程访问这些API时,需要系统提供一种权限管理机制对这些API的访问者进行授权。

应用权限管理提供了权限定义机制,允许系统服务和应用为自己的敏感API定义新的权限,其他应用必须申请此权限才能访问此敏感API;

应用权限管理提供了权限申请机制,允许应用申请权限,这些权限由系统或者其他应用定义,权限申请通过后就能访问这个权限相关的系统或其他应用提供的敏感API;

应用权限管理也为用户提供了一些必须的功能,方便用户查看和管理权限授予情况。

OpenHarmony开源(openharmony原生应用)

2.基础知识

2.1 代码结构

  1. /base/security/permission
  2. ├── frameworks # 基础设施层
  3. │ └── permission_standard # 标准系统权限管理基础设施层
  4. ├── interfaces # 接口层
  5. │ ├── innerkits # 内部接口层
  6. │ │ ├── permission_lite # 轻量系统、小型系统权限管理内部接口层
  7. │ │ └── permission_standard # 标准系统权限管理内部接口层
  8. │ └── kits # 外部接口层
  9. │ ├── permission_lite # 轻量系统、小型系统权限管理外部接口层
  10. │ └── permission_standard # 标准系统权限管理外部接口层
  11. └── services # 服务层
  12. ├── permission_lite # 轻量系统、小型系统权限管理服务层
  13. └── permission_standard # 标准系统权限管理服务层

2.2 SystemAbility

应用权限管理模块是以SystemAbility的形式对外提供能力的,在分布式任务调度子系统中safwk组件定义OpenHarmony中SystemAbility的实现方法,并提供启动、注册等接口实现。

实现一个SystemAbility需要六个步骤:

1)定义该服务对外提供的能力集合函数

  1. namespace OHOS {
  2. class IListenAbility : public IRemoteBroker {
  3. public:
  4. virtual int AddVolume(int volume) = 0;
  5. public:
  6. enum {
  7. ADD_VOLUME = 1,
  8. };
  9. public:
  10. DECLARE_INTERFACE_DESCRIPTOR(u"OHOS.test.IListenAbility");
  11. };
  12. }

2) 定义客户端通信代码XXXProxy

  1. namespace OHOS {
  2. class ListenAbilityProxy : public IRemoteProxy {
  3. public:
  4. int AddVolume(int volume);
  5. explicit ListenAbilityProxy(const sptr& impl)
  6. : IRemoteProxy(impl)
  7. {
  8. }
  9. private:
  10. static inline BrokerDelegator delegator_;
  11. };
  12. } // namespace OHOS

3) 定义服务端通信代码XXXStub

  1. namespace OHOS {
  2. int32_t ListenAbilityStub::OnRemoteRequest(uint32_t code,
  3. MessageParcel& data, MessageParcel &reply, MessageOption &option)
  4. {
  5. switch (code) {
  6. case ADD_VOLUME: {
  7. return reply.WriteInt32(AddVolume(data.ReadInt32()));
  8. }
  9. default:
  10. return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
  11. }
  12. }
  13. }

4)SystemAbility的实现类

  1. namespace {
  2. constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, 0xD001800, "SA_TST"};
  3. }
  4. REGISTER_SYSTEM_ABILITY_BY_ID(ListenAbility, DISTRIBUTED_SCHED_TEST_LISTEN_ID, true);
  5. ListenAbility::ListenAbility(int32_t saId, bool runOnCreate) : SystemAbility(saId, runOnCreate)
  6. {
  7. HiLog::Info(LABEL, ":%s called", __func__);
  8. HiLog::Info(LABEL, "ListenAbility()");
  9. }
  10. ListenAbility::~ListenAbility()
  11. {
  12. HiLog::Info(LABEL, "~ListenAbility()");
  13. }
  14. int ListenAbility::AddVolume(int volume)
  15. {
  16. pid_t current = getpid();
  17. HiLog::Info(LABEL, "ListenAbility::AddVolume volume = %d, pid = %d.", volume, current);
  18. return (volume + 1);
  19. }
  20. void ListenAbility::OnDump()
  21. {
  22. }
  23. void ListenAbility::OnStart()
  24. {
  25. HiLog::Info(LABEL, "ListenAbility::OnStart()");
  26. HiLog::Info(LABEL, "ListenAbility:%s called:-----Publish------", __func__);
  27. bool res = Publish(this);
  28. if (res) {
  29. HiLog::Error(LABEL, "ListenAbility: res == false");
  30. }
  31. HiLog::Info(LABEL, "ListenAbility:%s called:AddAbilityListener_OS_TST----beg-----", __func__);
  32. AddSystemAbilityListener(DISTRIBUTED_SCHED_TEST_OS_ID);
  33. HiLog::Info(LABEL, "ListenAbility:%s called:AddAbilityListener_OS_TST----end-----", __func__);
  34. HiLog::Info(LABEL, "ListenAbility:%s called:StopAbility_OS_TST----beg-----", __func__);
  35. StopAbility(DISTRIBUTED_SCHED_TEST_OS_ID);
  36. HiLog::Info(LABEL, "ListenAbility:%s called:StopAbility_OS_TST----end-----", __func__);
  37. return;
  38. }
  39. void ListenAbility::OnStop()
  40. {

5)SystemAbility配置

以c++实现的SA必须配置相关System Ability的profile配置文件才会完成SA的加载注册逻辑,否则没有编写profile配置的System Ability不会完成注册。配置方法如下:

在子系统的根目录新建一个以sa_profile为名的文件夹;然后在此文件夹中新建两个文件:一个以serviceId为前缀的xml文件;另外一个为BUILD.gn文件

  1. "1.0" encoding="UTF-8"?>
  2. listen_test

  3. <name>serviceidname>
  4. /system/lib64/liblistentest.z.so
如果您对该产品感兴趣,请填写办理(客服微信:xiaoxiongyidong)

为您推荐:

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。