【发布时间】:2019-12-24 10:58:18
【问题描述】:
[更新] 我终于能够使用最新的工具链在 4.2 上部署我们的应用程序。我得到一个错误。原文后见下文。
我们正在寻找一种长期解决方案,以继续使用最新版本的 Visual Studio(在本文发布时为 2019 年),同时继续为旧的 Android 平台(4.4 之前的版本)进行开发。
Xamarin@Microsoft 在 Xamarin.Android 版本 9.2 中放弃了对 4.4 之前的 Android 的支持,但我们不能放弃对我们产品的支持。 到目前为止,我们一直在使用 VS2017 进行特定的 android 开发,但是 VS2019 和 VS2017 开发环境之间的差距越来越大,这增加了我们日常开发的开销。
我们的项目是使用部署在 PC 上的软件的最常用代码库开发的,但该代码的一部分也是可以在特定设备上运行的 Android 应用程序的一部分。 对于作为我们主要活动的 PC 开发,我们希望尽可能地能够使用最新的 .NET 标准和最新工具进行编码。
Android 版本是一种工业软件,其使用的硬件非常特定,我们不能指望 Android 操作系统会更新,因此我们只支持 4.2.2 的最低 Android 版本。
我已经在 SO 和其他论坛上进行了搜索,但没有找到任何“好的”长期解决方案。 以下是我发现的与该主题相关的一些有用信息:
https://docs.microsoft.com/en-us/xamarin/android/release-notes/9/9.2
https://docs.microsoft.com/en-us/xamarin/android/app-fundamentals/android-api-levels?tabs=windows
Which .Net Standard version supports which Android versions?
https://github.com/xamarin/xamarin-android/blob/master/Documentation/guides/messages/xa4216.md
https://docs.microsoft.com/en-us/dotnet/standard/net-standard
目前我认为我们能做的是:
1)我们代码的公共部分主要使用.NET标准库
2) 直接使用 Xamarin.Android 的程序集很少,通常仅用于 UI 部分。
请注意,这与我们现在已经在做的很接近(除了我认为我们可以将更多程序集移植到 .NET Standard)。
但是,由于我们以 API 级别 4.4 为目标并在 4.2 上使用应用程序,因此我们可能会调用一些 4.2 中不支持的 API,或者更糟糕的是,由于新的 Xamarin/Mono 运行时不支持旧的,所以支持但有错误的 API安卓版本。尤其如此,因为有警告 XA4216:即使我们可以在较旧的 android 上部署和运行,因为清单允许它,我们也不能确保操作系统提供 mono 运行时使用的所有必要功能。 目前警告 XA4216 是针对 4.0.3 版本的,但我们看到更新 VS2019 并收到针对 Android 4.2 的警告的那一天即将到来。
那么有没有比以下更好的解决方案:
1) 保留旧的 VS2017/旧 Xamarin.Android 构建环境并阻止我们的日常工作,以确保与 Android 4.2 完全兼容
2) 使用最新的 Xamarin 将我们的构建和开发环境完全更新到 VS2019,并祈祷该实现不会在旧操作系统上出现错误。
我希望能够使用 2 并确保一切正常,而不必在每次更新 Visual Studio 时重新测试整个应用程序。 你怎么看? 为了确保应用程序的稳定性,我们是坚持使用旧的构建系统(VS2017 + 旧的 Xamarin.Android),还是使用最新的 Xamarin 升级到 VS2019 存在“安全”风险?
在此先感谢您提供有关此主题的任何好的建议。
PS: 我推动了解决方案 2:“使用最新的 Xamarin 将我们的构建和开发环境完全更新到 VS2019,并祈祷在旧操作系统上不会出现错误。”首先在我的 PC 上进行本地测试。 在我们的应用程序进行必要的更改以便它使用 VS2019 和最新的 Xamarin 构建后,我部署在我们的 Android 4.2.2 设备上进行测试(我花了一整天的时间来修复构建错误......)。我收到以下错误并且应用程序冻结: W/libc (9196): protoent* getprotobyname(char const*)(3) 未在 Android 上实现。
也许祈祷还不够……有什么想法吗?
【问题讨论】:
-
您是否混淆了
minSdkVersion和targetSdkVersion?如 Xamarin 的文档中所述:请注意,针对 Android 4.4(API 级别 19)或更高版本的目标框架版本构建的应用程序仍然可以在使用 Android 4.3(API 级别 18)或更低版本的设备上成功部署和运行。 当然,您必须确保(通过测试和/或运行时检查)您调用的 API 在应用程序实际运行的 API 级别上可用。 -
不,我并没有混淆两者,因为我指出我已经阅读了文档。我的问题更多的是,尽管我们可以选择“minSdkVersion=v4.0.3”,但如果我们这样做,我们会收到警告 XA4216。此警告告诉我们不再支持 4.1 之前的 android 版本。自从我们使用 4.2.2 以来,到目前为止一切都很好,但未来呢?这看起来确实是一个可接受的短期解决方案,但我怀疑这种向后兼容性是否经过正确测试,因此在为我们的构建系统升级 Visual Studio 时,我们仍然需要执行完整的应用程序测试。
-
不过还是感谢您的评论。
-
有关信息,如果在 4.1 之前的 Android 上使用我们的应用程序,我预计会遇到以下问题:forums.xamarin.com/discussion/166019/… 它已在 Android 4.1 中修复,但我认为它在以前的版本中不起作用版本......所以对我来说,简单地选择 minSdkVersion 使我们的应用程序向后兼容是一个谎言。也许我们可以安装它,但我怀疑它能否在 4.1 之前的设备上正常运行
标签: android xamarin xamarin.android visual-studio-2019 .net-standard