我正在尝试运行我自己的本地可执行文件。代码如下所示:
String[] command = {"/data/user/0/org.smowsoft.systeminformation.nativelib.test/files/smoproc"};
ProcessBuilder builder = new ProcessBuilder(command);
Process process = builder.start();我得到了这个错误:
java.io.IOException: Cannot run program "/data/user/0/org.smowsoft.systeminformation.nativelib.test/files/smoproc": error=13, Permission denied
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1050)
at org.smowsoft.systeminformation.ExampleInstrumentedTest.testRun(ExampleInstrumentedTest.java:113)
... 29 trimmed
Caused by: java.io.IOException: error=13, Permission denied
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:133)
at java.lang.ProcessImpl.start(ProcessImpl.java:141)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 31 more我还尝试从本机代码运行可执行文件,如下所示:
char* lArgs[] = {0, 0};
lArgs[0] = new char[8];
strcpy(lArgs[0], "smoproc");
int result = execv("/data/user/0/org.smowsoft.systeminformation.nativelib.test/files/smoproc", lArgs);但是execv()返回-1,errno设置为13 (EACCESS)。
可执行文件的模式设置为0777。
当我从shell运行dmesg时,我可以看到SELinux阻止了执行:
[15194.067480] type=1400 audit(1649841626.956:417509): avc: granted { execute } for comm="roidJUnitRunner" name="smoproc" dev="dm-5" ino=131258 scontext=u:r:untrusted_app:s0:c134,c256,c512,c768 tcontext=u:object_r:app_data_file:s0 tclass=file app=org.smowsoft.systeminformation.nativelib.test
[15194.070245] type=1400 audit(1649841626.956:417510): avc: denied { execute_no_trans } for comm="roidJUnitRunner" path="/data/data/org.smowsoft.systeminformation.nativelib.test/files/smoproc" dev="dm-5" ino=131258 scontext=u:r:untrusted_app:s0:c134,c256,c512,c768 tcontext=u:object_r:app_data_file:s0 tclass=file permissive=0 app=org.smowsoft.systeminformation.nativelib.testAPI级别为30。我在多个设备上试过。这是否意味着无法在API级别30及更高级别上运行本机可执行文件?
发布于 2022-04-18 13:44:15
TL;DR :根据偏好顺序,您可以尝试以下方法:
f 29
长篇版本:
Selinux在您的文件系统上增加了一层安全性,所以如果您想让您的程序使用selinux,那么在某个时候您将不得不直接处理它。
This article on serverfault似乎与您的问题有关。如果您的可执行文件不是位于“标准”位置(您的系统希望在其中查找二进制文件),那么selinux很可能会阻止执行。服务器故障源解释说,可以使用以下selinux命令(如果我正确地读取了您的应用程序路径)来修复这个问题:
chcon -R -t bin_t /data/local/tmp或者将应用程序放置在存储其他二进制文件的地方。
如果上面的命令解决了您的问题,您可以通过运行(仍然适合于服务器错误)永久更新策略:
semanage fcontext -a -t bin_t "/data/local/tmp(/.*)?"
restorecon -r -v /data/local/tmp如果上面的内容不起作用,selinux附带了一个审计工具,它给出了拒绝的原因,称为audit2why。跑步:
audit2why -a通常会为您提供一个解决方案,允许被拒绝的特定事物。不过,尝试实现这些解决方案并不总是一个好主意。
最后,如果不考虑安全性问题,则始终可以将selinux设置为允许在设备上运行(即使是暂时让程序运行):
semanage permissive -a bin_thttps://stackoverflow.com/questions/70741783
复制相似问题