From 46df03f5da3aa8f279323c942c58174df7d0d4d1 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Tue, 12 Mar 2024 16:25:59 -0500 Subject: [PATCH] [One .NET] "greenfield" projects opt into trimming This is WIP depends on #8778. As we have solved all trimming warnings in the Android workload, we can now go "all in" on trimming. Early in .NET 6 (maybe even 5?) we "hid" many trimming warnings as we did not yet plan to solve them: true These warnings were not *actionable* at the time for customers, as many warnings were in `Mono.Android.dll`, `Java.Interop.dll`, etc. Going forward, let's stop suppressing these warnings if `TrimMode=full`. We can also enable trimming for new projects: * `dotnet new android` * `dotnet new android-wear` These will have the `TrimMode` property set to `Full` by default: full We wouldn't want to do this for existing projects *yet*, as they might have existing code, NuGet packages, etc. where trimming warnings might be present. We can also improve the templates for Android class libraries: * `dotnet new androidlib` * `dotnet new android-bindinglib` true This way, new class libraries will be "trimmable" by default and be able to react to trimming warnings. We can also use `TrimMode=full` in many of our existing tests: * MSBuild tests that assert 0 warnings can use `TrimMode=full`. * On-device tests can import `trim-analyzers.props` and use `TrimMode=full`. --- .../android-bindinglib/AndroidBinding1.csproj | 5 +++++ .../android-wear/AndroidApp1.csproj | 7 +++++++ src/Microsoft.Android.Templates/android/AndroidApp1.csproj | 7 +++++++ .../androidlib/AndroidLib1.csproj | 5 +++++ .../Microsoft.Android.Sdk.DefaultProperties.targets | 3 ++- .../Tests/Xamarin.Android.Build.Tests/BuildTest2.cs | 4 ++++ .../Tests/Xamarin.ProjectTools/Android/AndroidLinkMode.cs | 6 ++++++ .../Tests/Xamarin.ProjectTools/Android/KnownProperties.cs | 3 ++- .../Android/XamarinAndroidApplicationProject.cs | 5 +++++ .../Xamarin.Android.JcwGen-Tests.csproj | 5 +++++ .../Mono.Android.NET-Tests.csproj | 3 ++- 11 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.Android.Templates/android-bindinglib/AndroidBinding1.csproj b/src/Microsoft.Android.Templates/android-bindinglib/AndroidBinding1.csproj index 5f78e42ab48..56c74d9fc01 100644 --- a/src/Microsoft.Android.Templates/android-bindinglib/AndroidBinding1.csproj +++ b/src/Microsoft.Android.Templates/android-bindinglib/AndroidBinding1.csproj @@ -5,6 +5,11 @@ AndroidBinding1 enable enable + + true + + full + diff --git a/src/Microsoft.Android.Templates/android/AndroidApp1.csproj b/src/Microsoft.Android.Templates/android/AndroidApp1.csproj index 5a71d2ab599..c539a1f4c45 100644 --- a/src/Microsoft.Android.Templates/android/AndroidApp1.csproj +++ b/src/Microsoft.Android.Templates/android/AndroidApp1.csproj @@ -10,4 +10,11 @@ 1 1.0 + + + full + \ No newline at end of file diff --git a/src/Microsoft.Android.Templates/androidlib/AndroidLib1.csproj b/src/Microsoft.Android.Templates/androidlib/AndroidLib1.csproj index 3c076d5fd9d..d50d9b99196 100644 --- a/src/Microsoft.Android.Templates/androidlib/AndroidLib1.csproj +++ b/src/Microsoft.Android.Templates/androidlib/AndroidLib1.csproj @@ -5,5 +5,10 @@ AndroidLib1 enable enable + + true \ No newline at end of file diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets index 8504ad98ec8..5d4506284cd 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.DefaultProperties.targets @@ -74,8 +74,9 @@ SdkOnly None - link + full partial + false true android-arm;android-arm64;android-x86;android-x64 diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs index e3050b3fb88..7b57d02f218 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs @@ -232,6 +232,10 @@ public void BuildHasNoWarnings (bool isRelease, bool xamarinForms, bool multidex new XamarinFormsAndroidApplicationProject () : new XamarinAndroidApplicationProject (); proj.IsRelease = isRelease; + // Enable full trimming + if (!xamarinForms && isRelease) { + proj.TrimModeRelease = TrimMode.Full; + } if (multidex) { proj.SetProperty ("AndroidEnableMultiDex", "True"); } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/AndroidLinkMode.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/AndroidLinkMode.cs index eb3204389df..40dcd0946da 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/AndroidLinkMode.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/AndroidLinkMode.cs @@ -9,4 +9,10 @@ public enum AndroidLinkMode SdkOnly, Full, } + + public enum TrimMode + { + Partial, + Full, + } } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/KnownProperties.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/KnownProperties.cs index 9473811e49e..fa20a560acd 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/KnownProperties.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/KnownProperties.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace Xamarin.ProjectTools { @@ -18,6 +18,7 @@ public static class KnownProperties public const string RuntimeIdentifiers = "RuntimeIdentifiers"; public const string RunAOTCompilation = "RunAOTCompilation"; public const string PublishTrimmed = "PublishTrimmed"; + public const string TrimMode = "TrimMode"; public const string SupportedOSPlatformVersion = "SupportedOSPlatformVersion"; public const string Deterministic = "Deterministic"; diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidApplicationProject.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidApplicationProject.cs index 67b77daceee..5b54d4b2201 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidApplicationProject.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidApplicationProject.cs @@ -155,6 +155,11 @@ public AndroidLinkMode AndroidLinkModeRelease { set { SetProperty (ReleaseProperties, KnownProperties.AndroidLinkMode, value.ToString ()); } } + public TrimMode TrimModeRelease { + get => Enum.TryParse (GetProperty (ReleaseProperties, KnownProperties.TrimMode), out TrimMode trimMode) ? trimMode : TrimMode.Partial; + set => SetProperty (ReleaseProperties, KnownProperties.TrimMode, value.ToString ().ToLowerInvariant ()); + } + public bool EnableMarshalMethods { get { return string.Equals (GetProperty (KnownProperties.AndroidEnableMarshalMethods), "True", StringComparison.OrdinalIgnoreCase); } set { SetProperty (KnownProperties.AndroidEnableMarshalMethods, value.ToString ()); } diff --git a/tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/Xamarin.Android.JcwGen-Tests.csproj b/tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/Xamarin.Android.JcwGen-Tests.csproj index da9c1c1f6e1..0a108ff55c8 100644 --- a/tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/Xamarin.Android.JcwGen-Tests.csproj +++ b/tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/Xamarin.Android.JcwGen-Tests.csproj @@ -13,11 +13,16 @@ + ..\..\..\bin\Test$(Configuration) + + full + + diff --git a/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj b/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj index f21c94de80f..53a609a6b06 100644 --- a/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj +++ b/tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj @@ -2,6 +2,7 @@ + $(DotNetAndroidTargetFramework) @@ -19,7 +20,6 @@ false <_MonoAndroidTestPackage>Mono.Android.NET_Tests -$(TestsFlavor)NET6 - IL2037 true