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