如何使用超级用户权限打开/ dev / diag?

时间:2019-03-19 02:59:08

标签: android c android-ndk ndk-build

我正在为One Plus 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;
}

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

失败的是对android应用程序执行相同操作。 我尝试了以下操作:

  • 扎根One Plus 6
  • 致电Runtime.getRuntime().exec("su")中的MainActivity::onCreate
  • 在清单中提供<uses-permission android:name="android.permission.ACCESS_SUPERUSER"/>
  • 然后调用所需的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();

,它工作正常。我仍然想知道如何对共享库执行相同的操作。有帮助吗?

1 个答案:

答案 0 :(得分: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};