Xamarin Android,无法将CG桥设置为旧模式(MONO_GC_PARAMS =桥实现)

时间:2018-06-25 11:30:44

标签: android xamarin garbage-collection

我的应用程序崩溃时出现以下错误:

System.ArgumentException: Handle must be valid. Parameter name: instance  

在3个视图之间来回切换多次时,会发生错误。对于需要多少个开关并没有一致性,但是过一会儿就会导致崩溃。 StackOverflow和其他站点上的多个线程建议尝试将CG Bridge设置为使用Old模式,但是我似乎无法使它起作用,请更改我的意思。构建应用程序时,我已经激活了诊断级别的输出,但是它始终只打印:

MONO_GC_PARAMS = major=marksweep-conc,nursery-size=8m

我已经创建了一个environment.txt文件,并将“构建操作”设置为AndroidEnvironment,但这没什么区别。我已经尝试了两个文件:

MONO_GC_PARAMS=bridge-implementation=old

MONO_GC_PARAMS=bridge-implementation=old,nursery-size=128‌​m,soft-heap-limit=51‌​2m,major=marksweep-c‌​onc

我发现(Re)Build输出没有差异,并且该应用仍然在完全相同的位置崩溃。

如果找不到针对该特定问题的答案,那么此“解决方案”仍然有效还是无法解决?

1 个答案:

答案 0 :(得分:0)

为了验证您的 MONO_GC_PARAMS=bridge-implementation= 更改是否确实生效:

  1. 启用单声道调试日志 - adb shell setprop debug.mono.log default,gc,mono_log_level=debug
  2. 观察单声道 adb 日志 - adb logcat | grep -e "mono" -i
  3. 在您的应用内手动调用垃圾回收 - System.GC.Collect()
  4. 查找引用 GC_NEW_BRIDGEGC_OLD_BRIDGE 的日志,具体取决于是否设置了 old/new。您还有 tarjen 选项。不过,tarjen 已证明给我们的团队造成了许多崩溃。

默认选项是 tarjen。 - https://docs.microsoft.com/en-us/xamarin/android/internals/garbage-collection#gc-bridge-options

<块引用>

默认设置是 Tarjan。如果您发现回归,您可能会发现有必要将此选项设置为旧。此外,如果 Tarjan 不能提高性能,您可以选择使用更稳定的 Old 选项。

供参考 - 类似的 Xamarin Android GitHub 问题:https://github.com/xamarin/xamarin-android/issues/6102