【问题标题】:How to open /dev/diag with super user permissions?如何以超级用户权限打开 /dev/diag?
【发布时间】:2019-03-19 02:59:08
【问题描述】:

我正在为一加 6 开发应用程序。此应用程序使用共享库 (lib.so) 来执行某些任务。对于任务,它需要先打开 dev/diag,然后通过代码发送一些命令。下面是打开 dev/diag 的代码:

fd = open("/dev/diag", O_RDWR|O_LARGEFILE|O_NONBLOCK);
if (fd < 0) {
    perror("open diag dev");
    return -8002;
}

我可以用Android.mk 编写的include $(BUILD_EXECUTABLE)ndk-build 命令构建一个可执行文件。我可以通过将可执行文件放在 android 的 /system 文件夹中来打开 dev/diag。

失败的事情是对 android 应用程序做同样的事情。 我试过以下:

  • 植根一加 6
  • MainActivity::onCreate 中致电Runtime.getRuntime().exec("su")
  • 在清单中提供&lt;uses-permission android:name="android.permission.ACCESS_SUPERUSER"/&gt;
  • 然后调用需要的jni函数。

请建议我如何在为我打开 dev/diag 的功能上启用 su 访问?

我也尝试过使用 /system 中的 ndk-build 可执行文件来运行可执行命令,例如

供阅读:

    // Run the command
    Process process = Runtime.getRuntime().exec("su -c /system/lib get key");

    BufferedReader bufferedReader = new BufferedReader(
            new InputStreamReader(process.getInputStream()));

    // Grab the results
    StringBuilder log = new StringBuilder();
    String line;
    while ((line = bufferedReader.readLine()) != null) {
        log.append(line).append("\n");
    }

    String allLogs = log.toString();

对于写:

    Process suProcess = Runtime.getRuntime().exec("su");
    DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());

    os.writeBytes("/system/lib set key " + value);
    // Close the terminal
    os.writeBytes("exit\n");

    os.flush();

它工作正常。我仍然想知道如何对共享库做同样的事情。有什么帮助吗?

【问题讨论】:

  • exec("su") 不会孤军奋战。它不是当前进程的超级用户,但可用于以超级用户身份执行进程。
  • 哦!请提出解决方案。
  • 我已经找到了这个,但我想使用共享库而不是运行任何命令。我想直接调用具有root权限的jni函数。

标签: android c android-ndk ndk-build


【解决方案1】:

我能够向/dev/diag 设备发送命令并在 Pixel 3a 手机上激活 QCDM 消息。我在open source Android app Network Survey+ 中做到了这一点。

具体看this line of code,是这样的:

new String[]{"su", "-c", "exec <path_to_shared_library>"};

该行代码构建共享命令,然后由ProcessBuilder 执行。

共享库的源代码可以在here 找到。请注意,我没有编写 diag_revealer 代码,而是取自 Mobile Insight app

我认为您遇到的问题可能是从/system 执行的。相反,请确保共享库位于您应用的私有目录中。我使用的实际代码指向应用程序的文件目录:

return new String[]{"su", "-c", "exec " + diagRevealer + " " + context.getFilesDir() + "/" + context.getResources().getResourceEntryName(R.raw.rrc_filter_diag_edit) + " " + fifoPipeName};

【讨论】:

  • 如何通过 exec 传递 argv? @Crxiom
  • @MRDRAG,我在命令之后传递了它们。在我的示例中,diagRevealer 是命令,我添加了一个空格,然后后面的串联是 argv[1],fifoPipeName 是 argv[2]。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
相关资源
最近更新 更多