-
Notifications
You must be signed in to change notification settings - Fork 5.3k
Closed
Labels
area-Codegen-AOT-monosize-reductionIssues impacting final app size primary for size sensitive workloadsIssues impacting final app size primary for size sensitive workloads
Milestone
Description
Size regression for MAUI iOS apps
MAUI sample app dotnet new maui -n "MyMauiApp" has regressed in size compared to the .NET7 release:
- Unzipped archive:
.appdirectory size regressed around78.5%from40598192to72477624bytes - Application archive:
.ipafile size regressed around74%from13074853to22755931bytes
when compared against dotnet/runtime main branch at: a92c5bc
Linked issues
Similar size regressions have been reported for the Mono sample app and WASM here:
- [mono][perf] iOS and WASM disk size regressions on 06 Dec 2022 #79285
- [mono][perf] iOS disk size regression on 11 Nov 2022 #78851
for which the following issues have been detected as the ones causing the regressions:
- [mono][aot] Prefer concrete instances instead of gshared ones for met… #78182
- Rewrite Enum and add {ISpanFormattable}.TryFormat #78580
Repro steps
- Check out dotnet/runtime repository into a local dir (<some_repo_dir> will be used as a placeholder further):
git clone https://github.com/dotnet/runtime.git <some_repo_dir>- Build dotnet/runtime for iOS:
cd <some_repo_dir>
./build.sh mono+libs -c Release -os iOS -arch arm64- Download and install
dotnet 7.0.100from https://dotnet.microsoft.com/en-us/download/dotnet/7.0 - Make sure
7.0.100is the one on the path
cd ~/
dotnet --version
7.0.100- Install maui workload
sudo dotnet workload install maui --source https://api.nuget.org/v3/index.json- Create a sample MAUI app
dotnet new maui -n "MyMauiApp"
cd MyMauiApp- Adjust the app project by adding the following
TargetinMyMauiApp.csprojfile:
<Target Name="UpdateRuntimePackAndAOTCompiler"
AfterTargets="ResolveFrameworkReferences"
Condition="'$(UseCurrentMainBranch)' == 'true'" >
<Error Condition="'$(DotnetRuntimeRepo)' == ''" Text="You must specify the location of your dotnet/runtime repository via -p:DotnetRuntimeRepo=<some_repo_dir>"/>
<ItemGroup>
<!-- update runtime pack to local build -->
<ResolvedRuntimePack PackageDirectory="$(DotnetRuntimeRepo)/artifacts/bin/microsoft.netcore.app.runtime.ios-arm64/Release"
Condition="'%(ResolvedRuntimePack.FrameworkName)' == 'Microsoft.NETCore.App'" />
<!-- remove AOT compiler reference for ios-arm64 -->
<MonoAotCrossCompiler Remove="@(MonoAotCrossCompiler)"
Condition="%(RuntimeIdentifier) == 'ios-arm64'" />
<!-- update AOT compiler reference to local build -->
<MonoAotCrossCompiler Include="$(DotnetRuntimeRepo)/artifacts/bin/mono/iOS.arm64.Release/cross/ios-arm64/mono-aot-cross">
<RuntimeIdentifier>ios-arm64</RuntimeIdentifier>
</MonoAotCrossCompiler>
</ItemGroup>
</Target>- Build the project to get sizes for
.NET7release:
dotnet publish -c Release -f net7.0-ios -r ios-arm64 --self-contained -bl -p:_RequireCodeSigning=false- Inspect
.ipafile and.appfolder sizes:
ls -al bin/Release/net7.0-ios/ios-arm64/publish/MyMauiApp.ipa
ls -al bin/Release/net7.0-ios/ios-arm64/MyMauiApp.app- Now build the project against the locally built runtime -
current mainfrom step (2) by:
- passing the project property
DotnetRuntimeRepowith the path to your localdotnet/runtimedirectory (instead of the <some_repo_dir> placeholder) - passing the project property
UseCurrentMainBranchwith the valuetrue
in the following way:
rm -rf bin obj
dotnet publish -c Release -f net7.0-ios -r ios-arm64 --self-contained -bl -p:_RequireCodeSigning=false -p:DotnetRuntimeRepo="<some_repo_dir>" -p:UseCurrentMainBranch=true- Repeat inspection of the file/folder sizes from step (9)
Size on disk comparison (in bytes)
| # | File name | Size net7 release (b) | Size current main (b) | Diff (%) |
|---|---|---|---|---|
| 1 | AboutAssets.txt | 656 | 656 | 0,00% |
| 2 | Assets.car | 50424 | 50424 | 0,00% |
| 3 | Info.plist | 1424 | 1424 | 0,00% |
| 4 | MauiSplash.storyboardc | 160 | 160 | 0,00% |
| 5 | Microsoft.Extensions.Configuration.Abstractions.aotdata.arm64 | 920 | 920 | 0,00% |
| 6 | Microsoft.Extensions.Configuration.Abstractions.dll | 5632 | 5632 | 0,00% |
| 7 | Microsoft.Extensions.Configuration.aotdata.arm64 | 53928 | 179512 | 232,87% |
| 8 | Microsoft.Extensions.Configuration.dll | 9728 | 9728 | 0,00% |
| 9 | Microsoft.Extensions.DependencyInjection.Abstractions.aotdata.arm64 | 7448 | 178512 | 2296,78% |
| 10 | Microsoft.Extensions.DependencyInjection.Abstractions.dll | 13312 | 13312 | 0,00% |
| 11 | Microsoft.Extensions.DependencyInjection.aotdata.arm64 | 123976 | 253960 | 104,85% |
| 12 | Microsoft.Extensions.DependencyInjection.dll | 25600 | 25600 | 0,00% |
| 13 | Microsoft.Extensions.Logging.Abstractions.aotdata.arm64 | 44640 | 184584 | 313,49% |
| 14 | Microsoft.Extensions.Logging.Abstractions.dll | 12800 | 12800 | 0,00% |
| 15 | Microsoft.Extensions.Logging.aotdata.arm64 | 60832 | 188192 | 209,36% |
| 16 | Microsoft.Extensions.Logging.dll | 13312 | 13312 | 0,00% |
| 17 | Microsoft.Extensions.Options.aotdata.arm64 | 10840 | 10832 | -0,07% |
| 18 | Microsoft.Extensions.Options.dll | 12288 | 12288 | 0,00% |
| 19 | Microsoft.Extensions.Primitives.aotdata.arm64 | 3936 | 3920 | -0,41% |
| 20 | Microsoft.Extensions.Primitives.dll | 7168 | 7168 | 0,00% |
| 21 | Microsoft.Maui.Controls.Xaml.aotdata.arm64 | 97120 | 243424 | 150,64% |
| 22 | Microsoft.Maui.Controls.Xaml.dll | 74240 | 74240 | 0,00% |
| 23 | Microsoft.Maui.Controls.aotdata.arm64 | 914264 | 1056064 | 15,51% |
| 24 | Microsoft.Maui.Controls.dll | 1038336 | 1038336 | 0,00% |
| 25 | Microsoft.Maui.Essentials.aotdata.arm64 | 62792 | 197168 | 214,00% |
| 26 | Microsoft.Maui.Essentials.dll | 30720 | 30720 | 0,00% |
| 27 | Microsoft.Maui.Graphics.aotdata.arm64 | 142944 | 308936 | 116,12% |
| 28 | Microsoft.Maui.Graphics.dll | 114688 | 114688 | 0,00% |
| 29 | Microsoft.Maui.aotdata.arm64 | 384816 | 534872 | 38,99% |
| 30 | Microsoft.Maui.dll | 386048 | 386048 | 0,00% |
| 31 | Microsoft.iOS.aotdata.arm64 | 325264 | 461264 | 41,81% |
| 32 | Microsoft.iOS.dll | 497664 | 497664 | 0,00% |
| 33 | MyMauiApp | 29000688 | 56731120 | 95,62% |
| 34 | MyMauiApp.aotdata.arm64 | 9464 | 181840 | 1821,39% |
| 35 | MyMauiApp.dll | 18432 | 18432 | 0,00% |
| 36 | OpenSans-Regular.ttf | 107184 | 107184 | 0,00% |
| 37 | OpenSans-Semibold.ttf | 111068 | 111068 | 0,00% |
| 38 | PkgInfo | 8 | 8 | 0,00% |
| 39 | System.Collections.Concurrent.aotdata.arm64 | 74544 | 207520 | 178,39% |
| 40 | System.Collections.Concurrent.dll | 13312 | 13312 | 0,00% |
| 41 | System.Collections.NonGeneric.aotdata.arm64 | 1312 | 1312 | 0,00% |
| 42 | System.Collections.NonGeneric.dll | 7168 | 7168 | 0,00% |
| 43 | System.Collections.Specialized.aotdata.arm64 | 1392 | 1584 | 13,79% |
| 44 | System.Collections.Specialized.dll | 8192 | 8192 | 0,00% |
| 45 | System.Collections.aotdata.arm64 | 6952 | 7208 | 3,68% |
| 46 | System.Collections.dll | 8192 | 8192 | 0,00% |
| 47 | System.ComponentModel.Primitives.aotdata.arm64 | 2096 | 178344 | 8408,78% |
| 48 | System.ComponentModel.Primitives.dll | 9216 | 9216 | 0,00% |
| 49 | System.ComponentModel.TypeConverter.aotdata.arm64 | 16544 | 192896 | 1065,96% |
| 50 | System.ComponentModel.TypeConverter.dll | 49664 | 49664 | 0,00% |
| 51 | System.ComponentModel.aotdata.arm64 | 856 | 856 | 0,00% |
| 52 | System.ComponentModel.dll | 4608 | 4608 | 0,00% |
| 53 | System.Console.aotdata.arm64 | 46432 | 195856 | 321,81% |
| 54 | System.Console.dll | 8704 | 8704 | 0,00% |
| 55 | System.Diagnostics.TraceSource.aotdata.arm64 | 2416 | 2416 | 0,00% |
| 56 | System.Diagnostics.TraceSource.dll | 8704 | 8704 | 0,00% |
| 57 | System.Drawing.Primitives.aotdata.arm64 | 4856 | 175960 | 3523,56% |
| 58 | System.Drawing.Primitives.dll | 7168 | 7168 | 0,00% |
| 59 | System.Drawing.aotdata.arm64 | 808 | 808 | 0,00% |
| 60 | System.Drawing.dll | 4608 | 4608 | 0,00% |
| 61 | System.Linq.Expressions.aotdata.arm64 | 499248 | 610776 | 22,34% |
| 62 | System.Linq.Expressions.dll | 120320 | 120320 | 0,00% |
| 63 | System.Linq.aotdata.arm64 | 121560 | 275264 | 126,44% |
| 64 | System.Linq.dll | 22528 | 22016 | -2,27% |
| 65 | System.Memory.aotdata.arm64 | 824 | 824 | 0,00% |
| 66 | System.Memory.dll | 4608 | 4096 | -11,11% |
| 67 | System.Net.Http.aotdata.arm64 | 130696 | 311760 | 138,54% |
| 68 | System.Net.Http.dll | 61440 | 61952 | 0,83% |
| 69 | System.Net.Primitives.aotdata.arm64 | 1424 | 1432 | 0,56% |
| 70 | System.Net.Primitives.dll | 8704 | 8704 | 0,00% |
| 71 | System.Net.Requests.aotdata.arm64 | 928 | 928 | 0,00% |
| 72 | System.Net.Requests.dll | 5632 | 5632 | 0,00% |
| 73 | System.Net.Security.aotdata.arm64 | 888 | 888 | 0,00% |
| 74 | System.Net.Security.dll | 4608 | 5120 | 11,11% |
| 75 | System.Net.ServicePoint.aotdata.arm64 | 1960 | 1960 | 0,00% |
| 76 | System.Net.ServicePoint.dll | 5632 | 5632 | 0,00% |
| 77 | System.Numerics.Vectors.aotdata.arm64 | 816 | 816 | 0,00% |
| 78 | System.Numerics.Vectors.dll | 4608 | 4608 | 0,00% |
| 79 | System.ObjectModel.aotdata.arm64 | 10304 | 11112 | 7,84% |
| 80 | System.ObjectModel.dll | 13312 | 13312 | 0,00% |
| 81 | System.Private.CoreLib.aotdata.arm64 | 1318848 | 1777432 | 34,77% |
| 82 | System.Private.CoreLib.dll | 912384 | 934400 | 2,41% |
| 83 | System.Private.Uri.aotdata.arm64 | 81728 | 275344 | 236,90% |
| 84 | System.Private.Uri.dll | 25600 | 26624 | 4,00% |
| 85 | System.Private.Xml.aotdata.arm64 | 229216 | 376784 | 64,38% |
| 86 | System.Private.Xml.dll | 247296 | 248320 | 0,41% |
| 87 | System.Runtime.InteropServices.aotdata.arm64 | 840 | 840 | 0,00% |
| 88 | System.Runtime.InteropServices.dll | 4608 | 4608 | 0,00% |
| 89 | System.Runtime.aotdata.arm64 | 808 | 808 | 0,00% |
| 90 | System.Runtime.dll | 11776 | 11776 | 0,00% |
| 91 | System.Security.Cryptography.aotdata.arm64 | 43000 | 180640 | 320,09% |
| 92 | System.Security.Cryptography.dll | 5632 | 5632 | 0,00% |
| 93 | System.Text.RegularExpressions.aotdata.arm64 | 520208 | 677736 | 30,28% |
| 94 | System.Text.RegularExpressions.dll | 139264 | 139776 | 0,37% |
| 95 | System.Threading.Thread.aotdata.arm64 | 816 | 816 | 0,00% |
| 96 | System.Threading.Thread.dll | 4096 | 4608 | 12,50% |
| 97 | System.Threading.aotdata.arm64 | 824 | 824 | 0,00% |
| 98 | System.Threading.dll | 4608 | 4608 | 0,00% |
| 99 | System.Xml.ReaderWriter.aotdata.arm64 | 816 | 816 | 0,00% |
| 100 | System.Xml.ReaderWriter.dll | 4608 | 4608 | 0,00% |
| 101 | System.aotdata.arm64 | 800 | 800 | 0,00% |
| 102 | System.dll | 4096 | 4096 | 0,00% |
| 103 | _CodeSignature | 96 | 96 | 0,00% |
| 104 | appicon60x60@2x.png | 1361 | 1361 | 0,00% |
| 105 | appicon76x76@2x~ipad.png | 1649 | 1649 | 0,00% |
| 106 | dotnet_bot.png | 19036 | 19036 | 0,00% |
| 107 | dotnet_bot@2x.png | 41155 | 41155 | 0,00% |
| 108 | dotnet_bot@3x.png | 55868 | 55868 | 0,00% |
| 109 | icudt.dat | 1824544 | 1859040 | 1,89% |
| 110 | runtimeconfig.bin | 983 | 983 | 0,00% |
| 111 | splash.png | 1554 | 1554 | 0,00% |
| 112 | splash@2x.png | 2750 | 2750 | 0,00% |
| 113 | splash@3x.png | 4776 | 4776 | 0,00% |
| TOTAL: | 40598192 | 72477624 | 78,52% |
Observation
Biggest differences can be seen in the app binary MyMauiApp (row 33) and .aotdata.arm64 files.
/cc: @SamMonoRT @kotlarmilos @rolfbjarne @jonathanpeppers @vargaz @stephentoub
Metadata
Metadata
Assignees
Labels
area-Codegen-AOT-monosize-reductionIssues impacting final app size primary for size sensitive workloadsIssues impacting final app size primary for size sensitive workloads