【最新鸿蒙应用开发】——沙箱机制是什么?作用?场景?

news2024/10/6 5:53:19

沙箱机制

1. 什么是沙箱机制?

1.1. 概念

在操作系统当中,沙箱机制(Sandboxing)是一种安全机制,用于限制程序代码的访问权限,防止恶意软件对系统造成破坏。在沙箱环境中,程序只能访问特定的资源,如文件、注册表、网络等,而不能访问其他系统资源。这样,即使恶意软件试图执行有害操作,也会因为权限限制而无法成功。

1.2. 沙箱机制的主要用途包括:

  1. 防止恶意软件破坏系统:通过限制程序的访问权限,沙箱机制可以防止恶意软件修改系统文件、注册表等关键资源,保护系统的安全。

  2. 保护用户隐私:沙箱机制可以限制程序访问用户的个人信息,如文档、图片等,防止恶意软件窃取用户隐私。

  3. 防止系统崩溃:沙箱机制可以限制程序的资源使用,如内存、CPU等,防止恶意软件占用过多资源导致系统崩溃。

  4. 提供测试环境:沙箱环境允许开发人员在不影响实际系统的情况下测试程序的功能和性能。

总之,沙箱机制是一种有效的安全机制,可以保护系统资源用户隐私系统稳定性防止恶意软件对系统造成破坏。

2. 鸿蒙沙箱机制

2.1. 原理

鸿蒙操作系统(OpenHarmony)中的沙箱机制是一个重要的安全特性,它为每个应用提供了一个独立、安全的运行环境。这种机制通过将应用的文件(包括安装文件、资源文件和缓存文件)隔离在一个独立的沙箱目录中来实现,这样每个应用都能够在自己的沙箱中运行,互不干扰,从而提高了系统的安全性稳定性

被隔离的沙箱环境如何访问系统资源?

HarmonyOS中,每个应用都有其独立的沙箱目录,用于存储应用的文件。沙箱路径是指应用内部的文件路径,而物理路径则是指文件在存储设备上的实际路径。通过映射关系沙箱路径物理路径可以相互转换,使得应用可以访问其所需的文件资源。

沙箱有什么具体使用场景?
  1. 进行文件读写时

    HarmonyOS的文件API分为同步异步两种操作方式。在进行耗时的文件操作时(如文件拷贝),应避免在主进程中进行同步操作,因为这可能会阻塞主进程。相反,应选择使用异步操作或新建一个worker来执行文件操作。例如,可以使用fs.openSync方法来异步打开一个文件,并指定打开模式为读写模式,如果不存在则创建。

  2. 使用第三方模块时

    对于app调用三方模块时出现的问题,如果app源码没有使用绝对路径去访问文件,可以通知三方模块,让其访问文件路径通过context接口进行访问而非使用绝对路径的方式。这样可以确保三方模块也能够遵守沙箱文件的访问规则,从而避免出现路径访问异常。

2.2. 场景演示(系统文件读写)

由于沙箱安全机制的规则,开发者是无法直接访问系统资源的目录的,可以将原来访问/data目录的绝对路径访问方式调整为使用context接口进行访问,也就是访问沙箱目录下的缓存目录(沙箱目录和系统物理路径是可以通过映射关系相互转换的),通过fs.openSync方法来异步打开一个文件,并指定打开模式为读写模式,如果不存在则创建。再使用fs.copyFileSync将文件的内存地址写入沙箱路径的缓存目录中。

    //openSync获取系统中该文件对应的内存地址
    const file = fs.openSync(photoImagePath, fs.OpenMode.READ_ONLY)
​
    //copyFileSync将内存地址写入沙箱目录中
    let Path = getContext().cacheDir + '/' + fileName
    fs.copyFileSync(file.fd, Path)

效果:

参考代码

import { picker } from '@kit.CoreFileKit'
import fs from '@ohos.file.fs';
import emitter from '@ohos.events.emitter';
import { LoadingDialog1 } from '../components/LoadingDialog';
import { ILoginUserModel } from '../../models/AccountModel';
import { Logger } from '../utils/Logger';
import { request } from '@kit.BasicServicesKit';
import { HdHttp } from '../utils/request';
import { promptAction } from '@kit.ArkUI';
​
@Component
  //用于图片上传的组件
export struct PictureUpload {
  @Prop
  showPicture: string
  // 打开上传进度自定义弹窗
  dialog: CustomDialogController = new CustomDialogController({
    builder: LoadingDialog1({ message: '上传进度:0' }),
    customStyle: true,
    alignment: DialogAlignment.Center
  })
​
  // 用户选择系统中的一个图片返回
  async pickerAvatar() {
    // 1. 引导用户选择一张系统相册的照片
    //  1.1. 限定让用户只能从系统相册中选择1张图片
    const options = new picker.PhotoSelectOptions()
    options.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE //只能选择图片类型的资源
    options.maxSelectNumber = 1 //只能选择一张系统相册中的照片
​
    //  1.2. 利用PhotoViewPicker对象实例中的select自动获取到用户选择的那张图片的地址
    const pickerView = new picker.PhotoViewPicker()
    let urls = await pickerView.select(options)
​
    if (urls.photoUris.length <= 0) {
      return
    }
    let photoImagePath = urls.photoUris[0]
​
    // 2. 将需要上传的图片写入缓存地址
    //  2.1 定义一个不重复的文件名和文件类型
    const fileTypeIndex = photoImagePath.lastIndexOf('.')
    const fileType = photoImagePath.slice(fileTypeIndex + 1)
    const fileName = Date.now() + '.' + fileType
    //  2.2. openSync获取系统中该文件对应的内存地址
    const file = fs.openSync(photoImagePath, fs.OpenMode.READ_ONLY)
​
    //  2.3. copyFileSync将内存地址写入沙箱目录中
    let Path = getContext().cacheDir + '/' + fileName
    fs.copyFileSync(file.fd, Path)
​
    //  2.4. 沙箱目录中缓存文件的地址
    const cacheFullPath = `internal://cache/${fileName}`
​
    // 3. 上传
    this.dialog.open()
​
    let user = AppStorage.get('user') as ILoginUserModel
    let token = user?.token
​
    let upload = await request.uploadFile(getContext(), {
      method: 'POST',
      url: 'https://api-harmony-teach.itheima.net/hm/userInfo/avatar',
      header: {
        "Content-Type": "multipart/form-data",
        "Authorization": `Bearer ${token}`
      },
      files: [{
        filename: fileName,
        type: fileType,
        name: 'file',
        uri: cacheFullPath
      }],
      data: []
    })
​
    //  监听上传的进度
    //   uploadedSize:当前上传了多少size
    //   totalSize:表示当前要上传文件的总大小
    upload.on('progress', (uploadedSize, totalSize) => {
      // 上传百分比计算:
      let pnum = (uploadedSize / totalSize * 100).toFixed(0)
      Logger.info('上传进度:', pnum)
      // 使用emitter来进行发送事件
      emitter.emit({ eventId: 0 }, { data: { process: '已上传:' + pnum } })
      // Logger.info('上传大小:' + uploadedSize, '总大小:' + totleSize)
      if (uploadedSize === totalSize) {
        this.dialog.close()
        // 重新更新头像数据
        this.update()
      }
    })
​
  }
​
  // 重新获取最新的图片更新到AppStorage中
  async update() {
    let res = await HdHttp.get<object>('userInfo')
    // 由于我只需要服务器返回数据中的avatar字段的值,所以这里直接采取对象中括号取值法获取结果即可
    // 好处:省略掉接口的定义
    this.showPicture = res.data['avatar']
    promptAction.showToast({ message: '头像修改成功' })
  }
​
  build() {
    Column() {
      Image(this.showPicture || $rawfile('avatar.png'))
        .width((40))
        .width((40))
        .borderRadius((40))
        .border({ width: 0.5, color: '#e4e4e4' })
        .onClick(async () => {
          //  选择系统相册图片进行上传
          this.pickerAvatar()
        })
    }
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1797871.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker 学习总结(83)—— 配置文件daemon.json介绍及优化建议

一、daemon.json 文件概述 daemon.json是Docker守护进程的配置文件,它允许系统管理员自定义Docker守护程序的行为。此文件通常位于/etc/docker/目录下。通过修改daemon.json,可以调整Docker守护进程的多种设置,包括网络配置、日志记录、存储驱动等。 二、daemon.json 文件结…

YoloV8改进策略:Block篇|MobileNetV4——移动生态系统的通用模型

文章目录 摘要1、引言2、相关工作3、硬件无关的帕累托效率4、通用反向瓶颈5、Mobile MQA6、MNv4模型设计6.1、精炼NAS以增强架构6.2、MNv4模型的优化 7、结果7.1、ImageNet分类 8、增强蒸馏方案9、结论10、致谢A、搜索空间细节B、基准测试方法论C、ImageNet-1k分类任务的训练设…

Linux之线程及线程安全详解

前言&#xff1a;在操作系统中&#xff0c;进程是资源分配的基本单位&#xff0c;那么线程是什么呢&#xff1f;线程是调度的基本单位&#xff0c;我们该怎么理解呢&#xff1f; 目录 一&#xff0c;线程概念理解 二&#xff0c;Linux里面的线程原理 三&#xff0c;为什么要…

哈夫曼树的构造,哈夫曼树的存在意义--求哈夫曼编码

一:哈夫曼树的构造 ①权值,带权路径长度。 ②一组确定权值的叶子节点可以构造多个不同的二叉树,但是带权路径长度min的是哈夫曼树 ③算法基本思想及其实操图片演示 注:存储结构和伪代码 1 初始化: 构造2n-1棵只有一个根节点的二叉树,parent=rchild=lchild=-1; 其中…

忆恒创源国产系列新品 —— PBlaze7 7A40 取得 PCI-SIG 兼容性认证

在此前报道中&#xff0c;我们曾预告了忆恒创源国产系列 PCIe 5.0 SSD 新品 —— PBlaze7 7A40&#xff0c;今天&#xff0c;这款 SSD 已经顺利通过 PCI-SIG 的严格测试并出现在 Integrators List 集成商列表当中&#xff0c;标志着距离 PBlaze7 7A40 的正式发布又近了一步。 正…

Spring Boot框架基础

文章目录 1 Spring Boot概述2 Spring Boot入门2.1 项目搭建2.2 入门程序 3 数据请求与响应3.1 数据请求3.2 数据响应 4 分层解耦4.1 三层架构4.2 控制反转4.3 依赖注入 5 参考资料 1 Spring Boot概述 Spring是Java EE编程领域的一个轻量级开源框架&#xff0c;是为了解决企业级…

乐高小人分类项目

数据来源 LEGO Minifigures | Kaggle 建立文件目录 BASE_DIR lego/star-wars-images/ names [YODA, LUKE SKYWALKER, R2-D2, MACE WINDU, GENERAL GRIEVOUS ] tf.random.set_seed(1)# Read information about dataset if not os.path.isdir(BASE_DIR train/):for name in …

Edge 工作区是什么?它都有哪些作用?

什么是工作区 Edge 工作区是什么&#xff1f;它是微软 Edge 浏览器中的一个功能&#xff0c;在帮助用户更好地组织和管理他们的浏览会话。通过工作区&#xff0c;用户可以创建多个独立的浏览环境&#xff0c;每个工作区内包含一组相关的标签页和浏览器设置。这使得用户能够根据…

asp.net core使用httpclient

主要讲解常见的get请求和post请求 GET var client new HttpClient(); //3秒钟不响应就超时 client.TimeoutTimeSpan.FromSeconds(3); using HttpResponseMessage response await client.GetAsync("todos/3"); var jsonResponse await response.Content.ReadAsSt…

变压器绕线完成之后要做的事

1 调整感量&#xff1a;测主绕组电感量&#xff0c;通过磨气隙或垫气隙&#xff0c;测得感量没错以后&#xff0c;用胶带封装磁芯 2 测验同名端是否正确&#xff1a;两绕组首尾相连&#xff0c;测试连接后的总感量&#xff0c;是否比感量大的那个绕组还大。如果是&#xff0c;…

Allegro热风焊盘制作教程

阿里狗热风焊盘制作教程 打开PCB Editor&#xff0c;新建Flash symbol&#xff0c;最好保存在与Pad文件同一个路径 点击Setup–>Design Parameter Editor,设置mm单位&#xff0c;在设置画布&#xff0c;把原点提上去&#xff0c;点击Apply和OK 把视野调整到原点 点击Setup–…

vue面试题2-根据以下问题回答

以下是针对提供的关于Vue的问题的回答&#xff1a; Vue的基本原理&#xff1a; Vue.js是一个流行的JavaScript框架&#xff0c;用于构建用户界面和单页面应用。其基本原理包括响应式数据、模板、组件系统、指令、生命周期钩子和虚拟DOM。 双向数据绑定的原理&#xff1a; Vue通…

咖啡机器人如何精准控制液位流量

在如今快节奏的生活中&#xff0c;精确控制液位流量的需求愈发迫切&#xff0c;特别是在咖啡机器人等精密设备中。为了满足这一需求&#xff0c;工程师们不断研发出各种先进的技术&#xff0c;以确保液体流量的精准控制。其中&#xff0c;霍尔式流量计和光电式流量计就是两种常…

转让北京海淀成立满1年拍卖公司许可证条件和流程

拍卖经营批准证书是拍卖企业经营所需的许可&#xff0c;是为了维护拍卖秩序&#xff0c;保护拍卖活动各方合法权益而颁发的合法凭证。其中个人物品&#xff0c;公司物品&#xff0c;或者国有资源的拍卖可通过普通拍卖资质进行拍卖。而文物古董拍卖类的需取得文物拍卖经营许可证…

google keybox.xml格式 内容有哪些 Keybox数量、设备ID、算法的 私钥 公钥 证书链 (ECDSA即ECC, RSA)

根据您提供的文件内容&#xff0c;keybox.xml 文件包含以下主要信息&#xff1a; Keybox数量 ([NumberOfKeyboxes](file:///d%3A/010F200/svn/ProduceToolMfc/FtSmartPos/FtSmartPos/ToolBydMes/httpclient/e%3A%5CGoogleKey%5CLinux_AttestationKeyboxPack_Tool%5CLinux_Atte…

【吊打面试官系列】简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别 ?

大家好&#xff0c;我是锋哥。今天分享关于 【简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别 &#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别 &#xff1f; MyISAM&#xff1a; 不支持事务&#xff0c;但是…

全网最全!场外个股期权的询价下单流程的详细解析

场外个股期权的询价下单流程 场外个股期权交易&#xff0c;作为在交易所外进行的个性化期权交易方式&#xff0c;为投资者提供了更加灵活和定制化的交易选择。以下是场外个股期权询价下单流程的详细步骤&#xff1a; 文章来源/&#xff1a;财智财经 第一步&#xff1a;明确交…

APP兼容性测试都需要考虑哪些场景?

APP测试的时候都需要验证兼容性。那兼容性测试需要考虑哪些场景&#xff1f; 进行APP的兼容性测试时&#xff0c;需要考虑以下一些常见的测试场景&#xff1a; 1. 操作系统兼容性&#xff1a;测试应用程序在不同操作系统上的兼容性&#xff0c;如iOS、Android、Windows等。确…

一文搞懂DevOps、DataOps、MLOps、AIOps:所有“Ops”的比较

引言 近年来&#xff0c;“Ops”一词在 IT 运维领域的使用迅速增加。IT 运维正在向自动化过程转变&#xff0c;以改善客户交付。传统的应用程序开发采用 DevOps 实施持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;。但对于数据密集型的机器学习和人…

量水堰计的校准和误差分析:提高测量精度的技巧

量水堰计作为一种重要的流量测量工具&#xff0c;广泛应用于水利工程、环境监测和农业灌溉等领域。为了确保其测量结果的准确性和可靠性&#xff0c;对量水堰计进行定期校准和误差分析至关重要。本文将详细讨论量水堰计的校准方法、误差来源以及提高测量精度的技巧。 一、量水堰…