Xamarin.Android APK аварийно завершает работу после перехода на Visual Studio Team Services (VSTS) - PullRequest
0 голосов
/ 30 мая 2018

У нас есть мобильное приложение (Xamarin.Forms для iOS и Android), которое мы в процессе миграции с нашего локального Team Foundation Server (TFS) на Visual Studio Team Services (VSTS).Последние пару месяцев мы размещали наш код в VSTS, но выполняли сборки и релизы для соответствующих магазинов из нашей локальной TFS.В конце прошлой недели я перенес и определения сборки и выпуска в VSTS, так что теперь у нас есть весь процесс в VSTS.

Или я так подумал ... Ибо, пока сборка и выпуск iOS работают нормально, а также Android собирает и выпускает, приложение Android теперь падает, когда вы пытаетесь запустить его .Никаких серьезных (читай: нет) изменений в коде не произошло, и ни HockeyApp, ни собственный журнал ошибок нашего приложения не в состоянии зафиксировать причину сбоя, равно как и консоль разработчика Google не дает нам никакой информации по этому вопросу.После нескольких попыток я смог получить следующее исключение из Logcat:

I/MonoDroid(21970): UNHANDLED EXCEPTION:
I/MonoDroid(21970): System.ArgumentException: element is not of type Xamarin.Forms.View
I/MonoDroid(21970): Parameter name: element
I/MonoDroid(21970):   at Xamarin.Forms.Platform.Android.VisualElementRenderer`1[TElement].Xamarin.Forms.Platform.Android.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x0001c] in <fa196d4afd1b4356b38d6cf3bb1e4df8>:0 
I/MonoDroid(21970):   at Xamarin.Forms.Platform.Android.Platform.CreateRenderer (Xamarin.Forms.VisualElement element, Android.Support.V4.App.FragmentManager fragmentManager, Android.Content.Context context) [0x00031] in <fa196d4afd1b4356b38d6cf3bb1e4df8>:0 
I/MonoDroid(21970):   at Xamarin.Forms.Platform.Android.AppCompat.FragmentContainer.OnCreateView (Android.Views.LayoutInflater inflater, Android.Views.ViewGroup container, Android.OS.Bundle savedInstanceState) [0x0001b] in <fa196d4afd1b4356b38d6cf3bb1e4df8>:0 
I/MonoDroid(21970):   at Android.Support.V4.App.Fragment.n_OnCreateView_Landroid_view_LayoutInflater_Landroid_view_ViewGroup_Landroid_os_Bundle_ (System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_inflater, System.IntPtr native_container, System.IntPtr native_savedInstanceState) [0x00020] in <20045e457c414d37bc46e447a5bb3bb5>:0 
I/MonoDroid(21970):   at (wrapper dynamic-method) System.Object.b09cff61-6f2e-471d-b43a-8d2949513eb7(intptr,intptr,intptr,intptr,intptr)

Теперь в нашем коде есть только одно место, где мы используем фрагменты, то есть пользовательский рендер, который мы используем для расширениястандартная реализация BottomBarPage, которую мы используем вместо стандартной Xamarin TabbedPage.Поэтому я попытался выполнить сборку с отключенной этой функцией (используя по умолчанию *1011*BottomBarPage и удалив атрибут ExportRenderer), но это не решило проблему.Конечно, я также посмотрел в Интернете, чтобы увидеть, могу ли я сопоставить сообщение об ошибке с любой проблемой, с которой кто-либо мог столкнуться.Результаты казались довольно скудными и не особенно применимы к моему случаю: установите последнюю версию Xamarin.Forms (что мы не можем сделать в данный момент - кроме того, что работало на нашем частном сервере сборки) или выполните очистить и перестроить (я действительно пытался включить опцию Clean в нашей задаче Xamarin.Android, но безрезультатно).

Поэтому я продолжил сравнивать последний журнал сборки из TFSс недавним из VSTS, чтобы увидеть, смогу ли я найти какое-либо существенное отличие.Это оказалось довольно сложно, поскольку выходные данные между двумя определениями сборки заметно различаются.Внешне они оба выглядят одинаково, хотя выполняют одни и те же задачи.Однако я заметил, что наш собственный сервер сборки Mac использует более новые версии инструментов MS Build и Android Build Tools, чем VSTS Hosted Mac (15.6.0.0 против 15.4.0.0 и 27.0.1 против 23.0.0 соответственно), поэтому ярешил изменить среду сборки, так как, похоже, нет никакого способа повлиять на эти части среды сборки, и будет использоваться самая высокая установленная версия Инструментов сборки Android, если ни один из них явно не указан (согласно * 1023).* Запуск на VS2017, размещенный сейчас, по крайней мере, дает мне Android Build Tools версии 27.0.3. Кстати, JDK-версия одинакова во всех средах.

С переключателем в среде сборки также не разрешаетсяЗатем я попытался сделать следующее:

  • Отключил AOT-компиляцию - хотя сравнение журнала показало, что в основном отличались идентификаторы и уровни сжатия / конечные размеры файлов.
  • Провереночто я отменил выбор использования общей среды выполнения (как предложено здесь ) и что оба "Для компиляции выбраны архитектуры armeabi "и" armeabi-v7a "(как предложено здесь ).
  • Переключено с использования задачи сборки Xamarin.Android на использование сценария оболочки, который был у менясозданный для нашей локальной TFS, поскольку у агента последнего отсутствовала возможность Xamarin.Android, а сценарий был задуман как обходной путь.
  • Сравнил список ресурсов Android, представленных в журнале, как включенный всборка, которая была равна.
  • Сравнил список промежуточных сборок, зарегистрированных обоими журналами сборки как упакованные, и обнаружил, что они более или менее равны (с новой сборкой VSTS, добавляющей незнакомую Mono.Data.Tds.dll - иSystem.Runtime.InteropServices.RuntimeInformation.dll -assemblies).
  • Выполнено сравнение копируемых файлов по каждому проекту, о которых сообщалось в журналах сборки, - что я нашел малопригодным, поскольку считал дополнительные сборки и файлы, о которых сообщает VSTS, безвредными, но в противном случае не могу оценить влияние файлов, о которых сообщилиTFS, но не сообщается VSTS (другими словами, я не уверен в информативности сравнения списков скопированных файлов).
  • Проверен список файлов, о которых оба журнала сообщили как подписанные, так и zip-файлы.выровнен (конфигурация между TFS и VSTS полностью одинакова, поэтому в моем исследовании этой задаче уделялось мало внимания).
  • Сделал сборку на VSTS из той же ветки и зафиксировал как последнюю известную рабочую.сделанный на TFS и сравнивший их с помощью инструмента Android APK APK анализа / сравнения пакетов.

Только последнее - сравнение пакетов - я нашел информативным, но о чем я не знаю.То есть можно ожидать, что пакеты, содержащие точно такой же код и файлы ресурсов, будут иметь небольшую разницу между ними, за исключением, возможно, номеров версий в Android-манифесте.И действительно, это то, что я вижу для активов и ресурсов.Однако существенно (по крайней мере, на мой взгляд) файлы META-INF, lib, classes.dex, assemblies и typemap отличаются по размеру.Мне непонятно, что это значит, хотя ...

Теперь, примерно через 1,5 дня, единственным многообещающим результатом на данный момент является еще один пост здесь, на Переполнении стека, который, кажется, описывает то же самоесимптомов, которые мы испытываем, но сообщает о другом сообщении об исключении в их logcat.Однако разрешение не было опубликовано.


Редактировать 1

Одна вещь, которую я заметил только сейчас, когда сравнивал манифест Android между сборками, сделанными на TFS, и сборками на VSTS, эточто следующие метаданные отсутствуют в узле application при сборке на VSTS (но присутствуют в локальных [debug-] сборках):

<meta-data
    android:name="android.support.VERSION"
    android:value="26.1.0" />

Я не уверен, чтоПакет добавляет этот узел и то, что он делает, но чувствую, что он может быть значительным, и будет исследовать это дальше.


Редактировать 2

После долгого дня разочарования, пробующего все видыразличных комбинаций библиотек (некоторые из которых, по-видимому, не хотят устанавливаться в проектах .NetStandard, которые VS2017 создает для мобильных приложений по умолчанию вместо старой PCL), мне удалось сузить место вышеупомянутой записи в Android-манифесте.исходит из: по-видимому, это то, что добавили библиотеки поддержки Xamarin Android версии 26.1.0.Оказывается, одна из библиотек поддержки Xamarin Android, на которую есть ссылка в CS-project-файле одного из трех проектов Android, используемых нашим приложением, все еще указывала на старую версию 26.1.0.1, тогда как все остальныессылки были обновлены до 27.0.2.Изменение этой записи вручную гарантировало исчезновение записи в Android-манифесте.Это, однако, к сожалению, не решило наши проблемы со сборкой с Android-версией нашего приложения ...


Edit 3

Построение на размещенной среде VS2017 теперь приводит кследующие сообщения об исключениях:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(2374):C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(2374,3): Error : error XA5101: Missing Android NDK toolchains directory '\toolchains'. Please install the Android NDK. at Xamarin.Android.Tasks.NdkUtil.GetNdkToolchainDirectories(String toolchainsPath, AndroidTargetArch arch) at Xamarin.Android.Tasks.NdkUtil.GetNdkToolchainPath(String androidNdkPath, AndroidTargetArch arch) at Xamarin.Android.Tasks.NdkUtil.GetNdkTool(String androidNdkPath, AndroidTargetArch arch, String tool) at Xamarin.Android.Tasks.NdkUtil.GetNdkToolPrefix(String androidNdkPath, AndroidTargetArch arch) at Xamarin.Android.Tasks.Aot.<GetAotConfigs>d__73.MoveNext() at System.Collections.Concurrent.Partitioner.DynamicPartitionerForIEnumerable`1.InternalPartitionEnumerable.GrabChunk_Buffered(KeyValuePair`2[] destArray, Int32 requestedChunkSize, Int32& actualNumElementsGrabbed) at System.Collections.Concurrent.Partitioner.DynamicPartitionerForIEnumerable`1.InternalPartitionEnumerator.GrabNextChunk(Int32 requestedChunkSize) at System.Collections.Concurrent.Partitioner.DynamicPartitionEnumerator_Abstract`2.MoveNext() at System.Threading.Tasks.Parallel.<>c__DisplayClass42_0`2.<PartitionerForEachWorker>b__1() at System.Threading.Tasks.Task.InnerInvoke() at System.Threading.Tasks.Task.InnerInvokeWithArg(Task childTask) at System.Threading.Tasks.Task.<>c__DisplayClass176_0.<ExecuteSelfReplicating>b__0(Object )
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(2374):C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(2374,3): Error XA3001: System.AggregateException: One or more errors occurred. ---> System.AggregateException: One or more errors occurred. ---> Java.Interop.Tools.Diagnostics.XamarinAndroidException: error XA5101: Missing Android NDK toolchains directory '\toolchains'. Please install the Android NDK. at Xamarin.Android.Tasks.NdkUtil.GetNdkToolchainDirectories(String toolchainsPath, AndroidTargetArch arch) at Xamarin.Android.Tasks.NdkUtil.GetNdkToolchainPath(String androidNdkPath, AndroidTargetArch arch) at Xamarin.Android.Tasks.NdkUtil.GetNdkTool(String androidNdkPath, AndroidTargetArch arch, String tool) at Xamarin.Android.Tasks.NdkUtil.GetNdkToolPrefix(String androidNdkPath, AndroidTargetArch arch) at Xamarin.Android.Tasks.Aot.<GetAotConfigs>d__73.MoveNext() at System.Collections.Concurrent.Partitioner.DynamicPartitionerForIEnumerable`1.InternalPartitionEnumerable.GrabChunk_Buffered(KeyValuePair`2[] destArray, Int32 requestedChunkSize, Int32& actualNumElementsGrabbed) at System.Collections.Concurrent.Partitioner.DynamicPartitionerForIEnumerable`1.InternalPartitionEnumerator.GrabNextChunk(Int32 requestedChunkSize) at System.Collections.Concurrent.Partitioner.DynamicPartitionEnumerator_Abstract`2.MoveNext() at System.Threading.Tasks.Parallel.<>c__DisplayClass42_0`2.<PartitionerForEachWorker>b__1() at System.Threading.Tasks.Task.InnerInvoke() at System.Threading.Tasks.Task.InnerInvokeWithArg(Task childTask) at System.Threading.Tasks.Task.<>c__DisplayClass176_0.<ExecuteSelfReplicating>b__0(Object ) --- End of inner exception stack trace --- at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) at System.Threading.Tasks.Task.Wait() at System.Threading.Tasks.Parallel.PartitionerForEachWorker[TSource,TLocal](Partitioner`1 source, ParallelOptions parallelOptions, Action`1 simpleBody, Action`2 bodyWithState, Action`3 bodyWithStateAndIndex, Func`4 bodyWithStateAndLocal, Func`5 bodyWithEverything, Func`1 localInit, Action`1 localFinally) at System.Threading.Tasks.Parallel.ForEachWorker[TSource,TLocal](IEnumerable`1 source, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Action`3 bodyWithStateAndIndex, Func`4 bodyWithStateAndLocal, Func`5 bodyWithEverything, Func`1 localInit, Action`1 localFinally) at System.Threading.Tasks.Parallel.ForEach[TSource](IEnumerable`1 source, ParallelOptions parallelOptions, Action`1 body) at Xamarin.Android.Tasks.Aot.RunParallelAotCompiler(List`1 nativeLibs) at Xamarin.Android.Tasks.Aot.<>c__DisplayClass71_0.<DoExecute>b__0() at System.Threading.Tasks.Task`1.InnerInvoke() at System.Threading.Tasks.Task.Execute() --- End of inner exception stack trace --- at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) at System.Threading.Tasks.Task`1.get_Result() at Xamarin.Android.Tasks.Aot.DoExecute() at Xamarin.Android.Tasks.Aot.Execute() ---> (Inner Exception #0) System.AggregateException: One or more errors occurred. ---> Java.Interop.Tools.Diagnostics.XamarinAndroidException: error XA5101: Missing Android NDK toolchains directory '\toolchains'. Please install the Android NDK. at Xamarin.Android.Tasks.NdkUtil.GetNdkToolchainDirectories(String toolchainsPath, AndroidTargetArch arch) at Xamarin.Android.Tasks.NdkUtil.GetNdkToolchainPath(String androidNdkPath, AndroidTargetArch arch) at Xamarin.Android.Tasks.NdkUtil.GetNdkTool(String androidNdkPath, AndroidTargetArch arch, String tool) at Xamarin.Android.Tasks.NdkUtil.GetNdkToolPrefix(String androidNdkPath, AndroidTargetArch arch) at Xamarin.Android.Tasks.Aot.<GetAotConfigs>d__73.MoveNext() at System.Collections.Concurrent.Partitioner.DynamicPartitionerForIEnumerable`1.InternalPartitionEnumerable.GrabChunk_Buffered(KeyValuePair`2[] destArray, Int32 requestedChunkSize, Int32& actualNumElementsGrabbed) at System.Collections.Concurrent.Partitioner.DynamicPartitionerForIEnumerable`1.InternalPartitionEnumerator.GrabNextChunk(Int32 requestedChunkSize) at System.Collections.Concurrent.Partitioner.DynamicPartitionEnumerator_Abstract`2.MoveNext() at System.Threading.Tasks.Parallel.<>c__DisplayClass42_0`2.<PartitionerForEachWorker>b__1() at System.Threading.Tasks.Task.InnerInvoke() at System.Threading.Tasks.Task.InnerInvokeWithArg(Task childTask) at System.Threading.Tasks.Task.<>c__DisplayClass176_0.<ExecuteSelfReplicating>b__0(Object ) --- End of inner exception stack trace --- at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) at System.Threading.Tasks.Task.Wait() at System.Threading.Tasks.Parallel.PartitionerForEachWorker[TSource,TLocal](Partitioner`1 source, ParallelOptions parallelOptions, Action`1 simpleBody, Action`2 bodyWithState, Action`3 bodyWithStateAndIndex, Func`4 bodyWithStateAndLocal, Func`5 bodyWithEverything, Func`1 localInit, Action`1 localFinally) at System.Threading.Tasks.Parallel.ForEachWorker[TSource,TLocal](IEnumerable`1 source, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Action`3 bodyWithStateAndIndex, Func`4 bodyWithStateAndLocal, Func`5 bodyWithEverything, Func`1 localInit, Action`1 localFinally) at System.Threading.Tasks.Parallel.ForEach[TSource](IEnumerable`1 source, ParallelOptions parallelOptions, Action`1 body) at Xamarin.Android.Tasks.Aot.RunParallelAotCompiler(List`1 nativeLibs) at Xamarin.Android.Tasks.Aot.<>c__DisplayClass71_0.<DoExecute>b__0() at System.Threading.Tasks.Task`1.InnerInvoke() at System.Threading.Tasks.Task.Execute() ---> (Inner Exception #0) Java.Interop.Tools.Diagnostics.XamarinAndroidException: error XA5101: Missing Android NDK toolchains directory '\toolchains'. Please install the Android NDK. at Xamarin.Android.Tasks.NdkUtil.GetNdkToolchainDirectories(String toolchainsPath, AndroidTargetArch arch) at Xamarin.Android.Tasks.NdkUtil.GetNdkToolchainPath(String androidNdkPath, AndroidTargetArch arch) at Xamarin.Android.Tasks.NdkUtil.GetNdkTool(String androidNdkPath, AndroidTargetArch arch, String tool) at Xamarin.Android.Tasks.NdkUtil.GetNdkToolPrefix(String androidNdkPath, AndroidTargetArch arch) at Xamarin.Android.Tasks.Aot.<GetAotConfigs>d__73.MoveNext() at System.Collections.Concurrent.Partitioner.DynamicPartitionerForIEnumerable`1.InternalPartitionEnumerable.GrabChunk_Buffered(KeyValuePair`2[] destArray, Int32 requestedChunkSize, Int32& actualNumElementsGrabbed) at System.Collections.Concurrent.Partitioner.DynamicPartitionerForIEnumerable`1.InternalPartitionEnumerator.GrabNextChunk(Int32 requestedChunkSize) at System.Collections.Concurrent.Partitioner.DynamicPartitionEnumerator_Abstract`2.MoveNext() at System.Threading.Tasks.Parallel.<>c__DisplayClass42_0`2.<PartitionerForEachWorker>b__1() at System.Threading.Tasks.Task.InnerInvoke() at System.Threading.Tasks.Task.InnerInvokeWithArg(Task childTask) at System.Threading.Tasks.Task.<>c__DisplayClass176_0.<ExecuteSelfReplicating>b__0(Object )<--- <--- 
Process 'msbuild.exe' exited with code '1'.

Я не пользуюсь (насколько мне известно) Android NDK, поэтому не совсем понимаю, почему я получаю это сообщение об исключении сейчас.Тем не менее, среда Mac на VSTS, похоже, не испытывает этих проблем (пока), поэтому я переключаюсь обратно на сборку на Mac.


Edit 4

Сделал поиски, по-видимому, вышеупомянутые сообщения об исключениях происходят из-за недавно возникших проблем с автоматическим обновлением Visual Studio с версии 15.6 до версии 15.7 ( source ).Всегда приятно видеть, как эти вещи проверяются по всему миру.


Редактировать 5

Итак, вот еще несколько вещей, которые я пробовал со времени последнего обновления: явная установка JDK-версии, используемой Xamarin.Android, на версия 8 и архитектура JDK на x64 (как описано здесь );и удаление всех пользовательских средств визуализации для Android, поскольку исходное исключение, похоже, указывает на VisualElementRenderer<TElement>, который является базовым классом почти для всех (если не всех) по умолчанию и пользовательских средств визуализации.Однако все это безрезультатно, так что я подозреваю, что выброшенное исключение происходит из самого Xamarin.Forms.


Edit 6

Мы наконец-то попытались добавить Mac, который мы используем длянаш внутренний поток сборки в TFS как частный агент сборки для VSTS сегодня, что было удивительно легко сделать!Нам даже не нужно было менять конфигурацию нашего брандмауэра, так как кажется, что агент устанавливает соединение с сервером (через HTTP и HTTPS), а не наоборот (мы выполнили шаги, описанные здесь ).Я хотел бы, чтобы все установки были такими простыми!

Несмотря на легкость, с которой мы настраивали нашего частного агента сборки, мы все равно испытывали тот же сбой после сборок, независимо от того, собирались ли мы с помощью задачи сборки Xamarin.Android илинаш пользовательский скрипт сборки (который мы ранее успешно использовали на той же машине из TFS).

В конечном итоге мы столкнулись с решением, выполнив предложение, сделанное здесь ,однако что-то, что казалось чем-то не связанным и не относящимся к делу раньше.Тем не менее, так как я по совпадению только за день до этого обновил версию нашего Xamarin.Forms с версии 2.5.1.444934 до версии 2.5.1.527436, я решил попробовать запустить сборку с этим кодом.Который оказался на работу!Хотя я понятия не имею, почему ... Но я думаю, это менее актуально, чем возможность строить заново!

1 Ответ

0 голосов
/ 14 июня 2018

Как оказалось, обновление Xamarin.Forms является решением .

Хотя предлагается в качестве разрешения той же ошибки, что и у нас на форумах Xamarin , ичто-то, с чем я сталкивался раньше, возраст поста и старая версия Xamarin. Из-за форм, которые я использовал, я проигнорировал этот вариант как менее актуальный для нашей проблемы.Что не помогло, так это то, что я думал, что мы уже работали с самой высокой версией Xamarin.Forms 2.5.1 и еще не совсем готовы перейти на Xamarin.Forms 3.0.Вчера, однако, я обнаружил, что все еще есть ревизия, которую мы могли бы обновить в ветке 2.5.1, что я и сделал.Когда я тогда попробовал выполнить сборку с этим кодом, неожиданно получился APK, работающий без проблем!

Однако причина, по которой обновление Xamarin.Forms работает, нам неясна.Однако мы заметили, что эта конкретная версия Xamarin.Forms 2.5.1.527436 была выпущена примерно за неделю до того, как я перенес определение нашей сборки из TFS в VSTS.Поэтому может быть, что здесь есть некоторая корреляция.


Edit 1

Сегодня возникли проблемы с Xamarin.Forms 2.5.1.527436, что в итоге привело меня к наиболее вероятной причине.для наших проблем при создании Android-сборки нашего приложения.То есть, чтобы разрешить сбой, вызванный Xamarin.Forms, я попытался вернуть Forms к последней версии, которая, как я знал, все еще работала.Однако проблема с Xamarin.Forms сохранялась даже после понижения.Это побудило меня проверить файлы проекта и сравнить рабочую версию приложения с версией, которая была понижена, но все же должна была закончиться тем же, несмотря на это.

Как выяснилось некоторые файлы проекта имелиссылки на две разные версии Xamarin.Forms : ту, которую я намеревался использовать, и ту, которую мы использовали до этого.Теперь эта смесь не вызывала никаких проблем при работе на локальном компьютере разработчика, поскольку на этом компьютере были бы установлены как старые, так и новые версии Xamarin.Forms и, следовательно, отсутствовали бы отсутствующие сборки.Тем не менее, я могу себе представить, что это не будет иметь место при запуске VSTS-сборки на сервере сборки.Более того, оба файла проекта, содержащие неверные ссылки на сборки, были проектами Android - и это объясняет, почему у iOS не было проблем со сборкой ...!

...