使用第三方Xamarin组件时,Xamarin应用只在调试模式下编译,而不是发布模式。

5

我正在尝试将Localytics SDK(通过他们的Xamarin组件)集成到我的Xamarin Android应用程序中。它在Debug模式下编译,但是如果我切换到Release构建,则编译时会出错:

/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets: Error: 执行任务LinkAssemblies时出错:错误XA2006:无法解析对“Android.Gms.Gcm.Iid.InstanceIDListenerService”的引用 (在程序集“LocalyticsXamarin.Android,Version=4.2.0.29760,Culture=neutral,PublicKeyToken=null”中定义),其范围为 “Xamarin.GooglePlayServices.Gcm,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”。当范围与定义程序集不同时, 这通常意味着该类型已被转发。(com.rpr.mobile.droid)

如果我将链接器行为从仅链接SDK程序集切换到不链接,则可以编译通过,但这不是一个选项,因为apk太大。如果我切换回仅链接SDK程序集并将“LocalyticsXamarin.Android”添加到忽略程序集列表中,它仍然会给出相同的编译错误。
这个错误似乎暗示着我的应用和Localytics Xamarin包装器之间的Google Play服务版本不匹配,然而他们向我发送了一个更新版本的包装器,使用了最新版本(42.1001.0),我已经确认它与我们的应用程序匹配。此外,他们自己的示例Android项目编译正常。我已经检查了他们示例Android项目中的每个设置,并进行了更改以匹配我的设置,但仍然无法编译。
以下是我Android项目中的packages.config:
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="modernhttpclient" version="2.4.2" targetFramework="MonoAndroid60" />
  <package id="Newtonsoft.Json" version="9.0.1" targetFramework="MonoAndroid60" />
  <package id="Rx-Core" version="2.2.5" targetFramework="monoandroid70" />
  <package id="Rx-Interfaces" version="2.2.5" targetFramework="monoandroid70" />
  <package id="Rx-Linq" version="2.2.5" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.Animated.Vector.Drawable" version="25.1.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.Compat" version="25.1.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.Core.UI" version="25.1.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.Core.Utils" version="25.1.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.Fragment" version="25.1.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.Media.Compat" version="25.1.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.v13" version="25.1.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.v4" version="25.1.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.v7.AppCompat" version="25.1.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.Vector.Drawable" version="25.1.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Build.Download" version="0.4.3" targetFramework="monoandroid70" />
  <package id="Xamarin.Firebase.Analytics" version="42.1001.0" targetFramework="monoandroid70" />
  <package id="Xamarin.Firebase.Analytics.Impl" version="42.1001.0" targetFramework="monoandroid70" />
  <package id="Xamarin.Firebase.Common" version="42.1001.0" targetFramework="monoandroid70" />
  <package id="Xamarin.Firebase.Iid" version="42.1001.0" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Analytics" version="42.1001.0" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Analytics.Impl" version="42.1001.0" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Base" version="42.1001.0" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Basement" version="42.1001.0" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Gcm" version="42.1001.0" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Iid" version="42.1001.0" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Location" version="42.1001.0" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Maps" version="42.1001.0" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.TagManager.V4.Impl" version="42.1001.0" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Tasks" version="42.1001.0" targetFramework="monoandroid70" />
</packages>

以下是可正常工作的示例Localytics项目的packages.config文件:
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Xamarin.Android.Support.Compat" version="25.1.1" targetFramework="MonoAndroid70" />
  <package id="Xamarin.Android.Support.Core.UI" version="25.1.1" targetFramework="MonoAndroid70" />
  <package id="Xamarin.Android.Support.Core.Utils" version="25.1.1" targetFramework="MonoAndroid70" />
  <package id="Xamarin.Android.Support.Design" version="25.1.1" targetFramework="MonoAndroid70" />
  <package id="Xamarin.Android.Support.Fragment" version="25.1.1" targetFramework="MonoAndroid70" />
  <package id="Xamarin.Android.Support.Media.Compat" version="25.1.1" targetFramework="MonoAndroid70" />
  <package id="Xamarin.Android.Support.Transition" version="25.1.1" targetFramework="MonoAndroid70" />
  <package id="Xamarin.Android.Support.v4" version="25.1.1" targetFramework="MonoAndroid70" />
  <package id="Xamarin.Android.Support.v7.AppCompat" version="25.1.1" targetFramework="MonoAndroid70" />
  <package id="Xamarin.Android.Support.v7.CardView" version="25.1.1" targetFramework="MonoAndroid70" />
  <package id="Xamarin.Android.Support.v7.MediaRouter" version="25.1.1" targetFramework="MonoAndroid70" />
  <package id="Xamarin.Android.Support.v7.Palette" version="25.1.1" targetFramework="MonoAndroid70" />
  <package id="Xamarin.Android.Support.v7.RecyclerView" version="25.1.1" targetFramework="MonoAndroid70" />
  <package id="Xamarin.Android.Support.Vector.Drawable" version="25.1.1" targetFramework="MonoAndroid70" />
  <package id="Xamarin.Build.Download" version="0.4.3" targetFramework="MonoAndroid70" />
  <package id="Xamarin.Forms" version="2.3.3.193" targetFramework="MonoAndroid70" />
  <package id="Xamarin.GooglePlayServices.Base" version="42.1001.0" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Basement" version="42.1001.0" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Clearcut" version="42.1001.0" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Gass" version="42.1001.0" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Gcm" version="42.1001.0" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Iid" version="42.1001.0" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Tasks" version="42.1001.0" targetFramework="monoandroid70" />
</packages>

为了重现问题,这里是最新的Localytics SDK Xamarin封装代码(此处),可以正常构建。您需要获取.xam文件并使用Xamarin-Component将其安装到Xamarin Studio中。
这里是我Android项目代码的简化版本(此处)
很抱歉我的项目太大了,虽然我删除了所有的代码和资源,但由于组件和包仍然很大,因此我不想删除它们,因为它们与问题相关。您需要打开RPR Mobile - Android.sln解决方案,切换到Release-Prod,然后尝试构建,您会看到错误。
有任何想法吗?

我认为这里可能有几个问题。1. 您的项目的<TargetFrameworkVersion>是什么?它是最新的吗?如果不是,应该更新。2. 可以推断出此类型正在被链接。您可以尝试跳过链接Xamarin.GooglePlayServices.Iid,因为这是实际程序集所在的位置。为了帮助调查,您可以添加一个packages.config/任何其他库及其版本,以便更容易地查看所有进入您的项目的内容。如果您能创建一个具有相同库的示例应用并上传,那将非常有帮助! - Jon Douglas
@JonDouglas 目标版本是Android 7.1(API级别25)。我刚试了跳过Xamarin.GooglePlayServices.Iid的链接,但仍然出现相同的错误。让我更新一下packages.config的问题... - Justin
除了上面的Github链接外,我没有其他参考Localytics的东西。看起来packages.config有所不同:https://github.com/localytics/localytics-xamarin/blob/master/LocalyticsXamarin/Android/packages.config和https://github.com/localytics/localytics-xamarin/tree/master/LocalyticsXamarin/packages。你有提到这个示例的链接吗? - Jon Douglas
@JonDouglas - 是的,他们的Github存储库仍然引用旧版Google Play服务。我们认为问题在于他们需要更新包装器以利用最新的Google Play服务,因此他们向我们发送了一个更新版本,但它仍然出现相同的错误。他们在更新代码中的示例项目编译正常,所以我不确定这是否对您有所帮助。听起来我需要精简我的项目,然后上传给您进行测试。让我今天处理一下... - Justin
是的,这样最好帮助调查。如果没有看到示例项目在做什么,我基本上一无所知。谢谢! - Jon Douglas
显示剩余9条评论
1个回答

5

这个 PATCHED 版本附带的组件似乎没有更新,其中包括你所需的参考信息,例如 Xamarin.GooglePlayServices.Iid

你很可能需要重新制作这个组件,或者让供应商为你重制。看起来,关于添加到你的项目中的最终 .dll 存在缓存问题。


请阅读注释,因为其中包含了步骤。 - Jon Douglas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接