一、鸿蒙存储模型解析
鸿蒙采用沙箱化存储体系,Godot需适配以下三类路径:
- 应用私有目录 :通过
Context
获取沙箱路径(data/、cache/) - 公共媒体目录 :通过
@kit.MediaLibraryKit
访问媒体文件(media/) - 分布式文件路径 :通过
@kit.DistributedFileKit
实现跨设备文件同步
基础权限配置(config.json):
json
"requestPermissions": [
{"name": "ohos.permission.READ_MEDIA"},
{"name": "ohos.permission.DISTRIBUTED_DATASYNC"}
]
二、沙箱目录访问适配
(1)获取应用私有路径
通过UI上下文获取沙箱路径[参考3]:
kotlin
// 获取应用文件目录(对应data/)
const filesDir = this.getUIContext().getHostContext()!.filesDir;
// 获取缓存目录(对应cache/)
const cacheDir = this.getUIContext().getHostContext()!.cacheDir;
(2)文件读写实现
在Native层(C++)实现沙箱文件操作[参考3]:
scss
// 示例:写入沙箱文件
static napi_value WriteFile(napi_env env, napi_callback_info info) {
size_t argc = 2;
napi_value args;
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
// 获取ArkTS传入的沙箱路径
char pathBuf;
size_t pathLength;
napi_get_value_string_utf8(env, args, pathBuf, sizeof(pathBuf), &pathLength);
// 写入文件操作
FILE* fp = fopen(pathBuf, "w");
if (fp) {
fputs("Godot Data", fp);
fclose(fp);
}
return nullptr;
}
三、公共媒体目录访问
使用媒体库接口读写公共目录:
javascript
import { mediaLibrary } from '@kit.MediaLibraryKit';
// 获取媒体库实例
const media = mediaLibrary.getMediaLibrary();
// 创建媒体文件(保存到media/目录)
const fileAsset = await media.createAsset(
mediaLibrary.MediaType.FILE,
"godot_save.data",
mediaLibrary.ResourceType.RESOURCE_TYPE_FILE
);
// 写入文件内容
const fd = await fileAsset.open('w');
await fd.write("Game Save Data");
await fd.close();
四、分布式文件访问
(1)设备发现与连接
ini
import { distributedFile } from '@kit.DistributedFileKit';
// 发现可用设备
const devices = distributedFile.getDevices();
// 建立会话连接
const session = distributedFile.createSession(device.deviceId);
(2)跨设备文件同步
javascript
// 发送文件到远端设备
distributedFile.sendFile(session,
`${filesDir}/save.dat`,
'/remote/save.dat'
);
// 接收远端文件变更通知
distributedFile.on('fileChange', (deviceId, path) => {
Godot.reloadResource(path); // 通知Godot重新加载资源
});
五、Godot引擎适配层
(1)路径转换桥接
javascript
// 将Godot路径转换为鸿蒙沙箱路径
String GodotFile::get_harmony_path(const String& p_path) {
if (p_path.begins_with("user://")) {
return arkts_sandbox_path + p_path.substr(7);
}
return p_path;
}
(2)文件访问权限管理
typescript
// 动态申请文件权限
import { abilityAccessCtrl } from '@kit.AbilityKit';
const permissions: Array<string> = [
'ohos.permission.READ_MEDIA',
'ohos.permission.WRITE_MEDIA'
];
abilityAccessCtrl.requestPermissionsFromUser(
this.context,
permissions
).then((result) => {
Godot.initFileSystem(); // 初始化Godot文件系统
});
六、调试与优化建议
- 路径验证工具:
javascript
console.log(`当前沙箱路径:${filesDir}`);
- 分布式延迟测试:
perl
adb shell dumpsys file_sync | grep "Transfer latency"
- 安全存储建议:
- 敏感数据使用
@kit.SecurityKit
进行加密存储 - 大文件优先存储在cache/目录避免占用持久化空间
最佳实践
- 游戏存档建议使用data/目录实现自动备份
- 临时资源建议使用cache/目录提升IO性能
- 跨设备存档同步需处理网络断开异常场景