HarmonyOS(51) 应用沙箱目录和Context获取文件路径

news2024/12/23 19:24:41

文件目录

  • 应用沙箱目录
    • 沙箱目录的分类
    • 应用文件目录结构
    • 应用文件路径详细说明
    • ApplicationContext获取应用文件路径
    • 通过AbilityStageContext、UIAbilityContext、ExtensionContext获取HAP级别的应用文件路径
    • 切换el1和el2
      • AreaMode简介
  • 参考资料

应用沙箱目录

沙箱目录的分类

如下图所示,应用沙箱目录有两部分组成:应用文件和(少量)系统文件(只读)。本应用的文件对其他应用不可见,同样本应用也无法获取别的应用的沙箱目录下的文件。

在这里插入图片描述

应用文件目录结构

一共有七级目录,其中禁止直接使用字符串来组成四级目录之前的路径,防止系统版本出现变化而导致的不兼容问题。
在这里插入图片描述

  1. 一级目录data/:代表应用文件目录。
  2. 二级目录storage/:代表本应用持久化文件目录。
  3. 三级目录el1/、el2/:代表不同文件加密类型。
  • el1,设备级加密区:设备开机后即可访问的数据区。
  • el2,用户级加密区:设备开机后,需要至少一次解锁对应用户的锁屏界面(密码、指纹、人脸等方式或无密码状态)后,才能够访问的加密数据区。应用如无特殊需要,应将数据存放在el2加密目录下
  1. 四级、五级目录:
  • 通过ApplicationContext可以获取distributedfiles目录或base下的files、cache、preferences、temp等目录的应用文件路径,应用全局信息可以存放在这些目录下。
  • 通过UIAbilityContext、AbilityStageContext、ExtensionContext可以获取HAP级别应用文件路径。HAP信息可以存放在这些目录下,存放在此目录的文件会跟随HAP的卸载而删除,不会影响App级别目录下的文件

应用文件路径详细说明

  • bundle:为安装文件路径。通过context.bundleCodeDir获取。应用安装后的App的HAP资源包所在目录;随应用卸载而清理。不能拼接路径访问资源文件,请使用资源管理接口访问资源。可以用于存储应用的代码资源数据,主要包括应用安装的HAP资源包、可重复使用的库文件以及插件资源等。此路径下存储的代码资源数据可以被用于动态加载。
  • base:本设备文件路径。无法直接获取,应用在本设备上存放持久化数据的目录,子目录包含files/、cache/、temp/和haps/;随应用卸载而清理
  • database:为数据库路径。通过context.databaseDir获取,应用在el2加密条件下存放通过分布式数据库服务操作的文件目录;随应用卸载而清理。仅用于保存应用的私有数据库数据,主要包括数据库文件等。此路径下仅适用于存储分布式数据库相关文件数据。
  • distributedfiles:分布式文件路径,通过context.distributedFilesDir获取。 应用在el2加密条件下存放分布式文件的目录,应用将文件放入该目录可分布式跨设备直接访问;随应用卸载而清理。可以用于保存应用分布式场景下的数据,主要包括应用多设备共享文件、应用多设备备份文件、应用多设备群组协助文件。此路径下存储这些数据,使得应用更加适合多设备使用场景。
  • files:应用通用文件路径,通过context.filesDir获取。应用在本设备内部存储上通用的存放默认长期保存的文件路径;随应用卸载而清理。可以用于保存应用的任何私有数据,主要包括用户持久性文件、图片、媒体文件以及日志文件等。此路径下存储这些数据,使得数据保持私有、安全且持久有效。
  • cache:应用缓存文件路径,通过context.cacheDir获取。应用在本设备内部存储上用于缓存下载的文件或可重新生成的缓存文件的路径,应用cache目录大小超过配额或者系统空间达到一定条件,自动触发清理该目录下文件;用户通过系统空间管理类应用也可能触发清理该目录。.应用需判断文件是否仍存在,决策是否需重新缓存该文件。可以用于保存应用的缓存数据,主要包括离线数据、图片缓存、数据库备份以及临时文件等。此路径下存储的数据可能会被系统自动清理,因此不要存储重要数据。
  • preferences:应用首选项文件路径,通过context.preferencesDir获取。可以用于保存应用的首选项数据,主要包括应用首选项文件以及配置文件等。此路径下仅适用于存储小量数据。,类似android sharePreference.
  • temp:应用临时文件路径。通过context.tempDir获取。 应用在本设备内部存储上仅在应用运行期间产生和需要的文件,。应用退出后即清理。可以用于保存应用的临时生成的数据,主要包括数据库缓存、图片缓存、临时日志文件、以及下载的应用安装包文件等。此路径下存储使用后即可删除的数据。

ApplicationContext获取应用文件路径

可以使用ApplicationContext获取文件路径,代码如下:

   private context = getContext(this) as common.UIAbilityContext;
  //获取ApplicationContext
  let applicationContext = this.context.getApplicationContext();
  let cacheDir = applicationContext.cacheDir;
  let tempDir = applicationContext.tempDir;
  let filesDir = applicationContext.filesDir;
  let databaseDir = applicationContext.databaseDir;
  let bundleCodeDir = applicationContext.bundleCodeDir;
  let distributedFilesDir = applicationContext.distributedFilesDir;
  let preferencesDir = applicationContext.preferencesDir;
  let cloudFileDir = applicationContext.cloudFileDir;
  console.log("file path cacheDir = "+cacheDir)
  console.log("file path tempDir = "+tempDir)
  console.log("file path filesDir = "+filesDir)
  console.log("file path databaseDir = "+databaseDir)
  console.log("file path bundleCodeDir = "+bundleCodeDir)
  console.log("file path distributedFilesDir = "+distributedFilesDir)
  console.log("file path preferencesDir = "+preferencesDir)
  console.log("file path cloudFileDir = "+cloudFileDir)

其目录结构如下:
在这里插入图片描述

打印日志如下:可以发现,默认状态下,除了bundle是el1目录下的,其余的获取的是el2目录下。

 I     file path cacheDir = /data/storage/el2/base/cache
 I     file path tempDir = /data/storage/el2/base/temp
 I     file path filesDir = /data/storage/el2/base/files
 I     file path databaseDir = /data/storage/el2/database
 I     file path bundleCodeDir = /data/storage/el1/bundle
 I     file path distributedFilesDir = /data/storage/el2/distributedfiles
 I     file path preferencesDir = /data/storage/el2/base/preferences
 I     file path cloudFileDir = /data/storage/el2/cloud

通过AbilityStageContext、UIAbilityContext、ExtensionContext获取HAP级别的应用文件路径

此路径是HAP相关信息推荐的存放路径,这些文件会跟随HAP的卸载而删除,但不会影响应用级别路径的文件,除非该应用的HAP已全部卸载。

  let cacheDir = this.context.cacheDir;
  let tempDir =  this.context.tempDir;
  let filesDir =  this.context.filesDir;
  let databaseDir =  this.context.databaseDir;
  let bundleCodeDir =  this.context.bundleCodeDir;
  let distributedFilesDir =  this.context.distributedFilesDir;
  let preferencesDir =  this.context.preferencesDir;
  let cloudFileDir =  this.context.cloudFileDir;
  console.log("file path cacheDir = "+cacheDir)
  console.log("file path tempDir = "+tempDir)
  console.log("file path filesDir = "+filesDir)
  console.log("file path databaseDir = "+databaseDir)
  console.log("file path bundleCodeDir = "+bundleCodeDir)
  console.log("file path distributedFilesDir = "+distributedFilesDir)
  console.log("file path preferencesDir = "+preferencesDir)
  console.log("file path cloudFileDir = "+cloudFileDir)

其目录结构如下图:
在这里插入图片描述

打印日志如下:(因为测试代码只有一个entry的hap);

 I     file path cacheDir = /data/storage/el2/base/haps/entry/cache
 I     file path tempDir = /data/storage/el2/base/haps/entry/temp
 I     file path filesDir = /data/storage/el2/base/haps/entry/files
 I     file path databaseDir = /data/storage/el2/database/entry
 I     file path bundleCodeDir = /data/storage/el1/bundle
 I     file path distributedFilesDir = /data/storage/el2/distributedfiles
 I     file path preferencesDir = /data/storage/el2/base/haps/entry/preferences
 I     file path cloudFileDir = /data/storage/el2/cloud

切换el1和el2

通过上面测试发现,默认获取到的除了bunlde之外,获取到的都是el2目录下的路径,那我们想要获取el1下的该怎么办?很简单,使用contextConstant切换。切换代码如下:

import { UIAbility, contextConstant, AbilityConstant, Want } from '@kit.AbilityKit';

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
    // 存储普通信息前,切换到EL1设备级加密
    this.context.area = contextConstant.AreaMode.EL1; // 切换area
    // 存储普通信息

    // 存储敏感信息前,切换到EL2用户级加密
    this.context.area = contextConstant.AreaMode.EL2; // 切换area
    // 存储敏感信息

    // 存储敏感信息前,切换到EL3用户级加密
    this.context.area = contextConstant.AreaMode.EL3; // 切换area
    // 存储敏感信息

    // 存储敏感信息前,切换到EL4用户级加密
    this.context.area = contextConstant.AreaMode.EL4; // 切换area
    // 存储敏感信息
  }
}

测试代码如下:
在这里插入图片描述
日志输出如下:(其中cloudFile是个例外)

 I     file path cacheDir = /data/storage/el1/base/haps/entry/cache
 I     file path tempDir = /data/storage/el1/base/haps/entry/temp
 I     file path filesDir = /data/storage/el1/base/haps/entry/files
 I     file path databaseDir = /data/storage/el1/database/entry
 I     file path bundleCodeDir = /data/storage/el1/bundle
 I     file path distributedFilesDir = /data/storage/el1/distributedfiles
 I     file path preferencesDir = /data/storage/el1/base/haps/entry/preferences
 I     file path cloudFileDir = /data/storage/el2/cloud

AreaMode简介

另外AreaMode是个枚举类型,包含EL0~EL5 五个值,每个值的含义如下:

  • EL1:对于私有文件,如闹铃、壁纸等,应用可以将这些文件放到设备级加密分区(EL1)中,以保证在用户输入密码前就可以被访问。
  • EL2:对于更敏感的文件,如个人隐私信息等,应用可以将这些文件放到更高级别的加密分区(EL2)中,以保证更高的安全性。
  • EL3:对于应用中的记录步数、文件下载、音乐播放,需要在锁屏时读写和创建新文件,放在(EL3)的加密分区比较合适。
  • EL4:对于用户安全信息相关的文件,锁屏时不需要读写文件、也不能创建文件,放在(EL4)的加密分区更合适

参考资料

Context获取文件路径
应用沙箱目录
获取和修改加密分区

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

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

相关文章

CUDA+tensorflow+python+vscode在GPU下环境安装及问题汇总与解答

2024.8.14 因为要做深度学习,需要安装tensorflowgpu的环境,每次都搞不好整的很生气,本次将安装过程中参考的一些大佬的博客和安装过程中遇到的问题及解决方案总结一下,希望以后不要在这件事情上浪费时间。安装环境其实也没有想象中…

迁移学习代码复现

一、前言 说来可能令人难以置信,迁移学习技术在实践中是非常简单的,我们仅需要保留训练好的神经网络整体或者部分网络,再在使用迁移学习的情况下把保留的模型重新加载到内存中,就完成了迁移的过程。之后,我们就可以像训练普通神经网络那样训练迁移过来的神经网络了。 我们…

浅谈SIMD、向量化处理及其在StarRocks中的应用

前言 单指令流多数据流(SIMD)及其衍生出来的向量化处理技术已经有了相当的历史,并且也是高性能数据库、计算引擎、多媒体库等组件的标配利器。笔者在两年多前曾经做过一次有关该主题的内部Geek分享,但可能是由于这个topic离实际研发场景比较远&#xff0…

使用大模型从政府公文中抽取指标数据

文章目录 介绍流程结构介绍相关文本筛选大模型 few-shot大模型抽取结果 介绍 本文使用LangChain 结合 Ollama的qwen2:7b模型,抽取出全国市级单位每一年预期生产总值指标。 Ollama的qwen2:7b,显存占用只有5G左右,适合大多数消费级显卡运行。…

华为云Api调用怎么生成Authorization鉴权信息,StringToSign拼接流程

请求示例 Authorization 为了安全,华为云的 Api 调用都是需要在请求的 Header 中携带 Authorization 鉴权的,这个鉴权15分钟内有效,超过15分钟就不能用了,而且是需要调用方自己手动拼接的。 Authorization的格式为 OBS 用户AK:…

zabbix agent 可用性 为 灰色

解决zabbix可用性为灰色状态 配置–》模板–》选择模板, 之后正常。

排序: 插入\希尔\选择\归并\冒泡\快速\堆排序实现

1.排序的概念及应用 1.1概念 排序:所谓排序,就是一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 1.2运用 购物筛选排序: 1.3常见排序算法 2.实现常见的排序算法 int a[ {5,3,9,6,2,4,7,1,8}; 2…

MySQL数据库专栏(三)数据库服务维护操作

1、界面维护,打开服务窗口找到MySQL服务,右键单击可对服务进行启动、停止、重启等操作。 选择属性,还可以设置启动类型为自动、手动、禁用。 2、指令维护 卸载服务:sc delete [服务名称] 例如:sc delete MySQL 启动服…

嵌入式软件开发学习一:软件安装(保姆级教程)

资源下载: 江协科技提供: 资料下载 一、安装Keil5 MDK 1、双击.EXE文件,开始安装 2、 3、 4、此处尽量不要安装在C盘,安装路径选择纯英文,防止后续开发报错 5、 6、 7、弹出来的窗口全部关闭,进入下一步&a…

STM32(一):新建工程

stm32f10x.h文件:描述stm32有哪些寄存器(外围)和它对应的地址。stm32由内核和内核外围的设备组成的,内核寄存器描述和外围寄存器描述文件存储位置不在一起core_cm3.h core_cm3.c内核寄存器描述文件。mic.c内核库函数 stm32f10x_co…

【初阶数据结构】通讯录项目(可用作课程设计)

文章目录 概述1. 通讯录的效果2. SeqList.h3. Contact.h4. SeqList.c5. Contact.c6. test.c 概述 通讯录项目是基于顺序表这个数据结构来实现的。如果说数组是苍蝇小馆,顺序表是米其林的话,那么通讯录就是国宴。 换句话说,通讯录就是顺序表…

pycharm windows/mac 指定多版本python

一、背景 工作中经常会使用不同版本的包,如同时需要tf2和tf1,比较新的tf2需要更高的python版本才能安装,而像tf1.5 需要低版本的python 才能安装(如 python3.6),所以需要同时安装多个版本。 二、安装多版本python py…

会员系统开发,检测按钮位置,按钮坐标,弹出指定位置对话框-SAAS 本地化及未来之窗行业应用跨平台架构

一 获取元素坐标 var 按钮_obj document.querySelector(#未来之窗玄武id);var 按钮_rect 按钮_obj.getBoundingClientRect()console.log(按钮_rect);输出结果 bottom : 35 height : 21 left : 219.921875 right : 339.921875 top : 14 width : 120 x : 219.921875 y…

R语言统计分析——组间差异的非参数检验

参考资料:R语言实战【第2版】 如果数据无法满足t检验或ANOVA的参数假设,可以转而使用非参数检验。举例来说,若结果变量在本质上就严重偏倚或呈现有序关系,那么可以考虑非参数检验。 1、两组的比较 若两组数据独立,可以…

大厂进阶五:React源码解析之Diff算法

本文主要针对React源码进行解析,内容有: 1、Diff算法原理、两次遍历 一、Diff源码解析 以下是关于 React Diff 算法的详细解析及实例: 1、React Diff 算法的基本概念和重要性 1.1 概念 React Diff 算法是 React 用于比较虚拟 DOM 树之间…

初识C++ · 类型转换

目录 前言: 1 C中的类型转换 1.1 static_cast 1.2 reinterpret_cast 1.3 const_cast 1.4 dynamic_cast 前言: C可以说是恨死了隐式类型转换,你可能会疑问了,为什么?不是单参数隐式类型转换为自定义类型的时候人…

苹果笔记本电脑可以玩steam游戏吗 MacBook支持玩steam游戏吗 在Steam上玩黑神话悟空3A大作 苹果Mac怎么下载steam

游戏是生活的润滑剂,越来越多的用户开始关注Mac平台上可玩的游戏。幸运的是,Steam作为最大的数字发行平台之一,提供了大量适用于Mac操作系统的游戏。无论你是喜欢策略、冒险还是射击类游戏,都能在Steam上找到适合自己Mac设备玩耍的…

ESP32CAM人工智能教学18

ESP32CAM人工智能教学18 获取数据并显示 如果我们给ESP32Cam外挂一些传感器(比如温湿度传感器、超声波测距传感器、红外人体传感器等),我们怎么把ESP32Cam捕获到的数据,传递到客户端的浏览器,并在网页index.html中显示…

WordPress网站速度优化

提升网站速度对用户体验和搜索引擎排名至关重要。无论你是新手博主,还是经验丰富的网站开发人员,要想优化WordPress网站,需要长时间的努力和坚持。以下是按入门、中级和专家级别介绍的12个实用方法,帮助你提升WordPress网站的整体…

zabbix监控进程,日志,主从状态和主从延迟

自定义监控进程 使用httpd服务为例,监控httpd的进程 在zabbix-agent上安装httpd yum -y install httpd 重启httpd systemctl restart httpd systemtctl enable httpd 查看httpd的进程 [rootzabbix-agent ~]# ps -ef | grep httpd root 2407458 1 0 16:…