I did this test with the latest Visual Studio for Mac on the beta channel 7.3 build 764
Xamarin.Android 8.1.0.23
.
Steps:
- File | New Xamarin.Forms project
msbuild HelloForms.csproj /t:SignAndroidPackage /p:Configuration=Release
Results in apk from zipinfo
:
-rw---- 1.0 fat 33280 b- stor 17-Nov-14 13:20 assemblies/Xamarin.Android.Support.Animated.Vector.Drawable.dll
-rw---- 1.0 fat 102912 b- stor 17-Nov-14 13:20 assemblies/Xamarin.Android.Support.Annotations.dll
-rw---- 1.0 fat 2041344 b- stor 17-Nov-14 13:20 assemblies/Xamarin.Android.Support.Compat.dll
-rw---- 1.0 fat 347648 b- stor 17-Nov-14 13:20 assemblies/Xamarin.Android.Support.Core.UI.dll
-rw---- 1.0 fat 148480 b- stor 17-Nov-14 13:20 assemblies/Xamarin.Android.Support.Core.Utils.dll
-rw---- 1.0 fat 392192 b- stor 17-Nov-14 13:20 assemblies/Xamarin.Android.Support.Design.dll
-rw---- 1.0 fat 231936 b- stor 17-Nov-14 13:20 assemblies/Xamarin.Android.Support.Fragment.dll
-rw---- 1.0 fat 477184 b- stor 17-Nov-14 13:20 assemblies/Xamarin.Android.Support.Media.Compat.dll
-rw---- 1.0 fat 60416 b- stor 17-Nov-14 13:20 assemblies/Xamarin.Android.Support.Transition.dll
-rw---- 1.0 fat 36864 b- stor 17-Nov-14 13:20 assemblies/Xamarin.Android.Support.v4.dll
-rw---- 1.0 fat 1061376 b- stor 17-Nov-14 13:20 assemblies/Xamarin.Android.Support.v7.AppCompat.dll
-rw---- 1.0 fat 31232 b- stor 17-Nov-14 13:20 assemblies/Xamarin.Android.Support.v7.CardView.dll
-rw---- 1.0 fat 224768 b- stor 17-Nov-14 13:20 assemblies/Xamarin.Android.Support.v7.MediaRouter.dll
-rw---- 1.0 fat 35840 b- stor 17-Nov-14 13:20 assemblies/Xamarin.Android.Support.v7.Palette.dll
-rw---- 1.0 fat 546816 b- stor 17-Nov-14 13:20 assemblies/Xamarin.Android.Support.v7.RecyclerView.dll
-rw---- 1.0 fat 29184 b- stor 17-Nov-14 13:20 assemblies/Xamarin.Android.Support.Vector.Drawable.dll
So this results in ~5.8MB of assemblies from support libraries! To make matters worse, Xamarin.Android stores assemblies in APKs uncompressed, so this is 5.8MB contributing directly to your APK's size. The full APK size for x86 and armeabi-v7a is 21.4MB.
So I did an experiment to see what could be linked away:
- Turned on the
Link All
setting w/<AndroidLinkMode>Full</AndroidLinkMode>
- Delete
bin
obj
dirs msbuild HelloForms.csproj /t:SignAndroidPackage /p:Configuration=Release
Results from zipinfo
:
-rw---- 1.0 fat 5632 b- stor 17-Nov-14 13:23 assemblies/Xamarin.Android.Support.Animated.Vector.Drawable.dll
-rw---- 1.0 fat 5120 b- stor 17-Nov-14 13:23 assemblies/Xamarin.Android.Support.Annotations.dll
-rw---- 1.0 fat 135168 b- stor 17-Nov-14 13:23 assemblies/Xamarin.Android.Support.Compat.dll
-rw---- 1.0 fat 120320 b- stor 17-Nov-14 13:23 assemblies/Xamarin.Android.Support.Core.UI.dll
-rw---- 1.0 fat 35840 b- stor 17-Nov-14 13:23 assemblies/Xamarin.Android.Support.Core.Utils.dll
-rw---- 1.0 fat 40960 b- stor 17-Nov-14 13:23 assemblies/Xamarin.Android.Support.Design.dll
-rw---- 1.0 fat 163328 b- stor 17-Nov-14 13:23 assemblies/Xamarin.Android.Support.Fragment.dll
-rw---- 1.0 fat 153088 b- stor 17-Nov-14 13:23 assemblies/Xamarin.Android.Support.Media.Compat.dll
-rw---- 1.0 fat 6656 b- stor 17-Nov-14 13:23 assemblies/Xamarin.Android.Support.Transition.dll
-rw---- 1.0 fat 9216 b- stor 17-Nov-14 13:23 assemblies/Xamarin.Android.Support.v4.dll
-rw---- 1.0 fat 429056 b- stor 17-Nov-14 13:23 assemblies/Xamarin.Android.Support.v7.AppCompat.dll
-rw---- 1.0 fat 18432 b- stor 17-Nov-14 13:23 assemblies/Xamarin.Android.Support.v7.CardView.dll
-rw---- 1.0 fat 5120 b- stor 17-Nov-14 13:23 assemblies/Xamarin.Android.Support.v7.MediaRouter.dll
-rw---- 1.0 fat 5120 b- stor 17-Nov-14 13:23 assemblies/Xamarin.Android.Support.v7.Palette.dll
-rw---- 1.0 fat 5632 b- stor 17-Nov-14 13:23 assemblies/Xamarin.Android.Support.v7.RecyclerView.dll
-rw---- 1.0 fat 5120 b- stor 17-Nov-14 13:23 assemblies/Xamarin.Android.Support.Vector.Drawable.dll
This results in 1.1MB of assemblies from support libraries, and the resulting APK works just fine. The apk for x86 and armeabi-v7a is 15.6MB (keep in mind some XF was linked away too).
If we could get the Support Libs on File | New Project
users linked, we could possibly save up to 4.7MB on all Xamarin.Forms Android applications. This could perhaps even be all applications, since almost all apps use the support libraries.
In a existing application, too much breaks. System.Reflection
is a bit too commonplace, even JSON.NET uses it.
The linker is, in fact, something the average Xamarin developer will not fully understand--and probably be afraid of.
My initial thought is to use the LinkerSafe feature on every commonly-used Xamarin.Android component: Support Libraries and Google Play Services to start. If this work pans out, we should think about backporting this to all components, or think about adding it to the VS template for binding projects.
My packages.config
from the VS template:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="monoandroid71" />
<package id="Xam.Plugin.Connectivity" version="3.0.2" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.Animated.Vector.Drawable" version="25.4.0.2" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.Annotations" version="25.4.0.2" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.Compat" version="25.4.0.2" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.Core.UI" version="25.4.0.2" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.Core.Utils" version="25.4.0.2" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.Design" version="25.4.0.2" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.Fragment" version="25.4.0.2" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.Media.Compat" version="25.4.0.2" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.Transition" version="25.4.0.2" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.v4" version="25.4.0.2" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.v7.AppCompat" version="25.4.0.2" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.v7.CardView" version="25.4.0.2" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.v7.MediaRouter" version="25.4.0.2" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.v7.Palette" version="25.4.0.2" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.v7.RecyclerView" version="25.4.0.2" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.Vector.Drawable" version="25.4.0.2" targetFramework="monoandroid71" />
<package id="Xamarin.Forms" version="2.4.0.280" targetFramework="monoandroid71" />
</packages>