【问题标题】:The "LinkAssemblies" task failed unexpectedly“LinkAssemblies”任务意外失败
【发布时间】:2015-04-10 01:12:59
【问题描述】:

当我们尝试在发布模式下构建 xamarin 表单项目时,我们收到错误:

C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(5,5): Error MSB4018: The "LinkAssemblies" task failed unexpectedly.
Xamarin.Android.XamarinAndroidException: error XA2006: Reference to metadata item 'System.Void Android.Widget.AbsListView::SetSelectionFromTop(System.Int32,System.Int32)' (defined in 'Xamarin.Forms.Platform.Android, Version=1.3.3.0, Culture=neutral, PublicKeyToken=null') from 'Xamarin.Forms.Platform.Android, Version=1.3.3.0, Culture=neutral, PublicKeyToken=null' could not be resolved. ---> Mono.Cecil.ResolutionException: Failed to resolve System.Void Android.Widget.AbsListView::SetSelectionFromTop(System.Int32,System.Int32)
   at Mono.Linker.Steps.MarkStep.MarkMethod(MethodReference reference)
   at Mono.Linker.Steps.MarkStep.MarkInstruction(Instruction instruction)
   at Mono.Linker.Steps.MarkStep.MarkMethodBody(MethodBody body)
   at Mono.Linker.Steps.MarkStep.ProcessMethod(MethodDefinition method)
   at Mono.Linker.Steps.MarkStep.ProcessQueue()
   at Mono.Linker.Steps.MarkStep.Process()
   at Mono.Linker.Steps.MarkStep.Process(LinkContext context)
   at Mono.Linker.Pipeline.Process(LinkContext context)
   at MonoDroid.Tuner.Linker.Process(LinkerOptions options, LinkContext& context)
   at Xamarin.Android.Tasks.LinkAssemblies.Execute()
   --- End of inner exception stack trace ---
   at Xamarin.Android.Diagnostic.Error(Int32 code, Exception innerException, String message, Object[] args)
   at Xamarin.Android.Tasks.LinkAssemblies.Execute()
   at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
   at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__20.MoveNext() (MSB4018) (XXX.Android)

我们如何解决这个问题?我们再次尝试清洁和建造。甚至关闭 xamarin 工作室并重新启动它。似乎没有任何效果。

我们正在使用最新版本的 xamarin 表单和 xamarin 表单实验室。我们使用的最低 android API 级别是 17。我什至尝试了最低 sdk 版本 20。

更多细节:

Xamarin Studio
Version 5.7 (build 661)
Installation UUID: f97e711d-1fe0-450f-a3bb-2d9b972ab295
Runtime:
    Microsoft .NET 4.0.30319.0
    GTK+ 2.24.22 (MS-Windows theme)
    GTK# 2.12.26

Xamarin.Android
Version: 4.20.0 (Indie Edition)
Android SDK: C:\Users\Kartik\AppData\Local\Android\android-sdk
    Supported Android versions:
        2.1    (API level 7)
        2.2    (API level 8)
        2.3    (API level 10)
        3.1    (API level 12)
        4.0    (API level 14)
        4.0.3  (API level 15)
        4.1    (API level 16)
        4.3    (API level 18)
        4.4    (API level 19)
        4.4.87 (API level 20)
        5.0    (API level 21)
Java SDK: C:\Program Files (x86)\Java\jdk1.6.0_39
java version "1.6.0_39"
Java(TM) SE Runtime Environment (build 1.6.0_39-b04)
Java HotSpot(TM) Client VM (build 20.14-b01, mixed mode, sharing)

Build Information
Release ID: 507000661
Git revision: b70bab61da996da29045ea8ee8aed1a6faedbe78
Build date: 2015-01-05 11:27:37-05
Xamarin addins: 82f6c71490562d6cd125a09287f441902fdac3d7

Operating System
Windows 6.2.9200.0 (64-bit)

【问题讨论】:

    标签: xamarin xamarin.forms xamarin-studio


    【解决方案1】:

    显然,this is a known issue:Xamarin Forms 需要 TargetAndroidVersion 为 21。(在配置 GUI 中,标题为“使用 Android 版本编译:”)

    【讨论】:

    • 这个错误再次出现。我有我的 TargetAndroidVersion 21。
    • 嗯。在文本编辑器中查看原始项目文件;您在以下元素中看到了什么:(下面是我的值)v5.0
    • 这对我不起作用。您必须检查两件事:1) 确保实际安装了 SDK 21...所以前往您的 SDK 更新程序并安装 21/22(或更高版本)。 2)更改目标版本没有帮助,您(还)必须将“编译使用”更改为版本 21。如果您这样做了,它应该可以工作。
    • 为什么目标应该是21? Xamarin.Formds 要求:“Android 4.0.3 (API 15) 或更高版本”注意:目标设置应设置为使用最新/自动,并且您应始终安装最新版本的 Android SDK(撰写本文时为 6.0 ): 来源:developer.xamarin.com/guides/xamarin-forms/getting-started/…
    【解决方案2】:

    在我的情况下,由于将 Xamarin.ios.dll 添加到可移植项目引用中而出现问题。我已经删除了那个引用,它现在可以工作了

    【讨论】:

      【解决方案3】:

      我更改了链接器属性 > 从仅 Sdk 程序集链接到发布配置的 Sdk 和用户程序集。

      【讨论】:

      • 感谢您的提示,对我来说,在将链接行为设置为Don't Link后已修复
      • @Ultimo_m 这通常不是一个好主意,请参阅 Dpedrinha 对stackoverflow.com/a/40931238/3609052 的评论
      • 是的,你是对的,我有点想过,因为它让我想起了 proguard,但现在我在你发表评论后检查了 apk 大小,我必须寻找真正的解决方案。不知何故,添加 akavache 破坏了我的发布版本。
      【解决方案4】:

      在我的情况下,问题是在 pcl 项目中引用了 dll Xamarin.iOS。链接不适用于此程序集。删除引用解决了这个问题。

      【讨论】:

        【解决方案5】:

        我也遇到了同样的问题。经过一系列的尝试和错误,我找到了解决方案。

        在您的清单中,将 Target Android 版本设置为 Android 7.1(API 级别 25 Nougat)或更高版本。 也将 Compile Android Version 设置为 Android 7.1。

        希望对你有帮助

        【讨论】:

          【解决方案6】:

          我修复了在 NuGet 包管理器中将 Xamarin.Android.Support.v4 降级到 21.0.0 版本的问题。希望对你有所帮助

          【讨论】:

            【解决方案7】:

            在将 Android 目标版本更改为 9.0 后,我最终收到此错误。我注意到在 Android 项目的packages.config 中,所有的包仍然以monoandroid81 而不是monoandroid90 为目标。

            我通过重新安装所有 NuGet 包解决了这个问题。这可以通过 Visual Studio 中的包管理器控制台轻松完成,方法是输入:

            Update-Package -Reinstall
            

            不过,我建议先进行备份。

            之后所有的包都针对正确的版本,编译错误就消失了。

            【讨论】:

              【解决方案8】:

              “LinkAssembliesTask failed”错误的根本原因不同。

              我正在升级 NuGet 包,并弄乱了引用。

              =====

              假设我有两个项目:

              1. 网络标准项目

                • 引用了 Assembly1。

                • Assembly1 有一个 CoolGuy 类,带有一个 CoolGuy.Flex() 方法。

              2. AndroidProject,它引用了 NetStandardProject。

                • 引用了 Assembly2。

                • Assembly2 有一个 CoolGuy 类,但没有 CoolGuy.Flex() 方法。

              链接器正在拉入 Assembly2,寻找 CoolGuy.Flex(),然后出现“LinkAssembliesTask failed”,指出它找不到 Flex() 方法。它不能,因为它在错误的程序集中查找。

              NetStandard 项目已编译,因为它引用了 Assembly1,并不真正关心 AndroidProject 引用的是什么。它是独立建造的。但是当链接器加载 Assembly2 时,它使用了“错误”的程序集。

              我最终有点走运,并意识到其中一个程序集未被使用,因此我将其删除,构建成功。

              希望能对以后的人有所帮助。

              =====

              奖金: 如果您想查看它选择搜索哪个程序集,让构建失败,然后转到 {project}\obj{profile}{android_version}\android\assets 文件夹,并找到 dll。您可能能够验证它不存在,并为您提供一个了解它失败原因的起点。

              【讨论】:

                【解决方案9】:

                将旧单声道 android 的链接更改为新单声道 android。它对我有用。我将某些 dll 的 Monoandroid 8.0 更改为 Monoandroid 9.0,例如 Xamarin.Android.Platforms 等。

                【讨论】:

                  【解决方案10】:

                  在我的追逐中,我已将链接器属性( Linker --> Linking )更改为“无”。我正在使用 Visual Studio 2017 RC

                  【讨论】:

                  • 是的,但是关闭链接器并不能解决链接器的问题,是吗?它显着增加了 apk 大小,并且 xamarin 应用程序已经太大,所以这不是一个真正的选择。
                  • 这解决了 VS Enterprise 2017 的问题,但会增加应用程序大小
                  • 这不是解决方案。你为什么还要发布这样的东西?所有 xamarin 新手都会上你的陷阱。很遗憾不使用链接。你甚至应该使用完整链接。
                  【解决方案11】:

                  只是我将链接从“NONE”更改为“sdk 和用户程序集”,然后我运行了我的解决方案,问题已经解决。之后,您可以将“sdk 和用户程序集”更改为“NONE”并运行您的项目而不会出现任何问题。

                  但发布文件的大小可能会有所变化。

                  enter image description here

                  【讨论】:

                    【解决方案12】:

                    我已经解决了将 options > Android Builder > Linker 中的 Android Linker Behavior 选项从“Link sdk Assemblies Only”更改为“don't link”的问题。

                    【讨论】:

                    • 抱歉,这并不能解决问题。如果您选择“不链接”,您将关闭链接器,这意味着您将在 APK 中部署整个 BCL,包括您不需要的所有组件。这会使您的 APK 变得巨大。
                    • 这种方法可以解决症状,但不是问题的直接原因;相当无效的 Android 目标是。
                    猜你喜欢
                    • 1970-01-01
                    • 2019-12-30
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-08-24
                    • 2018-12-17
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多