В помощь мобильному разработчику
Линковщик

Использование линковщика в проектах Xamarin

Александр Алексеев

Xamarin Linker используется в проектах iOS и Android для удаления неиспользуемого кода из скомпилированных сборок. Это помогает сократить конечный размер apk или ipa. Однако, он часто действует слишком неразборчиво и также удаляет те методы и поля, которые нужны. Так часто случается, если на методы ссылаются только путем отражения.

Параметры линковщика

Начнем с того, что линковщик имеет несколько параметров, из которых можно выбирать. None/Don’t Link означает, что линковщик ничего не сделает, и весь код будет включен в итоговый пакет. Sdk Assemblies Only/Link Framework SDKs Only — линковщик ограничится библиотеками базовых классов. Что конкретно они включают перечислено в материале доступные сборки. Sdk and User Assemblies/Link All — линковщик будет работать со всем, включая код.

Параметры линковщика можно задать, перейдя к свойствам Android.

Настройки линковщика Android

В свойствах iOS параметры выглядят вот так:

Настройки линковщика iOS

 

Размер файла

Если линковщик не использовать и для поддержки выбрать несколько типов архитектур, то очень скоро размер готового пакета приложения значительно увеличится. Используя линковщик и связывая все сборки можно добиться того, что готовый пакет будет на 20—30% меньше своего исходного размера.

Лучший вариант — линковать все сборки, чтобы получить пакет с наименьшим размером, вследствие чего пользователи смогут загружать приложение максимально быстро.

 

Конфигурации

Иногда линковщик не может найти все, что используется. Это, безусловно, имеет место при использовании отражения. Если же линковщик удалил больше, чем следует, тогда при попытке запустить приложение возникают такие ошибки, как MissingMethodException. Здесь перечислены возможности сделать так, чтобы линковщик прекратил удалять определенные сборки и/или методы.

 

Создание ссылочного класса

Эту уловку использовали несколько разработчиков, и это самый постой способ решения этой проблемы. Создайте класс в проекте Android или iOS под названием LinkerPleaseInclude. Затем ссылайтесь на класс и методы, которые требуется использовать, внутри функций, как показано ниже.

 

Этот класс не нужно вызывать откуда бы то ни было, но он должен присутствовать там — линковщик решит, что все классы вызываются и не станет удалять их из созданного двоичного файла.

 

Сборки

Если линкер удаляет сборку полностью, притом что всё в этой сборке требуется сохранить, тогда можно указать линковщику не линковать определенные сборки.

В iOS их можно поместить в mtouch arguments box.

 

В Android поместите их в Skip Linking Assemblies box в разделе Android Options в свойствах проектов.

 

Атрибут Preserve

В sdk у Android и iOS имеется атрибут Preserve, использующийся для обозначения методов или целых классов, которые не нужно линковать. Если требуется сделать это в библиотеке классов, можно создать атрибут Preserve. Это работает с именем атрибута, а не ссылкой на фактический класс. Это можно сделать на уровне сборки.

 

Или поместите его наверх класса или метода.

 

Конфигурация XML

Заметьте, раньше мне не удавалось добиться того, чтобы это работало корректно, но следующие решение описано в документации Xamarin по теме пользовательская конфигурация линкера. Можно создать XML-файл и поместить его в корень проекта iOS или Android. Затем установите Build Action на LinkDescription.

Здесь можно написать XML-файл с именами сборок и методов, которые не нужно связывать.

 

Ознакомьтесь с официальной документацией Xamarin, чтобы узнать больше о способах ссылки на методы.

Подробнее

Если требуется подробно изучить конкретные отличия получающихся в итоге двоичных файлов от линковщика, можно использовать такие средства, как BitDiffer. Документация Xamarin по теме линковки содержится в статьях: линковка на iOS и линковка на Android.

 

Автор: Adam Pedley
ИсточникXamarinHelp.com

Александр Алексеев
Александр Алексеев

Xamarin - разработчик. Работаю с .NET платформой с 2012 года, программирую в основном с использованием C#. За это время успел поработать с ASP.NET, Entity Framework, MSSQL, Git

XAML

Написать ответ