Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Jun 20, 2023. It is now read-only.

Setup [assembly: LinkerSafe] for binding projects #77

Closed
jonathanpeppers wants to merge 1 commit into xamarin:27.x from jonathanpeppers:linker-safe

Conversation

@jonathanpeppers
Copy link
Member

@jonathanpeppers jonathanpeppers commented Nov 16, 2017
edited
Loading

Support Libraries Version (eg: 23.3.0):

26.1.0.1

Does this change any of the generated binding API's?

Nope

Describe your contribution

I discovered there was some file size that could be spared from the
support library assemblies in release APKs by using the Link all assemblies option. Since most Xamarin users will have the Link SDK only option set, we can save most Xamarin developers some APK size by
setting up the [assembly: LinkerSafe] attribute in the support
libraries.

To get an idea on what this saves, I tested the default Xamarin.Forms
template in VS for Mac. I then upgraded to TargetFrameworkVersion
8.0, API 26, Xamarin.Forms 2.5.0, and 26.1.0.1 support libraries.

Before:

  • Support libs: 5231104
  • APK: 20948533

After [assembly: LinkerSafe]:

  • Support libs: 2357248
  • APK: 17312534

It appears this change saves ~3.6MB in APK file size in release mode
for the default Xamarin.Forms template. The app still seemed to work fine,
it appears we can just get this file size for free!

Further details

Here is the results of zipinfo on the before APK:

-rw---- 1.0 fat 17920 b- stor 17-Nov-15 08:44 assemblies/Xamarin.Android.Arch.Core.Common.dll
-rw---- 1.0 fat 19456 b- stor 17-Nov-15 08:44 assemblies/Xamarin.Android.Arch.Lifecycle.Common.dll
-rw---- 1.0 fat 13824 b- stor 17-Nov-15 08:44 assemblies/Xamarin.Android.Arch.Lifecycle.Runtime.dll
-rw---- 1.0 fat 33280 b- stor 17-Nov-15 08:44 assemblies/Xamarin.Android.Support.Animated.Vector.Drawable.dll
-rw---- 1.0 fat 110080 b- stor 17-Nov-15 08:44 assemblies/Xamarin.Android.Support.Annotations.dll
-rw---- 1.0 fat 1408512 b- stor 17-Nov-15 08:44 assemblies/Xamarin.Android.Support.Compat.dll
-rw---- 1.0 fat 349696 b- stor 17-Nov-15 08:44 assemblies/Xamarin.Android.Support.Core.UI.dll
-rw---- 1.0 fat 134144 b- stor 17-Nov-15 08:44 assemblies/Xamarin.Android.Support.Core.Utils.dll
-rw---- 1.0 fat 403968 b- stor 17-Nov-15 08:44 assemblies/Xamarin.Android.Support.Design.dll
-rw---- 1.0 fat 237568 b- stor 17-Nov-15 08:44 assemblies/Xamarin.Android.Support.Fragment.dll
-rw---- 1.0 fat 432128 b- stor 17-Nov-15 08:44 assemblies/Xamarin.Android.Support.Media.Compat.dll
-rw---- 1.0 fat 131072 b- stor 17-Nov-15 08:44 assemblies/Xamarin.Android.Support.Transition.dll
-rw---- 1.0 fat 30208 b- stor 17-Nov-15 08:44 assemblies/Xamarin.Android.Support.v4.dll
-rw---- 1.0 fat 1071616 b- stor 17-Nov-15 08:44 assemblies/Xamarin.Android.Support.v7.AppCompat.dll
-rw---- 1.0 fat 30720 b- stor 17-Nov-15 08:44 assemblies/Xamarin.Android.Support.v7.CardView.dll
-rw---- 1.0 fat 194048 b- stor 17-Nov-15 08:44 assemblies/Xamarin.Android.Support.v7.MediaRouter.dll
-rw---- 1.0 fat 35840 b- stor 17-Nov-15 08:44 assemblies/Xamarin.Android.Support.v7.Palette.dll
-rw---- 1.0 fat 554496 b- stor 17-Nov-15 08:44 assemblies/Xamarin.Android.Support.v7.RecyclerView.dll
-rw---- 1.0 fat 22528 b- stor 17-Nov-15 08:44 assemblies/Xamarin.Android.Support.Vector.Drawable.dll

Here is the results of the after APK with [assembly: LinkerSafe]:

-rw---- 1.0 fat 5120 b- stor 17-Nov-16 07:31 assemblies/Xamarin.Android.Arch.Core.Common.dll
-rw---- 1.0 fat 13824 b- stor 17-Nov-16 07:31 assemblies/Xamarin.Android.Arch.Lifecycle.Common.dll
-rw---- 1.0 fat 5120 b- stor 17-Nov-16 07:31 assemblies/Xamarin.Android.Arch.Lifecycle.Runtime.dll
-rw---- 1.0 fat 5632 b- stor 17-Nov-16 07:31 assemblies/Xamarin.Android.Support.Animated.Vector.Drawable.dll
-rw---- 1.0 fat 5632 b- stor 17-Nov-16 07:31 assemblies/Xamarin.Android.Support.Annotations.dll
-rw---- 1.0 fat 290816 b- stor 17-Nov-16 07:31 assemblies/Xamarin.Android.Support.Compat.dll
-rw---- 1.0 fat 122368 b- stor 17-Nov-16 07:31 assemblies/Xamarin.Android.Support.Core.UI.dll
-rw---- 1.0 fat 35840 b- stor 17-Nov-16 07:31 assemblies/Xamarin.Android.Support.Core.Utils.dll
-rw---- 1.0 fat 403968 b- stor 17-Nov-16 07:31 assemblies/Xamarin.Android.Support.Design.dll
-rw---- 1.0 fat 177664 b- stor 17-Nov-16 07:31 assemblies/Xamarin.Android.Support.Fragment.dll
-rw---- 1.0 fat 157696 b- stor 17-Nov-16 07:31 assemblies/Xamarin.Android.Support.Media.Compat.dll
-rw---- 1.0 fat 131072 b- stor 17-Nov-16 07:31 assemblies/Xamarin.Android.Support.Transition.dll
-rw---- 1.0 fat 9728 b- stor 17-Nov-16 07:31 assemblies/Xamarin.Android.Support.v4.dll
-rw---- 1.0 fat 409088 b- stor 17-Nov-16 07:31 assemblies/Xamarin.Android.Support.v7.AppCompat.dll
-rw---- 1.0 fat 30720 b- stor 17-Nov-16 07:31 assemblies/Xamarin.Android.Support.v7.CardView.dll
-rw---- 1.0 fat 194048 b- stor 17-Nov-16 07:31 assemblies/Xamarin.Android.Support.v7.MediaRouter.dll
-rw---- 1.0 fat 35840 b- stor 17-Nov-16 07:31 assemblies/Xamarin.Android.Support.v7.Palette.dll
-rw---- 1.0 fat 317952 b- stor 17-Nov-16 07:31 assemblies/Xamarin.Android.Support.v7.RecyclerView.dll
-rw---- 1.0 fat 5120 b- stor 17-Nov-16 07:31 assemblies/Xamarin.Android.Support.Vector.Drawable.dll

Here is my packages.config:

<packages>
 <package id="Newtonsoft.Json" version="9.0.1" targetFramework="monoandroid71" />
 <package id="Xam.Plugin.Connectivity" version="3.0.3" targetFramework="monoandroid71" />
 <package id="Xamarin.Android.Arch.Core.Common" version="1.0.0" targetFramework="monoandroid80" />
 <package id="Xamarin.Android.Arch.Lifecycle.Common" version="1.0.1" targetFramework="monoandroid80" />
 <package id="Xamarin.Android.Arch.Lifecycle.Runtime" version="1.0.0" targetFramework="monoandroid80" />
 <package id="Xamarin.Android.Support.Animated.Vector.Drawable" version="26.1.0.1" targetFramework="monoandroid80" />
 <package id="Xamarin.Android.Support.Annotations" version="26.1.0.1" targetFramework="monoandroid80" />
 <package id="Xamarin.Android.Support.Compat" version="26.1.0.1" targetFramework="monoandroid80" />
 <package id="Xamarin.Android.Support.Core.UI" version="26.1.0.1" targetFramework="monoandroid80" />
 <package id="Xamarin.Android.Support.Core.Utils" version="26.1.0.1" targetFramework="monoandroid80" />
 <package id="Xamarin.Android.Support.Design" version="26.1.0.1" targetFramework="monoandroid80" />
 <package id="Xamarin.Android.Support.Fragment" version="26.1.0.1" targetFramework="monoandroid80" />
 <package id="Xamarin.Android.Support.Media.Compat" version="26.1.0.1" targetFramework="monoandroid80" />
 <package id="Xamarin.Android.Support.Transition" version="26.1.0.1" targetFramework="monoandroid80" />
 <package id="Xamarin.Android.Support.v4" version="26.1.0.1" targetFramework="monoandroid80" />
 <package id="Xamarin.Android.Support.v7.AppCompat" version="26.1.0.1" targetFramework="monoandroid80" />
 <package id="Xamarin.Android.Support.v7.CardView" version="26.1.0.1" targetFramework="monoandroid80" />
 <package id="Xamarin.Android.Support.v7.MediaRouter" version="26.1.0.1" targetFramework="monoandroid80" />
 <package id="Xamarin.Android.Support.v7.Palette" version="26.1.0.1" targetFramework="monoandroid80" />
 <package id="Xamarin.Android.Support.v7.RecyclerView" version="26.1.0.1" targetFramework="monoandroid80" />
 <package id="Xamarin.Android.Support.Vector.Drawable" version="26.1.0.1" targetFramework="monoandroid80" />
 <package id="Xamarin.Forms" version="2.5.0.77107" targetFramework="monoandroid71" />
</packages>

dalexsoto, JonDouglas, nathanielcook, akamud, and jonathanantoine reacted with heart emoji
I discovered there was some file size that could be spared from the
support library assemblies in release APKs by using the `Link all
assemblies` option. Since most Xamarin users will have the `Link SDK
only` option set, we can save most Xamarin developers some APK size by
setting up the `[assembly: LinkerSafe]` attribute in the support
libraries.
To get an idea on what this saves, I tested the default Xamarin.Forms
template in VS for Mac. I then upgraded to `TargetFrameworkVersion`
8.0, API 26, Xamarin.Forms 2.5.0, and 26.1.0.1 support libraries.
Before:
- Support libs: 5231104
- APK: 20948533
After `[assembly: LinkerSafe]`:
- 2357248
- 17312534
It appears this change saves ~3.6MB in APK file size in release mode
for the default Xamarin.Forms template.
Copy link

dnfclas commented Nov 16, 2017

@jonathanpeppers,
Thanks for having already signed the Contribution License Agreement. Your agreement was validated by .NET Foundation. We will now review your pull request.
Thanks,
.NET Foundation Pull Request Bot

Copy link
Member

@Redth Redth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you PR against 27.x branch instead? We're going to try including this in the QA cycle for the 27 release first. :)

@jonathanpeppers jonathanpeppers changed the base branch from 26.1.x to 27.x November 30, 2017 19:49
Copy link
Member Author

Yeah, no problem.

Looks like I'll have to rework this a bit, though. Conflicts!

Copy link
Member

Redth commented Nov 30, 2017

Ahh i can just work it in manually then, just thought if it merged nicely I'd ask you to do it.

Redth added a commit that referenced this pull request Nov 30, 2017
See the original PR #77 by @jonathanpeppers
Basically we can enable these assemblies to be linked when projects are set to Link SDK Assemblies only.
This can always be opted out of by specifying `AndroidLinkSkip` in your .csproj’s:
```
<PropertyGroup>
 <AndroidLinkSkip>Xamarin.Android.Support.Compat;Xamarin.Android.Support.Compat.UI;...</AndroidLinkSkip>
</PropertyGroup>
```
Copy link
Member

Redth commented Dec 11, 2017

Manually adding this...

jonathanpeppers reacted with thumbs up emoji

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Reviewers

1 more reviewer

@Redth Redth Redth requested changes

Reviewers whose approvals may not affect merge requirements

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

AltStyle によって変換されたページ (->オリジナル) /