在我们的Android服务应用程序中,我们使用JNI来调用共享库的C ++代码。在此代码中,我们调用C“system”命令来执行antoher进程。此代码在所有Android操作系统上都运行良好,现在在Android 8 Oreo上失败了。 执行系统命令是否有任何新的安全性或其他限制?
更多数据:
此“c”代码已从我的共享库中成功执行:
int error = system(“ls -l / sdcard / tmp>> /sdcard/tmp/log.txt”);
文件log.txt按预期填充,错误= 0;
但是此命令始终因意外错误代码(40704)而失败:
int error = system(“/ system / bin / 7za t /sdcard/tmp/Camera.7z>> /sdcard/tmp/log.txt”);
我可以从shell(“adb shell”)执行此命令。 7za是一个兼容的Android应用程序,它没有可写和可执行的段(readelf --program-headers -W libBadFlags.so | grep WE)。
我尝试在我的root设备上的许多地方找到7za并且具有不同的权限,但仍然遇到同样的问题。
答案 0 :(得分:0)
原生图书馆
在针对Android 8.0(API级别26)的应用中,如果本机库包含任何可写和可执行的加载段,则不再加载本机库。如果某些应用程序具有包含不正确的加载段的本机库,则可能因此更改而停止工作。这是一项安全加固措施。
有关详细信息,请参阅Writable and Executable Segments。
链接器更改与应用程序定位的API级别相关联。如果目标API级别存在链接器更改,则应用程序无法加载库。如果您的API级别低于发生链接器更改的API级别,则logcat会显示警告。
我猜你需要在android:extractNativeLibs="false"
中设置Mainfest.xml
- 这至少是文档所说的内容;所以这可能值得一试...和/或原生图书馆的片段需要以不同的方式排列。
这是一个非常理论化的问题,除非有可用的某种错误消息,在启用本机调试器时应抛出该消息。