From fe683b3ecf752bec0d87770f3bf79a665c9397cd Mon Sep 17 00:00:00 2001 From: Aaron Culliney Date: Tue, 1 Aug 2017 14:55:41 -1000 Subject: [PATCH] Add support for pre-loading app native libraries * Libraries are listed one-per-line in 'ld_preload.txt' file bundled in Android assets * Pre-loading of the libraries occurs before libmonodroid.so is loaded * The primary use case here is to load a native crash manager (e.g., a custom-built libBreakpad.so) which can install its signal handlers (via ELF SHT_INIT_ARRAY ctors) below the Mono signal handlers --- .../Resources/MonoPackageManager.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/Xamarin.Android.Build.Tasks/Resources/MonoPackageManager.java b/src/Xamarin.Android.Build.Tasks/Resources/MonoPackageManager.java index dd4052bd739..5ba4885fc95 100644 --- a/src/Xamarin.Android.Build.Tasks/Resources/MonoPackageManager.java +++ b/src/Xamarin.Android.Build.Tasks/Resources/MonoPackageManager.java @@ -31,6 +31,7 @@ public static void LoadApplication (Context context, ApplicationInfo runtimePack ); context.registerReceiver (new mono.android.app.NotifyTimeZoneChanges (), timezoneChangedFilter); + preloadAppNativeLibraries(context); System.loadLibrary("monodroid"); Locale locale = Locale.getDefault (); String language = locale.getLanguage () + "-" + locale.getCountry (); @@ -79,6 +80,27 @@ static String getNativeLibraryPath (ApplicationInfo ainfo) return ainfo.dataDir + "/lib"; } + static void preloadAppNativeLibraries(Context context) { + InputStream assetStream = null; + try { + assetStream = context.getAssets().open("ld_preload.txt"); + BufferedReader reader = new BufferedReader(new InputStreamReader(assetStream)); + + String lib = null; + while ((lib = reader.readLine()) != null) { + try { + System.loadLibrary(lib); + } catch (Throwable t) { + Log.e("MonoPackageManager", "OOPS : " + t); + } + } + } catch (Throwable t) { + + } finally { + try { assetStream.close(); } catch (Throwable t2) { } + } + } + public static String[] getAssemblies () { return MonoPackageManager_Resources.Assemblies;