在Harmony应用开发与调试的过程中,经常需要向应用沙箱内推送文件以供应用访问或测试。Harmony提供了两种主要的方法来实现这一需求:通过DevEco Studio直接向应用安装路径放置文件,以及使用hdc工具将文件推送到设备上的应用沙箱路径。本文将重点介绍如何使用hdc工具完成这一操作,并附带代码示例。

HarmonyOS入门之文件系统详解_文件分享

路径映射关系

在开始之前,理解应用沙箱路径与调试进程视角下的真实物理路径之间的映射关系至关重要。以下是部分关键路径的对应关系:

应用沙箱路径

调试进程(hdc)视角下的实际路径

说明

/data/storage/el1/bundle

/data/app/el1/bundle/public/<PACKAGENAME>

应用安装包目录

/data/storage/el1/base

/data/app/el1/<USERID>/base/<PACKAGENAME>

应用el1级别加密数据目录

/data/storage/el2/base

/data/app/el2/<USERID>/base/<PACKAGENAME>

应用el2级别加密数据目录

/data/storage/el1/database

/data/app/el1/<USERID>/database/<PACKAGENAME>

应用el1级别加密数据库目录

/data/storage/el2/database

/data/app/el2/<USERID>/database/<PACKAGENAME>

应用el2级别加密数据库目录

/data/storage/el2/distributedfiles

/mnt/hmdfs/<USERID>/account/merge_view/data/<PACKAGENAME>

应用el2加密级别有帐号分布式数据融合目录

推送文件示例

假设我们有一个应用包名为com.ohos.example,目标是在该应用沙箱路径/data/storage/el1/bundle下推送文件。根据上述映射关系,真实的物理路径为/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]             // 查找应用PID
nsenter -t [hapPid] -m /bin/sh    // 进入应用沙箱环境
文件分享与URI规范

OpenHarmony支持应用间通过URI或文件描述符FD进行文件分享。基于URI的分享更推荐,因为它即使在文件关闭后仍然允许访问。下面是一个使用URI分享文件的示例:

import UIAbility from '@ohos.app.ability.UIAbility';
import fileuri from '@ohos.file.fileuri';
import wantConstant from '@ohos.app.ability.wantConstant';

export default class EntryAbility extends UIAbility {
  onWindowStageCreate(windowStage) {
    const filePath = this.context.filesDir + '/test.txt';
    const uri = fileuri.getUriFromPath(filePath);

    const want = {
      flags: wantConstant.Flags.FLAG_AUTH_WRITE_URI_PERMISSION | wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION,
      action: 'ohos.want.action.sendData',
      uri: uri,
      type: 'text/plain'
    };

    this.context.startAbility(want).then(() => {
      console.info('File shared successfully.');
    }).catch((err) => {
      console.error(`Failed to share file, error: ${err}`);
    });
  }
}
使用其他应用分享的文件

接收应用必须在module.json5中配置相应的动作和URI类型:

{
  "module": {
    "abilities": [
      {
        "skills": [
          {
            "actions": [
              "ohos.want.action.sendData"
            ],
            "uris": [
              {
                "scheme": "file",
                "type": "text/plain"
              }
            ]
          }
        ]
      }
    ]
  }
}

在被分享应用的onCreate()onNewWant()方法中,可以使用以下代码来获取并处理分享的文件:

import fs from '@ohos.file.fs';

function getShareFile(want) {
  const uri = want.uri;
  if (!uri) {
    console.info('Invalid URI');
    return;
  }
  try {
    const file = fs.openSync(uri, fs.OpenMode.READ_WRITE);
    console.info('File opened successfully!');
  } catch (error) {
    console.error(`Failed to open file, error: ${error}`);
  }
}

以上代码和步骤详细地展示了如何使用hdc工具向应用沙箱推送文件,以及如何在OpenHarmony中利用URI进行应用间的文件分享。希望这些信息能帮助你更高效地进行应用开发与调试工作。