From 40a46b6b285cbfcd520639c64f54797469377cd7 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 10 Oct 2024 22:28:02 +0200 Subject: [PATCH] A handful of bugfixes and performance tweaks --- .../Tasks/GeneratePackageManagerJava.cs | 4 ++++ ...pplicationConfigNativeAssemblyGenerator.cs | 19 +++++++++++++++++++ .../Xamarin.Android.Common.targets | 2 ++ src/native/monodroid/monodroid-glue.cc | 2 +- src/native/runtime-base/android-system.cc | 18 +++--------------- src/native/runtime-base/timing-internal.cc | 2 -- src/native/runtime-base/util.cc | 10 ++++------ src/native/runtime-base/util.hh | 2 +- 8 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tasks/GeneratePackageManagerJava.cs b/src/Xamarin.Android.Build.Tasks/Tasks/GeneratePackageManagerJava.cs index 038c167d8df..e5207abdeae 100644 --- a/src/Xamarin.Android.Build.Tasks/Tasks/GeneratePackageManagerJava.cs +++ b/src/Xamarin.Android.Build.Tasks/Tasks/GeneratePackageManagerJava.cs @@ -64,6 +64,9 @@ public class GeneratePackageManagerJava : AndroidTask [Required] public string AndroidBinUtilsDirectory { get; set; } + [Required] + public bool AssemblyStoreEmbeddedInRuntime { get; set; } + [Output] public ITaskItem[] EmbeddedObjectFiles { get; set; } @@ -366,6 +369,7 @@ void AddEnvironment () JniRemappingReplacementMethodIndexEntryCount = jniRemappingNativeCodeInfo == null ? 0 : jniRemappingNativeCodeInfo.ReplacementMethodIndexEntryCount, MarshalMethodsEnabled = EnableMarshalMethods, IgnoreSplitConfigs = ShouldIgnoreSplitConfigs (), + AssemblyStoreEmbeddedInRuntime = UseAssemblyStore && AssemblyStoreEmbeddedInRuntime, }; LLVMIR.LlvmIrModule appConfigModule = appConfigAsmGen.Construct (); diff --git a/src/Xamarin.Android.Build.Tasks/Utilities/ApplicationConfigNativeAssemblyGenerator.cs b/src/Xamarin.Android.Build.Tasks/Utilities/ApplicationConfigNativeAssemblyGenerator.cs index 9a0bc213d6c..45e4ae7a4e0 100644 --- a/src/Xamarin.Android.Build.Tasks/Utilities/ApplicationConfigNativeAssemblyGenerator.cs +++ b/src/Xamarin.Android.Build.Tasks/Utilities/ApplicationConfigNativeAssemblyGenerator.cs @@ -188,6 +188,7 @@ sealed class XamarinAndroidBundledAssembly public List NativeLibraries { get; set; } public bool MarshalMethodsEnabled { get; set; } public bool IgnoreSplitConfigs { get; set; } + public bool AssemblyStoreEmbeddedInRuntime { get; set; } public ApplicationConfigNativeAssemblyGenerator (IDictionary environmentVariables, IDictionary systemProperties, TaskLoggingHelper log) : base (log) @@ -294,6 +295,24 @@ protected override void Construct (LlvmIrModule module) module.Add (bundled_assemblies); AddAssemblyStores (module); + + if (AssemblyStoreEmbeddedInRuntime) { + return; + } + + // Need these to keep ABI compatibility with `libxamarin-app.so` used at the runtime's build time + var embedded_assembly_store_size = new LlvmIrGlobalVariable ( + (ulong)0, + "embedded_assembly_store_size", + LlvmIrVariableOptions.GlobalConstant + ); + module.Add (embedded_assembly_store_size); + + var embedded_assembly_store = new LlvmIrGlobalVariable (typeof (byte[]), "embedded_assembly_store", LlvmIrVariableOptions.GlobalWritable) { + ZeroInitializeArray = true, + ArrayItemCount = 0, + }; + module.Add (embedded_assembly_store); } void AddAssemblyStores (LlvmIrModule module) diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets index 701a04dba69..760019c60ce 100644 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets @@ -328,6 +328,7 @@ Copyright (C) 2011-2012 Xamarin. All rights reserved. <_AndroidUseMarshalMethods Condition=" '$(AndroidIncludeDebugSymbols)' == 'True' ">False <_AndroidUseMarshalMethods Condition=" '$(AndroidIncludeDebugSymbols)' != 'True' ">$(AndroidEnableMarshalMethods) <_AndroidEmbedAssemblyStoreInRuntime Condition=" '$(AndroidUseAssemblyStore)' == 'True' And '$(_AndroidEmbedAssemblyStoreInRuntime)' == '' ">True + <_AndroidEmbedAssemblyStoreInRuntime Condition="'$(_AndroidEmbedAssemblyStoreInRuntime)' == '' ">False @@ -1749,6 +1750,7 @@ because xbuild doesn't support framework reference assemblies. EnableMarshalMethods="$(_AndroidUseMarshalMethods)" CustomBundleConfigFile="$(AndroidBundleConfigurationFile)" AndroidBinUtilsDirectory="$(AndroidBinUtilsDirectory)" + AssemblyStoreEmbeddedInRuntime="$(_AndroidEmbedAssemblyStoreInRuntime)" > diff --git a/src/native/monodroid/monodroid-glue.cc b/src/native/monodroid/monodroid-glue.cc index 385377f10ea..8365383f555 100644 --- a/src/native/monodroid/monodroid-glue.cc +++ b/src/native/monodroid/monodroid-glue.cc @@ -1105,7 +1105,7 @@ MonodroidRuntime::set_profile_options () .append (OUTPUT_ARG) .append (output_path.get (), output_path.length ()); } - if (Util::create_directory (AndroidSystem::override_dirs[0], 0) < 0) { + if (Util::create_directory (AndroidSystem::override_dirs[0], 0777, 000) < 0) { log_warn (LOG_DEFAULT, "Failed to create directory '%s'. %s", AndroidSystem::override_dirs[0], std::strerror (errno)); } diff --git a/src/native/runtime-base/android-system.cc b/src/native/runtime-base/android-system.cc index 2dfdf47d93c..35a37e915b1 100644 --- a/src/native/runtime-base/android-system.cc +++ b/src/native/runtime-base/android-system.cc @@ -262,26 +262,14 @@ AndroidSystem::monodroid_get_system_property_from_overrides ([[maybe_unused]] co return 0; } -// TODO: review this. Do we really have to create the dir in release? void AndroidSystem::create_update_dir (char *override_dir) noexcept { -#if defined (RELEASE) - /* - * Don't create .__override__ on Release builds, because Google requires - * that pre-loaded apps not create world-writable directories. - * - * However, if any logging is enabled (which should _not_ happen with - * pre-loaded apps!), we need the .__override__ directory... - */ - if (log_categories == 0 && monodroid_get_system_property (SharedConstants::DEBUG_MONO_PROFILE_PROPERTY, nullptr) == 0) { - return; - } -#endif // def RELEASE - override_dirs [0] = override_dir; +#if defined(DEBUG) + log_debug (LOG_DEFAULT, "Creating public update directory: `%s`", override_dir); Util::create_public_directory (override_dir); - log_warn (LOG_DEFAULT, "Creating public update directory: `%s`", override_dir); +#endif } bool diff --git a/src/native/runtime-base/timing-internal.cc b/src/native/runtime-base/timing-internal.cc index 5b91c5186f8..dac5c587136 100644 --- a/src/native/runtime-base/timing-internal.cc +++ b/src/native/runtime-base/timing-internal.cc @@ -22,8 +22,6 @@ FastTiming::really_initialize (bool log_immediately) noexcept if (immediate_logging) { return; } - - log_write (LOG_TIMING, LogLevel::Info, "[2/1] To get timing results, send the mono.android.app.DUMP_TIMING_DATA intent to the application"); } void diff --git a/src/native/runtime-base/util.cc b/src/native/runtime-base/util.cc index 892d7fe5343..24c3f801334 100644 --- a/src/native/runtime-base/util.cc +++ b/src/native/runtime-base/util.cc @@ -138,16 +138,14 @@ Util::path_combine (const char *path1, const char *path2) void Util::create_public_directory (const char *dir) { - mode_t m = umask (0); - int ret = mkdir (dir, 0777); + int ret = create_directory (dir, 0777, 0); if (ret < 0) { - log_warn (LOG_DEFAULT, "Failed to create directory '%s'. %s", dir, std::strerror (errno)); + log_warn (LOG_DEFAULT, "Failed to create public directory '%s'. %s", dir, std::strerror (errno)); } - umask (m); } int -Util::create_directory (const char *pathname, mode_t mode) +Util::create_directory (const char *pathname, mode_t mode, mode_t mask) { if (mode <= 0) mode = DEFAULT_DIRECTORY_MODE; @@ -156,7 +154,7 @@ Util::create_directory (const char *pathname, mode_t mode) errno = EINVAL; return -1; } - mode_t oldumask = umask (022); + mode_t oldumask = umask (mask); std::unique_ptr path {strdup_new (pathname)}; int rv, ret = 0; for (char *d = path.get (); d != nullptr && *d; ++d) { diff --git a/src/native/runtime-base/util.hh b/src/native/runtime-base/util.hh index 718e2e87551..f3ed7cd0f9b 100644 --- a/src/native/runtime-base/util.hh +++ b/src/native/runtime-base/util.hh @@ -71,7 +71,7 @@ namespace xamarin::android static char *monodroid_strdup_vprintf (const char *format, va_list vargs); static char* path_combine (const char *path1, const char *path2); static void create_public_directory (const char *dir); - static int create_directory (const char *pathname, mode_t mode); + static int create_directory (const char *pathname, mode_t mode, mode_t mask = 022); static void set_world_accessable (const char *path); static void set_user_executable (const char *path); static bool file_exists (const char *file);