byOpen は、モバイル システムの制限を回避する dlfunctions ライブラリの拡張バージョンです。
byオープン機能
アプリでの Android システム ライブラリ インターフェイスの読み込みと使用をサポートします (マップがまだ読み込まれていない場合でも)。
Android 7 以降では、dlopen と System.load の呼び出しが制限されていますが、現在、マップから so ライブラリを見つけて読み込み制限を回避する Nougat_dlfunctions などのライブラリがインターネット上にあります。
ただし、この方法は、マップにロードされていないアプリ内の so ライブラリに対しては機能しません。
ByOpen は、マップからの偽の dlopen ロードをサポートするだけでなく、システム制限を回避してマップにまだロードされていないライブラリを強制的にロードして、より汎用的な dlopen を実現することもできます。
注: 現在の実装方法は理論的には比較的普遍的ですが、少なくとも私の Android 10 ではテストは成功していますが、詳細については十分にテストされていません。使用するかどうかはご自身で評価してください。
byオープン関連原則
具体的な実装原理は比較的単純で、主に非 SDK インターフェイスに対する Android P の制限をバイパスするための単純な方法のアイデアと実装に基づいています。
この記事の主な目的は非表示 API をバイパスすることですが、システム コールとして偽装するために非表示 API で使用されるメソッドを System.loadLibrary とともに使用して、システム自体が System.loadLibrary を呼び出しているとシステムに認識させることもできます。
これにより、Android N のクラスローダー名前空間制限がバイパスされ、system/system/lib 内の so ライブラリがマップにロードされ、dlsym に対して偽の dlopen が使用されます。
byオープンインターフェースの使用法
関連する静的ライブラリとインターフェイスは、dlopen.h にあります。
関連する使用方法はネイティブの dlopen とまったく同じです。
typedef by_char_t const* (*curl_version_t)();
by_pointer_t ハンドル = by_dlopen("libcurl.so", BY_RTLD_LAZY);
if(ハンドル)
{
by_pointer_t addr = by_dlsym(ハンドル, "curl_version");
if (アドレス)
{
curl_version_tcurl_version = (curl_version_t)addr;
by_print("curl_version: %s",curl_version());
}
by_dlclose(ハンドル);
}