MvvmCross 和 Android 上的链接问题

Posted

技术标签:

【中文标题】MvvmCross 和 Android 上的链接问题【英文标题】:issues with MvvmCross and linking on Android 【发布时间】:2013-06-04 17:43:07 【问题描述】:

我有一个 android 应用程序使用了多个绑定 ItemsSource 的 MvxGridView

  local:MvxBind="ItemsSource Groups;ItemClick ShowGroupCommand"
  local:MvxBind="ItemsSource Products;ItemClick ShowProductCommand"

在发布模式下运行应用时,链接行为='不链接',应用大小为 20MB!,一切正常。

将链接行为切换为“仅链接 SDK 程序集”,应用程序大小为 7MB,但运行时出现意外行为。 以下是一些提到 MvxGridView 的 ItemsSource 绑定问题的应用程序输出:

http://pastebin.com/smDf1Ekc

我知道 Xamarin (here) 中的链接选项。

但我不知道我应该怎么做才能让它发挥作用。

我正在开发一个小型试点应用程序,我需要将其发送给客户进行检查。当我想用 Xamarin 和 MVVMcross 重写的完整 Android 应用程序小于 1MB 时,发送 20MB 看起来不太好。 我已经花了很多时间在这个问题上,但没有运气,希望有人能提供帮助。

【问题讨论】:

【参考方案1】:

有几种方法可以解决这个问题,包括:

使用 LinkerPleaseInclude.cs 文件 - 默认情况下,nuget 包中包含一个入门文件(请参阅 LinkerPleaseInclude.cs) 使用链接器 xml 文件 - 就像 ReactiveUI 用于 MonoTouch 的那个 - 请参阅 Linker.xml

这里也有很多关于这个的问题和答案:

Android App is too large and Linking disables functionality Trouble with xamarin.ios/monotouch , mvvmcross and linking Problems with mvvmcross Binding on IOS (Works on Simulator, but some properties doesn't work on the Device) MvvmCross Monotouch - Fail to bind Properties on a real iPad, but it works on the Simulator MvxException in Release Mode for Android

【讨论】:

谢谢斯图尔特。我已经在使用 LinkerPleaseInclude.cs 但我不知道要在那里引用什么才能使其工作。这个错误有点严重。添加对 INotifyCollectionChanged 的​​引用使其工作。是否有更简单的选项可以使“仅 SDK 库”链接工作但不向 LinkerPleaseInclude.cs 添加代码?对我来说,这看起来有点问题,因为它使应用程序难以测试。应用程序的某些部分(屏幕)可以使用某些特定功能,这些功能仅在该特定位置/使用情况下会破坏应用程序。如有必要,我可以提出不同的问题。 “错误有点严重。” - 如果你能改进它,请做。 “有没有更简单的选择” - 请查看我现有的答案 - 其他人可能知道其他答案,但我通常会尽力给出最好的答案。 再次感谢斯图尔特。对于像我这样对 MVVMCross 经验较少的人来说,这很神秘。 说真的 - 堆栈跟踪和源代码都在那里 - 如果你能想到一种让它不那么神秘的方法,那么我非常愿意接受想法 :) 我看不到直接解决该问题的方法。这是一个链接器问题,错误不能很漂亮。我喜欢 Xamarin、C# 和 MVVCross,但我对链接如何工作以提出解决方案没有深入的了解。例如,我预计与 ViewModels 属性的绑定会出现更多问题。这是运行时反射使用的代码,我不确定它是如何工作的,但不是我遇到的问题。

以上是关于MvvmCross 和 Android 上的链接问题的主要内容,如果未能解决你的问题,请参考以下文章

带有 MvvmCross 的 Xamarin.Android 上的 System.InvalidCastException

在 Xamarin.Android 中通过 MVVMCross 绑定 OxyPlot

在 Xamarin.Android 和 MvvmCross 中定义应用程序类的基类

使用逗号作为带有 MvvmCross 的 android EditText 的小数分隔符

MvvmCross Android UI 组件

MvvmCross Android 片段添加到后台堆栈