TLDR;问题:
当我使用Runtime.exec()
单独运行原生Android可执行文件时,我可以从我的应用中获取其printf()
输出。但是当我使用Runtime.exec("su -c <native executable>")
时,我无法再获得它的输出。
更好的解释:
所以,我说有一个Android应用程序,它有一个名为“executable”的本机可执行文件。我将“可执行文件”重命名为“libexecutable.so”,以欺骗apk安装程序将文件复制到设备中。
然后,应用程序使用
运行可执行文件String executable = context.getFilesDir().getParent() + "/lib/libexecutable.so";
String me = context.getPackageName();
Process p = Runtime.getRuntime().exec(String.format("%s %s", executable, me));
从我的原生可执行文件中,每当我使用 printf()
时,我都可以使用 p.getInputStream()
在我的应用中获得输出。完美。
但是,这个本机可执行文件需要root权限,所以,我这样运行:
String su = "su -c";
String executable = context.getFilesDir().getParent() + "/lib/libexecutable.so";
String me = context.getPackageName();
Process p = Runtime.getRuntime().exec(String.format("%s %s %s", su, executable, me));
现在,只要我的原生可执行文件使用printf()
,我不再就可以获得p.getInputStream()
的输出。
我查了一下并得到了这个: Java: can't get stdout data from Process unless its manually flushed
在每次fflush(stdout)
调用后直接在我的原生可执行文件中尝试了printf()
,就像建议的页面一样,但它没有用。
答案 0 :(得分:2)
String[] cmd = new String[]{
"su",
"-c",
getFilesDir().getParent() + "/lib/libexecutable.so " + getPackageName()
};
Process p = Runtime.getRuntime().exec(cmd);
//No more permission denied error
哦,没关系。我用它来运行它。有人可以告诉我为什么这是有效的,而不是我最初的尝试?