【发布时间】: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")。 - 在清单中提供
<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();
它工作正常。我仍然想知道如何对共享库做同样的事情。有什么帮助吗?
【问题讨论】:
-
exec("su")不会孤军奋战。它不是当前进程的超级用户,但可用于以超级用户身份执行新进程。 -
哦!请提出解决方案。
-
我已经找到了这个,但我想使用共享库而不是运行任何命令。我想直接调用具有root权限的jni函数。
标签: android c android-ndk ndk-build