Java 为什么android不想让我处理挂载
因此,让我首先说,这让我把头发拔得太厉害了,几乎肯定会是一个愚蠢的简单答案(根据墨菲定律),所以请建议你可能认为我已经做过的任何事情Java 为什么android不想让我处理挂载,java,android,linux,Java,Android,Linux,因此,让我首先说,这让我把头发拔得太厉害了,几乎肯定会是一个愚蠢的简单答案(根据墨菲定律),所以请建议你可能认为我已经做过的任何事情 我使用的是android(准确地说,是Moto G4上的7.1 armv7,它是我唯一的设备,所以我不能在任何其他设备上测试,至少不能在根目录下测试,这是用例所需要的)。我正在编写一个应用程序,长话短说,它需要列出文件系统。为此,我决定使用/proc/mounts 就在我忘记之前,我确实尝试过将selinux设置为“允许”,但没有起作用(尽管我本能地怀疑selin
我使用的是android(准确地说,是Moto G4上的7.1 armv7,它是我唯一的设备,所以我不能在任何其他设备上测试,至少不能在根目录下测试,这是用例所需要的)。我正在编写一个应用程序,长话短说,它需要列出文件系统。为此,我决定使用/proc/mounts 就在我忘记之前,我确实尝试过将selinux设置为“允许”,但没有起作用(尽管我本能地怀疑selinux,但第二次发生一些奇怪的事情可能是因为我的无知) 所以,单线程应用程序,这个静态函数在按下按钮时被调用
private static String getProcMounts() {
try {
/* Forgive my Fr.. um, java */
FileInputStream procmounts = new FileInputStream("/proc/mounts");
BufferedReader mountsreader = new BufferedReader(new InputStreamReader(procmounts));
StringBuilder mountsbuilder = new StringBuilder();
String line;
while ((line = mountsreader.readLine()) != null) {
mountsbuilder.append(line).append('\n');
}
mountsreader.close();
procmounts.close();
System.out.println(mountsbuilder.toString());
return mountsbuilder.toString();
} catch (Exception e) {
Log.e("ERROR", "/proc/mounts could not be read");
return null;
}
}
所以我运行它,它运行得很好。好的,让我以读写方式重新安装/系统
athene:/ $ su
athene:/ # mount -o remount,rw /system
athene:/ # exit
athene:/ $ grep system /proc/mounts
/dev/block/bootdevice/by-name/system /system ext4 rw,seclabel,relatime,data=ordered 0 0
athene:/ $
酷,现在我的应用程序:
...
01-21 18:38:20.713 11037-11037/org.sudoforlunch.mountmanager I/System.out: none /config configfs rw,relatime 0 0
01-21 18:38:20.713 11037-11037/org.sudoforlunch.mountmanager I/System.out: /dev/block/bootdevice/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0
01-21 18:38:20.713 11037-11037/org.sudoforlunch.mountmanager I/System.out: /dev/block/bootdevice/by-name/userdata /data f2fs rw,seclabel,nosuid,nodev,noatime,nodiratime,background_gc=on,user_xattr,inline_xattr,acl,inline_data,active_logs=6 0 0
...
哈,这很奇怪(更新:奇怪的是它显示的是ro而不是rw,尽管文件中包含rw)。一定是某种奇怪的缓存机制什么的。再试一次。失败。尝试重新启动手机,重新安装rw,失败。尝试重新安装,在调试模式下运行,以各种可能的方式清除手机,甚至将手机重置为出厂(er,rom)默认值(包括用户数据),首先重新安装系统分区,然后尝试重新运行应用程序。失败
好吧,这很奇怪。也许这与应用程序如何处理该文件有关。某种保护<代码>设置强制执行0。没有什么。试着使用其中一个终端应用,试着从那里下载文件。哦,当然,在那里效果很好
嘿,我可以这么做。我将生成一个进程并将函数重写为:
private static String getProcMounts() {
try {
Process proc = Runtime.getRuntime().exec(new String[]{"cat", "/proc/mounts"});
BufferedReader mountsreader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
StringBuilder mountsbuilder = new StringBuilder();
String line;
while ((line = mountsreader.readLine()) != null) {
mountsbuilder.append(line).append('\n');
}
mountsreader.close();
System.out.println(mountsbuilder.toString());
return mountsbuilder.toString();
} catch (Exception e) {
Log.e("ERROR", "/proc/mounts could not be read");
return null;
}
}
这肯定会奏效
01-21 18:58:31.303 1149-1149/org.sudoforlunch.mountmanager I/System.out: /dev/block/bootdevice/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0
不,重置仪式,所有这些东西都是为了克图鲁而牺牲的
如果您从发布时间和时间陷阱中猜到,是的,我已经一次又一次地逐字地运行这些代码
请帮助。@commonware在评论中解决了这个问题。我不理解/proc/mounts文件的功能。“至少没有根目录,这是用例所需要的”——那么,好吧。为什么应用程序的输出“奇怪”?你期待什么?@commonware嗯,那说明我根本看不懂。这是不真实的,因为a)当它显示ro时,我可以第一次阅读它,b)Selinux是setenforce0@Seelenvirtuose它显示了装载选项“ro”,而不是该文件中包含的“rw”。无论如何,我会澄清这一点。“its/proc/mounts”--我知道这一点。“这基本上是一个文件系统及其各自装载详细信息的列表”——
/proc/mounts
还有很多内容。此外,/proc/mounts
报告的内容根据尝试读取/proc/mounts
的进程的UID而有所不同。这是Linux的标准行为。“我看不出给我一个旧版本有多重要”--从我的观点来看,它告诉你/system
是ro
适合你的流程。您是否尝试过从您的流程中向/system
中的某个地方进行实际写入?如果是的话,它有效吗?