Как заменить 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).

Другие вопросы по тегам