rawfile推入沙箱

有两种方式可以向沙箱推入bundle

1. bundle在rawfile中推入沙箱

 // 将bundlejs下载并保存到沙箱
      let uint8Array = await this.rnAbility.context.resourceManager.getRawFileContent('rawfile/bundle/bp/sandbox.harmony.bundle')
      let rawBuffer = uint8Array.buffer
      let num = rawBuffer.byteLength
      // 获取沙箱路径
      const sandboxDir = this.rnAbility.context.filesDir
      const bundlePath = sandboxDir + '/' + this.bundlePath
      let stream = fs.createStreamSync(bundlePath, 'w')
      stream.writeSync(rawBuffer)
      stream.closeSync()
      this.hasBundle = true

应用沙箱路径和调试进程视角下的真实物理路径

在应用沙箱路径下读写文件,经过映射转换,实际读写的是在hdc进程视角下看到真实物理路径中的应用文件,其对应关系如下表所示。

在这里插入图片描述

开发示例

以应用包com.ohos.example为例,如果是在example的应用沙箱路径“/data/storage/el1/bundle”下读写文件,从上表可知,对应的真实物理路径为“/data/app/el1/bundle/public/”,即“/data/app/el1/bundle/public/com.ohos.example”。

推送命令示例如下:

hdc file send ${待推送文件的本地路径} /data/app/el1/bundle/public/com.ohos.example/

切换应用沙箱视角

在调试过程中,如果权限不对或文件不存在,开发者需要从调试进程视角切换为应用视角,以便直观分析权限及文件目录问题。视角切换命令如下:

hdc shell                         // 进入shell
ps -ef|grep [hapName]             // 通过ps命令找到对应应用的pid
nsenter -t [hapPid] -m /bin/sh    // 通过上一步找到的应用pid进入对应应用的沙箱环境中

执行完成后,即切换到了应用视角,该视角下的目录路径为应用沙箱路径,可以去排查沙箱路径相关问题。


向应用沙箱推送文件时,需通过华为开发者工具(HDC)结合FTP协议操作,但需注意权限限制和正确路径配置。

权限与路径限制

  • 权限问题:从API11开始,HDC命令行默认以shell用户权限运行,无法直接访问应用沙箱目录(如/data/storage/el2/base/),尝试推送文件会报Permission denied错误 。
  • 可写目录:仅/data/local/tmp/目录可被shell用户写入,但应用代码无法读取该目录的文件 。

正确操作方法

  1. 启用网络权限
    在应用的module.json5中添加网络权限:
    "requestPermissions": [
      { "name": "ohos.permission.INTERNET" }
    ]
    
  2. 启动BFTPD服务
    在设备侧执行命令启动沙箱FTP服务:
    hdc shell bftpd -p <端口号>
    

在这里插入图片描述
3. 使用FTP命令推送文件
通过ftpget命令将文件推送到沙箱目录:

hdc shell ftpget -p <端口号> -p guest -u anonymous localhost -s <本地文件路径> <沙箱目标路径>

在这里插入图片描述

注意事项

  • 沙箱文件需通过应用内代码读取,外部直接写入的文件可能无法被访问 。
  • 真机设备需确保应用已正确配置网络权限并启动BFTPD服务 。

欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐