2017-01-27 34 views
1

У меня есть приложение NDK, которое может быть расширено через плагины, которые загружаются через dlopen. Это используется для работы в порядке, но он больше не работает с Android N. Как указано в developer documentation, dlopen теперь официально отказались:Как заменить dlopen() в Android Nougat?

Начиная с Android 7.0, система предотвращает приложения от динамической компоновки с библиотеками, не НДК, что может привести к сбою вашего приложения. Это изменение в поведении направлено на создание согласованного опыта приложений в обновлениях платформы и разных устройствах.
...
Все приложения генерируют ошибку времени выполнения при вызове API, который не является общедоступным и временно недоступным. В результате System.loadLibrary и dlopen (3) возвращают NULL и могут привести к сбою вашего приложения.

Я видел, что есть hack, что просто вручную реализует dlopen и dlsym для Android. Это, похоже, работает для Android N, но, конечно, никто не может сказать, как долго это все еще будет работать.

Вот почему я подумываю о том, чтобы изменить мой дизайн плагина на что-то официально поддерживаемое и надежное будущее. Наиболее очевидным выбором будет использование API сервисов Android и просто распространение моих плагинов как отдельных APK, которые реализуют Сервис.

Однако мне не очень нравится эта идея, так как я использую NDK, и я не думаю, что Service API доступен для NDK. Конечно, я мог бы создать Сервис на Java, а затем использовать JNI для его интеграции с моим C-кодом, но это, конечно, не очень изящное решение.

Именно поэтому я хотел бы спросить, что является рекомендуемым способом поддержки плагинов, которые ранее были dlopen - основаны на Android N? Есть ли альтернативный маршрут, или я вынужден использовать Service API сейчас?

+0

«Я видел, что есть хак» - вы уверены? Я думаю, что они поддерживают только 'dlopen' уже загруженную библиотеку, поэтому это не будет работать в вашем случае использования. Повторное выполнение 'dlopen' с нуля, с блэкджеком и символом W^W символом и т. Д., Было бы серьезным делом. – yugr

+0

О, верно, глядя на код, это действительно похоже на трюк для уже загруженных библиотек. Очень жаль :( – Andreas

ответ

2

Для справки; об этом шла речь в Android-NDK группы Google/список рассылки, и оказалось, что 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

Я предполагаю, что формулировка делает технически сделать это звучит, как вы 're now [sic: read not] разрешено ссылаться на ваши собственные библиотеки. Это определенно не так. Политика заключается в том, что вы не можете ссылаться на или закрывать частные системные библиотеки (что-либо в/system/lib, которое не находится в NDK).