无法在Android 8 Oreo上执行“system”命令

时间:2018-01-07 13:05:45

标签: android c++ android-ndk android-8.0-oreo

在我们的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并且具有不同的权限,但仍然遇到同样的问题。

1 个答案:

答案 0 :(得分:0)

Android 8.0 Changes表示:

  

原生图书馆

     

在针对Android 8.0(API级别26)的应用中,如果本机库包含任何可写和可执行的加载段,则不再加载本机库。如果某些应用程序具有包含不正确的加载段的本机库,则可能因此更改而停止工作。这是一项安全加固措施。

有关详细信息,请参阅Writable and Executable Segments

  

链接器更改与应用程序定位的API级别相关联。如果目标API级别存在链接器更改,则应用程序无法加载库。如果您的API级别低于发生链接器更改的API级别,则logcat会显示警告。

我猜你需要在android:extractNativeLibs="false"中设置Mainfest.xml - 这至少是文档所说的内容;所以这可能值得一试...和/或原生图书馆的片段需要以不同的方式排列。

这是一个非常理论化的问题,除非有可用的某种错误消息,在启用本机调试器时应抛出该消息。