android - AOSP:在 /data 目录上写入文件
问题描述
我想在“/data”目录上写一个文件。我已经植根了我的设备并设置了 0。但是,我得到了:
W/System.err:java.io.FileNotFoundException:data/MyDoople.txt(权限被拒绝)
这是我的代码(适用于 sdcard):
String filename= "MyDoople.txt";
try
{
File f = new File("data/"+File.separator+filename);
FileOutputStream fOut = new FileOutputStream(f);
OutputStreamWriter myOutWriter = new OutputStreamWriter(
fOut);
myOutWriter.append("Mytest");
myOutWriter.close();
fOut.close();
}
catch(Exception e)
{
e.printStackTrace();
}
我是否必须添加任何政策才能使其发挥作用?
解决方案
因为data目录的权限是rwxrwx--x,user system,group system,而你app的运行用户是普通用户,不是系统用户,所以app无法直接读写/data目录。
可以参考两种方式:
1:如果有平台证书,在AndroidManifest.xml中声明android:sharedUserId="android.uid.system",使用平台证书对app重新签名。这样,运行你的应用的用户就是系统用户,对/data分区有读写权限。
2:在app中获取root权限,然后执行相关命令,参考:
public static boolean RootCommand(String command) {
Process process = null;
DataOutputStream os = null;
try {
process = Runtime.getRuntime().exec("su");
os = new DataOutputStream(process.getOutputStream());
os.writeBytes(command + "\n");
os.writeBytes("exit\n");
os.flush();
process.waitFor();
} catch (Exception e) {
Log.d("*** DEBUG ***", "ROOT REE" + e.getMessage());
return false;
} finally {
try {
if (os != null) {
os.close();
}
process.destroy();
} catch (Exception e) {
}
}
Log.d("*** DEBUG ***", "Root SUC ");
return true;
}
推荐阅读
- java - 为每个会话的一级缓存分配内存
- php - 在此 Codeigniter 3 应用程序中更新用户密码失败的原因是什么?
- tomcat - 关于 org.apache.tomcat.util.net。受体
- ansible - Ansible - 如何将上一个提示的答案包含到下一个提示中
- jetty - 在 Ktor 中使用 Jetty 嵌入式服务器获取客户端证书
- swift - 如何使用 RealityKit 在 Swift 中获取跟踪图像的名称?
- python - 求和函数没有在熊猫中以正确的方式显示总和
- python - 如何解决电子邮件地址之间的问题(如空格)
- c++ - C++ 模块导入链导致奇怪的编译器错误
- php - Laravel 8:未定义的变量:问题