Skip to content

Instantly share code, notes, and snippets.

@jonathanpeppers
Last active November 15, 2017 04:43
Show Gist options
  • Save jonathanpeppers/278775524310e1ebf7e1d982fc694a04 to your computer and use it in GitHub Desktop.
Save jonathanpeppers/278775524310e1ebf7e1d982fc694a04 to your computer and use it in GitHub Desktop.
Document showing difference between Link SDK only and Link All w/ default Xamarin.Forms project

File | New Xamarin.Forms project and APK Size

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:

  1. File | New Xamarin.Forms project
  2. 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:

  1. Turned on the Link All setting w/ <AndroidLinkMode>Full</AndroidLinkMode>
  2. Delete bin obj dirs
  3. 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.

So why not just always use LinkAll?

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.

What to do about it?

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.

Other info

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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment