Xamarin.Android Linker Tricks Part 1 - Bitdiffer13 Apr 2017
The linker used in Xamarin.Android applications has historically been a painpoint for developers.
This is mainly because as developers, we only use a small portion of the assemblies we consume. For the rest of those assemblies, we consider using a
linker mechanism so we reap the benefits of having a smaller assembly at the end of the day.
To give a real world example of what the
linker does, I’ve created three
.apk files with the different
- Sdk Assemblies Only
- Sdk and User Assemblies
04/13/2017 11:15 AM 52,160,463 LinkerSample.None.apk
04/13/2017 11:12 AM 21,995,031 LinkerSample.SDK.apk
04/13/2017 11:16 AM 10,130,214 LinkerSample.UserAndSDK.apk
Note: This project includes a reference to the
Xamarin.Android.Support.Design NuGet to demonstrate something more than “Hello World”
As you can see, we see the size of
10mb(User and SDK). What this means is that in a perfect world, we would want to use
Sdk and User Assemblies so we can keep our
.apk size down. However using that setting is considered the most aggressive linker setting and it can strip away things that you need to use in your application. Finding out exactly what it strips out is a bit difficult and we should fallback to other tooling.
bitdiffer is a tool that helps compare assembly files. It is extremely useful in the sense of a practical GUI/CLI that lets us see the difference between assemblies. You can download it here:
One of the most useful things bitdiffer does is allows you to add not only 2 assemblies, but a full list for comparison. This is extremely useful for us as developers to see what exactly each
linker option does to our assembly.
Consider the following example with the three
.apk we created earlier comparing against the
Mono.Android.dll assembly. They are ordered
Sdk Assemblies Only,
Sdk and User Assemblies in the tabs:
You can notice off a quick glance that we had quite a difference in
Members Changed or
Removed between the linker setting
Sdk Assemblies Only ->
Sdk and User Assemblies.
Now that’s not the only cool feature of this tool, you can also dive down into a specific class to see the
diff between your assemblies:
And finally we can dig into what the difference is between members in our class:
Although this is only part 1 of various linker tricks I use to diagnose a problem, this is one of the more powerful ways to approach any linker issues in your project to understand the problem.
If you enjoyed this post, please consider subscribing to my upcoming book’s email list:
You can signup at the following link: Programming Xamarin.Android Email List