byOpen — это расширенная версия библиотеки dlfunctions, которая обходит ограничения мобильной системы.
авторОткрыть функции
Поддерживает загрузку и использование интерфейса системной библиотеки Android в приложении (даже если карты еще не загружены).
В Android 7 и выше вызов dlopen и System.load ограничен, хотя в настоящее время в Интернете есть такие библиотеки, как Nougat_dlfunctions, которые обходят ограничения на загрузку, находя библиотеку so на картах.
Однако этот метод не будет работать для библиотеки so в приложении, которая не загружена в карты.
ByOpen не только поддерживает ложную загрузку dlopen с карт, но также может принудительно загружать библиотеки, которые еще не были загружены в карты, в обход системных ограничений, чтобы добиться более универсального dlopen.
Примечание. Текущий метод реализации теоретически относительно универсален. По крайней мере, он прошел проверку на моем Android 10, но не был полностью протестирован. Пожалуйста, оцените его самостоятельно.
byОткрыть связанные принципы
Конкретный принцип реализации относительно прост. Он в основном основан на идее и реализации простого метода обхода ограничений Android P на интерфейсах, отличных от SDK.
Хотя основная цель этой статьи — обойти API скрытия, метод, используемый в ней для маскировки под системный вызов, также может использоваться с System.loadLibrary, чтобы заставить систему думать, что сама система вызывает System.loadLibrary.
Это обходит ограничение пространства имен загрузчика классов Android N, загружает любую библиотеку so в system/system/lib в карты, а затем использует поддельный dlopen для dlsym.
byОткрытое использование интерфейса
Соответствующие статические библиотеки и интерфейсы находятся в: dlopen.h.
Соответствующие методы использования точно такие же, как и у встроенного dlopen.
typedef by_char_t const* (*curl_version_t)();
by_pointer_t handle = by_dlopen("libcurl.so", BY_RTLD_LAZY);
если (дескриптор)
{
by_pointer_t addr = by_dlsym(дескриптор, "curl_version");
если (адрес)
{
Curl_version_t Curl_version = (curl_version_t) адрес;
by_print("curl_version: %s", curl_version());
}
by_dlclose (дескриптор);
}