Оптимизированные пакеты NuGet поддержки Android v4 и v13 в Xamarin
Google создал библиотеки поддержки, чтобы сделать новые функции доступными для старых версий Android. Как правило, библиотеки поддержки получают номер версии в имени, который является самым низким уровнем API Android, с которым они совместимы (например, поддержка-v4 можно использовать только на уровне API 4 и более поздних версиях). Дополнительные сведения в этом обсуждении Переполнения стека).
Две библиотеки поддержки Support-v4
и Support-v13
нельзя использовать в одном приложении, то есть они являются взаимоисключающими. Это связано с тем, что Support-v13
фактически содержит все типы и реализацию Support-v4
. Если вы попробуете сослаться на обе версии в одном и том же проекте, то столкнетесь с ошибками повторяющегося типа.
Поскольку Support-v4
стала настолько популярной, теперь от нее зависят многие сторонние библиотеки. Они могли бы зависеть от поддержки версии 13, но чаще всего зависят от версии 4, поскольку это дает приложениям, использующим сторонние библиотеки, возможность поддерживать уровни API до 4.
Если библиотека стороннего производителя Xamarin ссылается на привязку Xamarin.Android.Support.v4.dll
для Support-v4
, любое приложение, использующее эту библиотеку, также должно ссылаться на Xamarin.Android.Support.v4.dll
. Это станет проблемой, если тому же приложению требуется использовать некоторые из функций привязки Xamarin.Android.Support.v13.dll
к Support-v13
. Если вы ссылаетесь на обе привязки, возникнут ошибки с повторяющимися типами.
Чтобы обойти эту проблему, мы создали специальную сборку Xamarin.Android.Support.v4.dll
, которая имеет не реализации, а атрибуты [assembly: TypeForwardedTo (..)]
, которые перенаправляют все типы Support-v4
в реализацию внутри сборки Xamarin.Android.Support.v13.dll
.
Это означает, что разработчик может ссылаться на эту сборку с перенаправленным типом в своем приложении, которая будет соответствовать ссылке Xamarin.Android.Support.v4.dll
в любых сторонних библиотеках, в тоже время позволяя использовать в приложении Xamarin.Android.Support.v13.dll
.
Хотя разработчик может вручную добавлять нужные ссылки, мы можем использовать NuGet для помощи в выборе правильной сборки (обычная привязка версии 4 или сборка с перенаправленным типом версии 4) при установке пакета NuGet.
Таким образом, пакет NuGet Xamarin.Android.Support.v4
теперь содержит следующую логику.
Если приложение предназначено для API уровня 13 (Gingerbread 3.2) или более поздней версии:
Xamarin.Android.Support.v13
NuGet будет автоматически добавлен в качестве зависимости;- В проекте будет указана ссылка на тип с перенаправлением
Xamarin.Android.Support.v4.dll
.
Если приложение нацелено на уровень, являющийся ниже API уровня 13, вы получите обычную привязку Xamarin.Android.Support.v4.dll
, на которую ссылается проект.
Если приложение предназначено для API уровня 13 или выше и вы решили использовать пакет NuGet Xamarin Android Support-v4
, то пакет NuGet Xamarin Android Support v13
является обязательной зависимостью.
Мы считаем, что незначительное увеличение размера приложения (два JAR-файла отличаются на 17 Кб) вполне оправдано с точки зрения совместимости и меньшего количества проблем, возникающих в связи с этим.
Если вы непреклонны в использовании Support-v4
в приложении, которое нацелено на API уровня 13 или выше, вы всегда можете вручную загрузить файл .nupkg
, извлечь его и создать ссылку на сборку.