一、先分清 3 个视角

视角 可见范围 典型调试手段
应用进程 只能看见自己的沙箱 DevEco 或 hdc shell 进入 /data/storage/el[12]/base/...
系统进程 (init、filemanager、mediaprovider) 全局可见 hdc shell 进入真实物理路径
用户空间(PC/U 盘/网盘) 通过 MTP、USB Mass-Storage 暴露 插在电脑上直接看

二、OpenHarmony 里“路径”

1. 沙箱路径(Sandbox Path)(每个APP自己的路劲,其他APP无法访问)
  • 定义:应用唯一可主动读写的目录,内核挂载时通过 namespace+bind mount 隔离。
  • 根前缀
    • el1(设备级加密):/data/storage/el1/base/<bundleName>/
    • el2(用户级加密):/data/storage/el2/base/<bundleName>/
  • 常用子目录(由 Context 提供):
    filesDir          → /data/storage/el2/base/files
    cacheDir          → /data/storage/el2/base/cache
    tempDir           → /data/storage/el2/base/temp
    databaseDir       → /data/storage/el2/base/databases
    preferencesDir    → /data/storage/el2/base/preferences
    distributedfiles  →/data/storage/ el2/distributedfiles(分布式融合目录)
    
  • 特点
    • 不需要任何权限;
    • 卸载 App 时自动整棵删除;
    • 若备份恢复,el2 目录会跟随用户账号走,el1 不跟。
2. 物理路径(Physical Path)(不提供给APP访问)
  • 定义:系统全局的真实 inode 路径,供 shell、filemanagerd、init 使用。
  • 与沙箱对照(以包名 com.example.demo 为例):
    沙箱: /data/storage/el2/base/com.example.demo/files/a.txt
    物理: /data/app/el2/100/base/com.example.demo/files/a.txt
    比如/system/app/,/vendor等这些开发板的路劲,通常系统会不提供直接访问物理路劲的权限
    
    数字 100 是用户号(UserId),多用户场景下递增。
  • 注意
    • 应用代码若硬编码物理路径,在 SELinux 策略下会被 deny
    • 只有 filemanagement 系统服务具有 rwx 能力。
3.公共目录路劲(比如文件管理器、相册这些所有应用都可以申请权限来访问的路劲)
用户文件路径(公共目录)特点:用户可见(如相册、文档),需权限声明。

媒体文件访问 接口:使用@kit.MediaLibraryKit模块。 示例(访问相册):

 import { photoAccessHelper } from '@kit.MediaLibraryKit';
 const photoPicker = new photoAccessHelper.PhotoViewPicker();
 photoPicker.select(photoSelectOptions); // 需声明ohos.permission.READ_MEDIA权限

文档文件访问 接口:通过@kit.FileManagementKit选择用户文件。
权限:需在module.json5中声明ohos.permission.WRITE_MEDIA。

4. File URI(file://)
  • 官方格式
    file://<bundleName>/<path-relative-to-sandbox>
    
    例:file://com.example.demo/files/music.mp3
  • 使用场景
    • 同一设备内 Ability 之间通过 startAbility 分享文件;
    • 配合 want.flags.FLAG_AUTH_READ_URI_PERMISSION 临时授权。
  • 限制
    • 不接受绝对物理路径;
    • 跨设备无效。
5. HTTP/HTTPS URI
  • 网络路径:标准 RFC 3986,无特殊改造。
  • 组件
    • @ohos.net.http 模块直接支持;
    • 若下载到本地,需自己写入沙箱后再做后续业务。
  • 权限:需要 ohos.permission.INTERNET
6. DataShare URI(datashare://)
  • 来源:由系统 FilePicker、MediaLibrary 返回,例如:
    datashare://media/external/audio/media/45
    
  • 实质:底层仍映射到 MediaProvider 的 MediaStore 表,通过 openFile 拿到 fd。
  • 优点
    • 用户授权一次后,应用即可获得只读/读写 fd;
    • 可播放 U 盘、OTG 文件,无需自己解析 /storage/External/xxx
  • 用法
    avPlayer.urlSrc = 'datashare://media/...';   // 支持
    
7. RawFile 路径(resource/rawfile)
  • 定义:HAP 包内随包携带的只读资源,编译时打包到HAP中,不可修改。
  • 路径写法:无真实路径,通过 $rawfile('intro.mp3') 访问。
  • 编译期打包到 resources.index,运行时由 ResourceManager 解析成 fd 返回。
8. 分布式路径(Distributed File)
  • 根目录/data/storage/el2/distributedfiles
  • 机制:基于软总线+DTP 协议,把多设备目录聚合为同一命名空间。
  • 表现
    • 在 A 设备写入 el2/distributedfiles/a.txt
    • 同一账号的 B 设备可在相同路径看到该文件(网络可达时自动同步)。
  • 限制
    • 仅 el2 加密等级;
    • 需要 ohos.permission.DISTRIBUTED_DATASYNC
9. U 盘/OTG 路径(External Storage)
  • 挂载点(OpenHarmony 5.1 代码位于 foundation/filemanagement/storage_service):
    /mnt/media_rw/5466-EB23          // vfat 卷 UUID
    /storage/External/5466-EB23      // 应用可见的 FUSE 视图
    
  • 访问方式
    • 系统文件管理器:直接通过 filemanager 进程可读写;
    • 第三方应用不能直接用 /storage/External/... 路径读写;
    • 正确姿势:通过 FilePicker 拿到 datashare:// URI,再 fs.open 获得 fd。
10. App-Linking URI(https://)
  • 功能:OpenHarmony 5.1 引入,对标 Android App Linking。
  • 格式:普通 HTTPS URL,例如:
    https://www.example.com/news/123
    
  • 流程
    1. 开发者把 assetlinks.json 放到域名 .well-known
    2. 系统校验通过后,自动把链接分发到对应 Ability;
    3. 未安装应用时回落浏览器。
  • 区别于 DeepLink:增加域名所有权校验,防劫持。

三、一张表速查

类型 典型前缀 应用能否直接读写 跨设备 备注
沙箱路径 /data/storage/el2/base/... ✅ 自由读写 卸载即删
物理路径 /data/app/el2/100/... ❌ 权限拒绝 仅系统可见
file URI file://<bundle>/files/... ✅ 通过 fd 用于分享
http URI http:///https:// ✅ 只读网络 需 INTERNET 权限
DataShare URI datashare://media/... ✅ 只读/写 由 FilePicker 返回
rawfile $rawfile('xxx') ✅ 只读 打包进 HAP
分布式路径 /data/storage/el2/distributedfiles ✅ 读写 需分布式权限
U 盘路径 /storage/External/xxxx ❌ 应用不可直接访问 用 FilePicker 中转
App-Linking https:// ✅(跳转) 需域名验证

四、开发提示

  1. 永远把业务文件放进沙箱,再视需求通过 file://datashare:// 分享。
  2. 播放 U 盘音视频不要拼路径,统一用 FilePickerdatashare:// URI,然后 urlSrc=uri
  3. 需要跨设备同步时,直接把文件写到 distributedfiles 目录即可,系统负责差分同步。
  4. 发布开源发行版时,SELinux 策略会收紧,任何硬编码物理路径都有高概率被否决
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐