Как заменить dlopen() в Android Nougat?
У меня есть приложение NDK, которое можно расширить с помощью плагинов, которые загружаются через dlopen
, Раньше это работало нормально, но больше не работает с Android N. Как указано в документации для разработчиков, dlopen
сейчас официально заброшен:
Начиная с Android 7.0, система предотвращает динамическое связывание приложений с библиотеками, отличными от NDK, что может привести к сбою приложения. Это изменение в поведении направлено на создание единообразного взаимодействия приложений с обновлениями платформы и различными устройствами.
...
Все приложения генерируют ошибку времени выполнения, когда они вызывают API, который не является ни общедоступным, ни временно доступным. В результате System.loadLibrary и dlopen(3) возвращают NULL и могут привести к сбою приложения.
Я видел, что есть взлом, который просто реализует вручную dlopen
а также dlsym
для Android. Кажется, это работает для Android N, но, конечно, никто не может сказать, как долго это все еще будет работать.
Вот почему я думаю об изменении дизайна моего плагина на что-то, что официально поддерживается и ориентировано на будущее. Наиболее очевидным выбором было бы использование API Сервиса Android и просто распространять мои плагины как отдельные APK, которые реализуют Сервис.
Однако мне не очень нравится эта идея, так как я использую NDK и не думаю, что Service N API доступен для NDK. Конечно, я мог бы создать Сервис в Java, а затем использовать JNI для интеграции его с моим C-кодом, но это, конечно, не очень элегантное решение.
Вот почему я хотел бы спросить, каков рекомендуемый способ поддержки плагинов, которые были ранее dlopen
на базе Android N? Есть ли альтернативный маршрут или я вынужден использовать Service API сейчас?
1 ответ
Для записи; это обсуждалось в группе / рассылке Google android-ndk, и оказалось, что dlopen
не был виновником оригинального плаката вообще:
https://groups.google.com/d/msg/android-ndk/hhUv1mg3c_A/a5BbRtr-AwAJ
Ой, извините, на самом деле, dlopen() все еще отлично работает на Android 7.0. Я получаю следующее сообщение об ошибке:
Detected problems with app native libraries (please consult log for detail):
foobar.so: text relocations
Формулировка в документации разработчика была уточнена далее:
https://groups.google.com/d/msg/android-ndk/hhUv1mg3c_A/eIKHZZcDBAAJ
Я полагаю, что формулировка технически делает ее звучащей так, будто вы теперь [sic: read not] можете ссылаться на ваши собственные библиотеки. Это определенно не тот случай. Политика заключается в том, что вы не можете ссылаться или закрывать частные системные библиотеки (что-либо в /system/lib, чего нет в NDK).