It's possible to create a provisioning profile for Mac Catalyst that doesn't allow dylibs in the app. It seems a significant number of people run into this problem when publishing their apps, so avoid it by linking Mono and Xamarin statically by default instead. The downside is that build time might increase a little bit. An upside however is that the app size might decrease somewhat. Fixes https://github.com/xamarin/xamarin-macios/issues/14686.
This commit is contained in:
Родитель
18a8b25a0f
Коммит
24895406b2
|
@ -942,11 +942,15 @@
|
||||||
<_AOTInputDirectory>$(_IntermediateNativeLibraryDir)aot-input/</_AOTInputDirectory>
|
<_AOTInputDirectory>$(_IntermediateNativeLibraryDir)aot-input/</_AOTInputDirectory>
|
||||||
<_AOTOutputDirectory>$(_IntermediateNativeLibraryDir)aot-output/</_AOTOutputDirectory>
|
<_AOTOutputDirectory>$(_IntermediateNativeLibraryDir)aot-output/</_AOTOutputDirectory>
|
||||||
|
|
||||||
|
<!-- default to 'static' for Mac Catalyst to work around https://github.com/xamarin/xamarin-macios/issues/14686 -->
|
||||||
|
<_LibMonoLinkMode Condition="'$(_LibMonoLinkMode)' == '' And '$(_PlatformName)' == 'MacCatalyst'">static</_LibMonoLinkMode>
|
||||||
<_LibMonoLinkMode Condition="'$(_LibMonoLinkMode)' == '' And ('$(ComputedPlatform)' != 'iPhone' Or '$(_PlatformName)' == 'macOS')">dylib</_LibMonoLinkMode>
|
<_LibMonoLinkMode Condition="'$(_LibMonoLinkMode)' == '' And ('$(ComputedPlatform)' != 'iPhone' Or '$(_PlatformName)' == 'macOS')">dylib</_LibMonoLinkMode>
|
||||||
<_LibMonoLinkMode Condition="'$(_LibMonoLinkMode)' == ''">static</_LibMonoLinkMode>
|
<_LibMonoLinkMode Condition="'$(_LibMonoLinkMode)' == ''">static</_LibMonoLinkMode>
|
||||||
<_LibMonoExtension Condition="'$(_LibMonoLinkMode)' == 'dylib'">dylib</_LibMonoExtension>
|
<_LibMonoExtension Condition="'$(_LibMonoLinkMode)' == 'dylib'">dylib</_LibMonoExtension>
|
||||||
<_LibMonoExtension Condition="'$(_LibMonoLinkMode)' == 'static'">a</_LibMonoExtension>
|
<_LibMonoExtension Condition="'$(_LibMonoLinkMode)' == 'static'">a</_LibMonoExtension>
|
||||||
|
|
||||||
|
<!-- default to 'static' for Mac Catalyst to work around https://github.com/xamarin/xamarin-macios/issues/14686 -->
|
||||||
|
<_LibXamarinLinkMode Condition="'$(_LibXamarinLinkMode)' == '' And '$(_PlatformName)' == 'MacCatalyst'">static</_LibXamarinLinkMode>
|
||||||
<_LibXamarinLinkMode Condition="'$(_LibXamarinLinkMode)' == '' And '$(ComputedPlatform)' != 'iPhone' And '$(_PlatformName)' != 'macOS'">dylib</_LibXamarinLinkMode>
|
<_LibXamarinLinkMode Condition="'$(_LibXamarinLinkMode)' == '' And '$(ComputedPlatform)' != 'iPhone' And '$(_PlatformName)' != 'macOS'">dylib</_LibXamarinLinkMode>
|
||||||
<_LibXamarinLinkMode Condition="'$(_LibXamarinLinkMode)' == ''">static</_LibXamarinLinkMode>
|
<_LibXamarinLinkMode Condition="'$(_LibXamarinLinkMode)' == ''">static</_LibXamarinLinkMode>
|
||||||
<_LibXamarinExtension Condition="'$(_LibXamarinLinkMode)' == 'dylib'">dylib</_LibXamarinExtension>
|
<_LibXamarinExtension Condition="'$(_LibXamarinLinkMode)' == 'dylib'">dylib</_LibXamarinExtension>
|
||||||
|
|
|
@ -1209,14 +1209,6 @@ namespace Xamarin.Tests {
|
||||||
var signedDylibs = new List<string> {
|
var signedDylibs = new List<string> {
|
||||||
Path.Combine (sharedSupportDir, "app2.app", dylibDir, "lib2.dylib"),
|
Path.Combine (sharedSupportDir, "app2.app", dylibDir, "lib2.dylib"),
|
||||||
};
|
};
|
||||||
if (platform == ApplePlatform.MacCatalyst) {
|
|
||||||
signedDylibs.Add (Path.Combine (dylibDir, "libSystem.IO.Compression.Native.dylib"));
|
|
||||||
signedDylibs.Add (Path.Combine (dylibDir, "libSystem.Native.dylib"));
|
|
||||||
signedDylibs.Add (Path.Combine (dylibDir, "libSystem.Net.Security.Native.dylib"));
|
|
||||||
signedDylibs.Add (Path.Combine (dylibDir, "libSystem.Security.Cryptography.Native.Apple.dylib"));
|
|
||||||
signedDylibs.Add (Path.Combine (dylibDir, "libmonosgen-2.0.dylib"));
|
|
||||||
signedDylibs.Add (Path.Combine (dylibDir, "libxamarin-dotnet-debug.dylib"));
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var dylib in signedDylibs) {
|
foreach (var dylib in signedDylibs) {
|
||||||
var path = Path.Combine (appPath, dylib);
|
var path = Path.Combine (appPath, dylib);
|
||||||
|
|
|
@ -222,7 +222,23 @@ namespace Introspection {
|
||||||
path = null;
|
path = null;
|
||||||
break;
|
break;
|
||||||
case "libSystem.Native":
|
case "libSystem.Native":
|
||||||
path += ".dylib";
|
var staticallyLinked = false;
|
||||||
|
#if __MACCATALYST__
|
||||||
|
// always statically linked
|
||||||
|
staticallyLinked = true;
|
||||||
|
#elif __IOS__ || __TVOS__
|
||||||
|
// statically linked on device
|
||||||
|
staticallyLinked = Runtime.Arch == Arch.DEVICE;
|
||||||
|
#elif __MACOS__
|
||||||
|
// never statically linked (by default)
|
||||||
|
#else
|
||||||
|
#error Unknown platform
|
||||||
|
#endif
|
||||||
|
if (staticallyLinked) {
|
||||||
|
path = null;
|
||||||
|
} else {
|
||||||
|
path += ".dylib";
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case "libc":
|
case "libc":
|
||||||
|
|
|
@ -189,6 +189,9 @@ namespace Xamarin.Linker.Steps {
|
||||||
Where (v => v.EndsWith (".dylib", StringComparison.OrdinalIgnoreCase) || v.EndsWith (".a", StringComparison.OrdinalIgnoreCase)).
|
Where (v => v.EndsWith (".dylib", StringComparison.OrdinalIgnoreCase) || v.EndsWith (".a", StringComparison.OrdinalIgnoreCase)).
|
||||||
Select (v => Path.GetFileNameWithoutExtension (v)).
|
Select (v => Path.GetFileNameWithoutExtension (v)).
|
||||||
Select (v => v.StartsWith ("lib", StringComparison.OrdinalIgnoreCase) ? v.Substring (3) : v).ToHashSet ();
|
Select (v => v.StartsWith ("lib", StringComparison.OrdinalIgnoreCase) ? v.Substring (3) : v).ToHashSet ();
|
||||||
|
#if !__MACOS__
|
||||||
|
monoLibraryVariations.Add ("System.Globalization.Native"); // System.Private.CoreLib has P/Invokes pointing to libSystem.Globalization.Native, but they're actually in libmonosgen-2.0
|
||||||
|
#endif
|
||||||
monoLibraryVariations.UnionWith (monoLibraryVariations.Select (v => "lib" + v).ToArray ());
|
monoLibraryVariations.UnionWith (monoLibraryVariations.Select (v => "lib" + v).ToArray ());
|
||||||
monoLibraryVariations.UnionWith (monoLibraryVariations.Select (v => v + ".dylib").ToArray ());
|
monoLibraryVariations.UnionWith (monoLibraryVariations.Select (v => v + ".dylib").ToArray ());
|
||||||
// If the P/Invoke points to any of those libraries, then we add it as a P/Invoke symbol.
|
// If the P/Invoke points to any of those libraries, then we add it as a P/Invoke symbol.
|
||||||
|
|
Загрузка…
Ссылка в новой задаче