Android平台Rust应用写入本地文件遇只读文件系统问题求助
解决Rust Android应用写入文件时的"Read-only file system"错误
问题原因
直接调用std::fs::write("id.txt", ...)时,Rust会尝试写入当前工作目录,而Android应用的当前工作目录属于系统只读路径。Java/Kotlin的openFileOutput方法默认将文件写入应用私有内部存储目录(/data/data/<你的包名>/files/),该目录是应用拥有读写权限的专属路径,因此不会出现权限问题。
解决方案
必须先获取Android应用的私有文件目录路径,再拼接目标文件名进行写入。可以借助ndk或ndk-glue库实现,这两个库是Rust开发Android应用的常用工具。
1. 添加依赖
在Cargo.toml中引入所需依赖:
[dependencies] ndk = "0.8" ndk-glue = "0.8" log = "0.4"
2. 编写文件写入代码
通过ndk-glue获取应用上下文,进而拿到私有文件目录,再完成写入操作:
use ndk_glue::android_context; use std::path::PathBuf; fn write_user_id() { // 获取Android应用上下文 let ctx = android_context(); // 获取私有文件目录路径 let files_dir = ctx.files_dir().expect("无法获取文件目录"); // 拼接目标文件的完整路径 let file_path = PathBuf::from(files_dir).join("id.txt"); match std::fs::write(file_path, "123456") { Ok(_) => { log::warn!("写入ID成功"); } Err(e) => { log::warn!("写入ID失败: {}", e); } } }
原理说明
ctx.files_dir()对应Java中的getFilesDir()方法,返回的路径是应用专属的可写目录,无需额外申请权限。- 只有将文件写入这个目录,才能避开Android的文件系统权限限制,解决只读错误。
验证方式
通过ADB命令确认文件是否写入成功:
# 切换到应用的私有文件目录 adb shell run-as <你的应用包名> cd /data/data/<你的应用包名>/files # 查看文件内容 cat id.txt
内容的提问来源于stack exchange,提问作者Rory L.
相关产品推荐
相关产品推荐

