Не удается выполнить & quot; систему & quot; команда на Android 8 Oreo

В нашем приложении службы Android мы используем JNI для вызова кода C ++ из общей библиотеки. В этом коде мы вызываем «системную» команду C для выполнения другого процесса. Этот код отлично работал на всех ОС 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»);

Я могу выполнить эту команду из оболочки («adb shell»). 7za является совместимым приложением для Android и не имеет доступных для записи и исполняемых сегментов (readelf —program-headers -W libBadFlags.so | grep WE).

Я пытался найти 7za во многих местах на своем рутированном устройстве Android с разными разрешениями, но все еще имел ту же проблему.

0

Решение

Изменения в Android 8.0 говорится, что:

Родные библиотеки

В приложениях, ориентированных на Android 8.0 (уровень API 26), собственные библиотеки больше не загружаются, если они содержат какой-либо сегмент загрузки, который может быть записан и выполнен. Некоторые приложения могут перестать работать из-за этого изменения, если у них есть собственные библиотеки с неправильными сегментами загрузки. Это мера укрепления безопасности.

Для получения дополнительной информации см. Записываемые и исполняемые сегменты.

Изменения компоновщика связаны с уровнем API, на который нацелено приложение. При изменении компоновщика на целевом уровне API приложение не сможет загрузить библиотеку. Если вы ориентируетесь на уровень API ниже уровня API, на котором происходит смена компоновщика, logcat отображает предупреждение.

Я думаю, вам нужно установить android:extractNativeLibs="false" в Mainfest.xml — по крайней мере, так говорится в документации; так что, вероятно, стоит попробовать … и / или сегменты нативной библиотеки должны быть расположены по-другому.

Это довольно теоретический вопрос, если только не имеется какого-либо сообщения об ошибке, которое следует выдавать при включении собственного отладчика.

0

Другие решения

Других решений пока нет …