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

devtools/2024/9/24 14:22:38/

文件目录

  • 应用沙箱目录
    • 沙箱目录的分类
    • 应用文件目录结构
    • 应用文件路径详细说明
    • 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;//获取ApplicationContextlet 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/cacheI     file path tempDir = /data/storage/el2/base/tempI     file path filesDir = /data/storage/el2/base/filesI     file path databaseDir = /data/storage/el2/databaseI     file path bundleCodeDir = /data/storage/el1/bundleI     file path distributedFilesDir = /data/storage/el2/distributedfilesI     file path preferencesDir = /data/storage/el2/base/preferencesI     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/cacheI     file path tempDir = /data/storage/el2/base/haps/entry/tempI     file path filesDir = /data/storage/el2/base/haps/entry/filesI     file path databaseDir = /data/storage/el2/database/entryI     file path bundleCodeDir = /data/storage/el1/bundleI     file path distributedFilesDir = /data/storage/el2/distributedfilesI     file path preferencesDir = /data/storage/el2/base/haps/entry/preferencesI     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/cacheI     file path tempDir = /data/storage/el1/base/haps/entry/tempI     file path filesDir = /data/storage/el1/base/haps/entry/filesI     file path databaseDir = /data/storage/el1/database/entryI     file path bundleCodeDir = /data/storage/el1/bundleI     file path distributedFilesDir = /data/storage/el1/distributedfilesI     file path preferencesDir = /data/storage/el1/base/haps/entry/preferencesI     file path cloudFileDir = /data/storage/el2/cloud

AreaMode简介

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

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

参考资料

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


http://www.ppmy.cn/devtools/96770.html

相关文章

桥接模式:打破设计僵局,释放系统潜能

桥接模式(Bridge Pattern)是一种结构型设计模式,它通过将抽象部分与实现部分分离,使得两者可以独立地变化。这种模式主要用于处理一个类存在两个独立变化的维度,避免由于多个继承层次带来的复杂度和冗余代码。 一、桥…

杭州网络安全等保测评——数据守护者的金盾牌️

在数字化转型疾驰的杭州,网络疆域的每一次拓展都伴随着安全风险的增长。如何在创新与安全之间找到黄金平衡点?《杭州等保测评:守护网络安全的坚实屏障》一文,深入探索这座智慧城市如何依托等保测评体系,构建起一道道安…

win的netassist TCP测试工具和Linux的nc工具使用

写在前面 有时工作中我们编写一些tcp相关的程序,而netassist就是这样一款辅助我们进行TCP功能测试的工具,你可以从这里下载。 1:netassist使用 我们需要一个server程序,可以参考这篇文章,启动server后,就…

XSS DOM型靶场复现(1-8关)

文章目录 XSS DOM型靶场复现(1-8关)登录靶场1.Ma Spaghet!要求代码Lets go! 2.Jefff要求代码Lets go!方法1方法2 3.Ugandan Kunckles要求代码Lets go! 4.Ricardo Milos要求代码Lets go! 5.Ah Thats Hawt要求代码Lets go! 6.Ligma要…

【HarmonyOS NEXT星河版开发学习】综合测试案例-各平台评论部分

目录 前言 功能展示 整体页面布局 最新和最热 写评论 点赞功能 界面构建 初始数据的准备 列表项部分的渲染 底部区域 index部分 知识点概述 List组件 List组件简介 ListItem组件详解 ListItemGroup组件介绍 ForEach循环渲染 列表分割线设置 列表排列方向设…

杂集:(TreeSet去重,各类转型,静态导包,可变参数,加强for循环)

Listj集合:有序,可重复,有索引 有序:这里的有序,是指按照元素插入的顺序排序 Set集合:无序,不可重复,无索引 无序:这里的无序是指Set元素不会按照添加的顺序排列&…

联盟推广计划:释放SaaS企业增长潜力

在SaaS行业,用户增长是企业成功的关键。本文深入探讨联盟推广计划,分析其核心特点和优势,以及如何实施这一策略以实现用户增长和品牌扩展。随着SaaS市场的不断成熟,企业越来越需要创新的营销策略来突破增长瓶颈。PartnerShare联盟…

一台佳能G3811彩色喷墨打印机打印没颜色报5200的维修记录

一台佳能G3811彩色喷墨打印机,用户送修,称打印没有颜色,加电开机连电脑安驱动打印测试,确实没有颜色,于是清洗喷头结果打印机那个显示屏上 ,上来就报错P08,电脑提示5200; 话不多说,开始维修,仅记录当时的维修方法及步骤,其它未列出。。。 维修方法: 1、进维…