我正在为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.mk
和ndk-build
命令来构建可执行文件。我可以通过将可执行文件放在android的/ system文件夹中来打开dev / diag。
失败的是对android应用程序执行相同操作。 我尝试了以下操作:
Runtime.getRuntime().exec("su")
中的MainActivity::onCreate
。<uses-permission android:name="android.permission.ACCESS_SUPERUSER"/>
。请建议如何在为我打开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();
,它工作正常。我仍然想知道如何对共享库执行相同的操作。有帮助吗?
答案 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};