【问题标题】:Xamarin.Android -SDK and User Assembly linking removes property in the 3rd party dllXamarin.Android -SDK 和用户程序集链接删除了第 3 方 dll 中的属性
【发布时间】:2017-02-25 09:01:24
【问题描述】:

我对 android 链接器有一个奇怪的行为。我正在使用 Syncfusion 的调度程序工具。我已经添加它是所有 3 个 dll 作为

Syncfusion.SfSchedule.XForms;Syncfusion.SfSchedule.XForms.Android;Syncfusion.SfSchedule.Android;

当我使用“SDK 和用户程序集”时跳过链接程序集

但是这个 dll 的一个属性是抛出异常,如下所示。显然,链接器删除了一个名为 IsYearlySpecific 的属性。我不知道为什么,但我创建了新项目并尝试了相同的代码,它工作正常。无论我尝试过什么,我都无法在新项目中重现。

我的原始项目很大,还有其他几个包。如果有人可以提出建议,我应该在这里做什么而不重新创建整个项目。 我尝试了很多次清洁重建解决方案。删除了 XF 项目和 Android 项目下的 obj 和 bin 文件夹。我也在另一台机器上试过这个项目。

我联系了他们的支持,但他们也无法重现,因此需要一个示例项目。由于我无法在新项目中重现,并且无法共享原始项目的整个源代码。 如果存在任何其他缓存或其他内容,请给我一些建议,我可以清理东西。

{Java.Lang.NoSuchFieldError: no "Z" field "IsYearlySpecific" in class "Lcom/syncfusion/schedule/RecurrenceProperties;" or its superclasses
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/4009/f3074d2c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 
  at Java.Interop.JniEnvironment+InstanceFields.GetFieldID (Java.Interop.JniObjectReference type, System.String name, System.String signature) [0x00068] in /Users/builder/data/lanes/4009/9578cdcd/source/Java.Interop/src/Java.Interop/Java.Interop/JniEnvironment.g.cs:10972 
  at Android.Runtime.JNIEnv.GetFieldID (System.IntPtr jclass, System.String name, System.String sig) [0x00000] in /Users/builder/data/lanes/4009/9578cdcd/source/monodroid/src/Mono.Android/JNIEnv.g.cs:456 
  at Com.Syncfusion.Schedule.RecurrenceProperties.set_IsYearlySpecific (System.Boolean value) [0x00016] in <e63d7911148e4f5c8433fa067a7eae25>:0 
  at Syncfusion.SfSchedule.XForms.Droid.RecurrenceBuilder_Android.Syncfusion.SfSchedule.XForms.IRecurrenceBuilder.RRuleGenerator (Syncfusion.SfSchedule.XForms.RecurrenceProperties formRecurrenceProperties, System.DateTime startTime, System.DateTime endTime) [0x000cd] in <9625327b1ffb4afb82c0a45d09128902>:0 
  at myapp.Pages.ScheduleSamplePage.get_Title () [0x0010c] in C:\Git\myapp\myapp\myapp\Pages\ScheduleSamplePage.cs:48 
  --- End of managed Java.Lang.NoSuchFieldError stack trace ---
java.lang.NoSuchFieldError: no "Z" field "IsYearlySpecific" in class "Lcom/syncfusion/schedule/RecurrenceProperties;" or its superclasses
    at md5874faab2802fcbafca06095cc637d65d.MainActivity.n_onCreate(Native Method)
    at md5874faab2802fcbafca06095cc637d65d.MainActivity.onCreate(MainActivity.java:32)
    at android.app.Activity.performCreate(Activity.java:6285)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2524)
    at android.app.ActivityThread.access$900(ActivityThread.java:154)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1391)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:234)
    at android.app.ActivityThread.main(ActivityThread.java:5526)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
}

【问题讨论】:

  • 如上所述,我已经做到了。我想也许我的用户配置文件下有一些其他包缓存等
  • 我需要更多的咖啡...java.lang.NoSuchFieldError : 你启用了 Proguard 吗?
  • 是的,我有。干净的项目没有proguard
  • 在没有启用 Proguard 的情况下可以工作吗?如果是这样,请在该 Java 类 syncfusion.schedule.* 上添加一个 proguard --keep
  • Xamarin 链接器从基于 CIL 的程序集中剥离 IL 代码,Proguard 剥离 Java 位代码(和资源等)。类似的功能,但 Java vs. .Net

标签: xamarin xamarin.android xamarin.forms


【解决方案1】:

{Java.Lang.NoSuchFieldError:“Lcom/syncfusion/schedule/RecurrenceProperties;”类中没有“Z”字段“IsYearlySpecific”;或其超类

Java 包名称将是小写的,因此从错误中,我会将以下内容添加到分配了 ProguardConfiguration构建类型 的 proguard 配置文件中

-keep class com.syncfusion.** { *; }
-keep class * extends com.syncfusion.** { *; }

注意:确保您添加的 proguard 文件不是 Unicode 文本文件(U+FEFF 字节顺序标记 (BOM)),因为 proguard 将失败...

【讨论】:

  • 它确实有效,但请让我理解一些事情。为什么下面这些都不起作用。在我尝试它们之前没有成功。第二个问题,您是否告诉我在名称空间或类名中保持所有内容都具有同步融合? -keepclassmembers 类 Syncfusion.SfSchedule.XForms.RecurrenceProperties -保持公共类 Syncfusion.SfSchedule.Android.** { ; } -keep 公共类 Syncfusion.SfSchedule.XForms.* { ; } -keep 公共类 Syncfusion.SfSchedule.XForms.Android.* { *; }
  • @batmaci 我的例子是将 everything 保存在 com.syncfusion 包中。您的所有示例都使用了错误的 Java 包名称,我假设 Syncfusion.SfSchedule.XForms 是 C# 命名空间(?我不使用 Syncfusion)。如果你有多个com.syncfusion 包,你可以通过只使用一个包com.syncfusion.schedule.* 或只使用一个类com.syncfusion.schedule.RecurrenceProperties,或一个类及其字段com.syncfusion.schedule.RecurrenceProperties { &lt;fields&gt;; } 等等来进一步限制我的示例......有意义吗?
  • 表示com。前缀是 Java 特定的吗?我的意思是我对Java不是很熟悉。这就是为什么我试图理解这种模式。
  • @batmaci Java 包名类似于 C# 命名空间,所以在com.syncfusion.schedule.RecurrenceProperties 的情况下,com.syncfusion.schedule 是包名,RecurrenceProperties 是类。就像 C# 命名空间可以是任何名称一样,Java 也可以,但它们是小写的,名称遵循分层命名模式,同一包中的类可以访问私有/受保护的成员....
  • 啊,好的,我刚刚看到它已经写在异常消息中,它是 Lcom/syncfusion/schedule 但为什么是 Lcom?它代表什么?很抱歉深入了解它。试着了解下次我是否有类似的问题来弄清楚自己
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多