更智能的 Xamarin Android 支持 v4 / v13 NuGet 包

关于 Android 支持库

Google 创建了支持库,以便新功能可以用于旧版 Android。 通常,支持库的名称中会有一个版本号,指明所能兼容的最低 Android API 级别(示例:Support-v4 只能在 API 级别 4 及更高级别上使用。有关详细信息,请参阅此 Stack Overflow 讨论)。

两个支持库(Support-v4Support-v13)不能同时用于同一个应用;也就是说,它们是互斥的。 这是因为 Support-v13 实际上包含 Support-v4 的所有类型和实现。 如果尝试在同一项目中引用这两者,则会遇到“类型重复”错误。

引用问题

由于 Support-v4 已经非常普遍,因此许多第三方库现在都依赖它。 它们本可以选择依赖 Support-v13,但更常见的是依赖 v4,因为这可便于任何使用第三方库的应用支持最低为 4 的 API 级别。

如果 Xamarin 第三方库引用绑定到 Support-v4Xamarin.Android.Support.v4.dll,那么任何使用此库的应用也必须引用 Xamarin.Android.Support.v4.dll。 当同一个应用还希望使用绑定到 Support-v13Xamarin.Android.Support.v13.dll 中的某些功能时,这就成了问题。 如果同时引用这两个绑定,则会遇到“类型重复”错误。

类型转发 v4 绑定程序集

为了解决此问题,我们创建了特殊 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 帮助

虽然开发人员可以手动添加所需的正确引用,但在安装 NuGet 包时,可以使用 NuGet 来帮助选择正确的程序集(常规 v4 绑定或类型转发 v4 程序集)。

因此,Xamarin.Android.Support.v4 NuGet 包现在包含以下逻辑:

如果应用定目标到 API 级别 13 (Gingerbread 3.2) 或更高级别:

  • Xamarin.Android.Support.v13 NuGet 会自动添加为依赖项
  • 将在项目中引用类型转发 Xamarin.Android.Support.v4.dll

如果应用定目标到低于 API 级别 13 的任何级别,则将在项目中引用常规 Xamarin.Android.Support.v4.dll 绑定。

我是否必须使用 Support-v13?

如果应用定目标到 API 级别 13 或更高级别,并且你选择使用 Xamarin Android Support-v4 NuGet 包,则 Xamarin Android Support v13 NuGet 包是必需的依赖项。

我们认为,相对于它所带来的兼容性和易用性,足以无视应用大小的轻微增加(两个 .jar 文件相差 17kb)。

如果你坚持要在定目标到 API 级别 13 或更高级别的应用中使用 Support-v4,可以始终手动下载 .nupkg,解压缩它,并引用程序集。