Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么android不想让我处理挂载_Java_Android_Linux - Fatal编程技术网

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
中的某个地方进行实际写入?如果是的话,它有效吗?