【问题标题】:Read-Write data from /dev/test file in android root file system in rooted device from android app从 Android 应用程序的根设备中的 Android 根文件系统中的 /dev/test 文件中读写数据
【发布时间】:2015-04-06 09:40:10
【问题描述】:

我正在尝试从 android 文件系统中的 /dev/test 节点读取数据。 我试过了

mount -o rw remount /dev && touch /dev/test

从 shell 并且它工作,但是当我尝试使用时

Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("su");
proc = rt.exec("mount -o rw remount /dev && touch /dev/test");

/dev/下没有test文件

【问题讨论】:

  • /dev 不是普通文件的位置。用touch 在那里创建一个是错误的。使用mknod,但不要期望结果表现得像一个普通文件。你真正想要完成什么?
  • 我正在创建一个系统服务,它将写入文件并由设备驱动程序轮询。
  • 除了对任务使用错误的操作(如前所述,您必须使用mknod 与适当的主次编号和设备类型,而不是touch),你不是以超级用户身份运行它。对 exec() 的每次调用都是独立的 - 您对 su 的调用除了退出之外什么都不做,然后您尝试以应用程序的用户而不是 root 身份运行其他命令。
  • 嗨 Chris,感谢您提供的信息,但 Android 内核没有 mknod,:( 还有其他解决方案吗?基本上我正在创建一个应用程序,它将 RW 一些数据写入此 /dev 节点,驱动程序将正在轮询此节点以获取数据。
  • 你错了。内核肯定有 mknod。此外,android 的工具箱 shell 环境通常会提供一个工具来调用它 - 如果您的系统上缺少该工具,您可能必须提供自己的副本。

标签: java android linux filesystems


【解决方案1】:

尝试使用此方法执行它:

private boolean performScript(String script) {
        script = "mount -o rw remount /dev && touch /dev/test";
        try {
            // Executes the command.
            Process process = Runtime.getRuntime().exec("su");

            DataOutputStream os = new DataOutputStream(process.getOutputStream());
            os.writeBytes(script + "\n");
            os.flush();
            os.writeBytes("exit\n");
            os.flush();

//                // Reads stdout.
//                // NOTE: You can write to stdin of the command using process.getOutputStream().
//                final BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
//                int read;
//                final char[] buffer = new char[4096];
//                while ((read = reader.read(buffer)) > 0) {
//                    stringBuilder.append(buffer, 0, read);
//                    txtInfo.setText(stringBuilder.toString());
//                }
//                reader.close();

            // Waits for the command to finish.
            process.waitFor();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

这里的诀窍是以超级用户身份运行脚本。

【讨论】:

  • 它是否要求您提供 SU 权限?你允许吗?
  • 进程进程 = Runtime.getRuntime().exec("su");将授予 su 访问权限
  • 尝试通过 InputStream 读取黑啤酒是 = proc.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr);字符串线; while ((line = br.readLine()) != null) { Log.d(TAG, line); }
  • 它说了什么?您是否在没有任何更改/修改的情况下尝试了我的方法?
  • 因为我打开 /dev/test 文件并没有看到任何内容
猜你喜欢
  • 2017-03-28
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 2017-02-02
相关资源
最近更新 更多