Android не может выполнить процесс для Android API 29 (Android 10) из / lib / <arch>
В Android API 29 мы не можем выполнить процесс из папки данных из-за нарушения W ^ X. Google, кажется, рекомендует запускать их из папки / lib / [arch]. Однако будут установлены только файлы в формате lib [имя] .so, даже если они включены в APK. Более того, при попытке выполнить файл, который случайно назван в этом формате, он просто возвращает код выхода 1 без исключения при этом. Программа не выполняется.
Этот ответ указывает на нечто подобное, но не упоминает о выполнении файла с "неправильным именем": https://stackoverflow.com/a/62394766/449722
Насколько я могу судить, запуск собственных исполняемых файлов, включенных в APK, теперь невозможен, вместо того, чтобы просто вызывать общие библиотеки при нацеливании на API 29. Правильно ли это или есть что-то конкретное, что нам нужно сделать.
Ответы
Google осознает, что нам нужно нелогично переименовать наши исполняемые файлы, чтобы они соответствовали lib….soшаблону, но, похоже, им это нравится, и в нескольких случаях они выражали решимость не нарушать поддержку запуска собственных исполняемых файлов Runtime.exec(). На самом деле, вероятно, уже слишком поздно ожидать, что они изменят соглашение об именах, которое было принято после Android Cupcake.
При этом есть несколько дополнительных вещей, о которых нужно позаботиться:
Убедитесь, что файлы извлечены (по умолчанию
android:extractNativeLibs="false"при сборке пакета).Убедитесь, что исполняемый файл не имеет неудовлетворенных зависимостей (например, c ++ _ shared ).
Если вашему исполняемому файлу нужны несистемные библиотеки (при загрузке или через
dlopen()), вы должны предоставить ихLD_LIBRARY_PATHв свой каталог lib (в отличие отSystem.loadLibrary()этого, это не решено для вас).Не указывайте жестко путь для
exec(), используйтеgetApplicationInfo().nativeLibraryDir.