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



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

我能够使用Android.mk编写的include $(BUILD_EXECUTABLE)ndk-build命令构建可执行文件。我能够运行打开开发/诊断,并将可执行文件放在安卓的/system 文件夹中。

失败的事情是对Android应用程序执行相同的操作。 我尝试了以下方法:

  • 扎根一加6
  • MainActivity::onCreate中呼叫Runtime.getRuntime().exec("su")
  • 在清单中给予<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("exitn");
os.flush();

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

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

具体来说,看看这行代码,它是这样的:

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

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

共享库的源代码可以在这里找到。请注意,我没有编写diag_revealer代码,而是从移动智能应用获取的代码。

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

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

最新更新