Советы по устранению неполадокTroubleshooting Tips

Получение диагностических сведенийGetting Diagnostic Information

Xamarin.Android есть несколько мест для поиска при различных ошибок.Xamarin.Android has a few places to look when tracking down various bugs. Сюда входит следующее.These include:

  1. Вывод диагностики MSBuild.Diagnostic MSBuild output.
  2. Журналы развертывания устройства.Device deployment logs.
  3. Выходные данные журнала для отладки Android.Android Debug Log Output.

Вывод диагностики MSBuildDiagnostic MSBuild Output

Диагностики MSBuild может содержать дополнительные сведения, относящиеся к построение пакета и может содержать некоторые сведения о развертывании пакета.Diagnostic MSBuild can contain additional information relating to package building and may contain some package deployment information.

Чтобы включить вывод диагностики MSBuild в Visual Studio, выполните следующие действия:To enable diagnostic MSBuild output within Visual Studio:

  1. Нажмите кнопку Сервис > Параметры...Click Tools > Options...
  2. В представлении дерева слева, выберите проекты и решения > сборка и запускIn the left-hand tree view, select Projects and Solutions > Build and Run
  3. На панели справа равным раскрывающемся списке детализации выходных данных сборки MSBuild диагностикиIn the right-hand panel, set the MSBuild build output verbosity dropdown to Diagnostic
  4. Нажмите кнопку ОК.Click OK
  5. Выполните очистку и перестройку пакета.Clean and rebuild your package.
  6. Диагностические выходные данные отображается в панели «Вывод».Diagnostic output is visible within the Output panel.

Чтобы включить вывод диагностики MSBuild в Visual Studio для Mac/OS X:To enable diagnostic MSBuild output within Visual Studio for Mac/OS X:

  1. Нажмите кнопку Visual Studio для Mac > Параметры...Click Visual Studio for Mac > Preferences...
  2. В представлении дерева слева, выберите проектов > построенияIn the left-hand tree view, select Projects > Build
  3. На панели справа уровень детализации журнала раскрывающегося списка для диагностикиIn the right-hand panel, set the Log verbosity drop-down to Diagnostic
  4. Нажмите кнопку ОК.Click OK
  5. Перезапустите Visual Studio для Mac.Restart Visual Studio for Mac
  6. Выполните очистку и перестройку пакета.Clean and rebuild your package.
  7. Диагностические выходные данные отображается на панели ошибок (представление > панели > ошибки ), нажав кнопку выходных данных сборки.Diagnostic output is visible within the Errors Pad (View > Pads > Errors ), by clicking the Build Output button.

Журналы развертывания устройствDevice Deployment Logs

Включение ведения журнала развертывания устройства в среде Visual Studio.To enable device deployment logging within Visual Studio:

  1. Сервис > Параметры...>Tools > Options...>
  2. В представлении дерева слева, выберите Xamarin > Параметры AndroidIn the left-hand tree view, select Xamarin > Android Settings
  3. На панели справа, включить [X] ведение журнала отладки расширений (файл monodroid.log на рабочий стол) "флажок".In the right-hand panel, enable the [X] extension debug logging (writes monodroid.log to your desktop) check box.
  4. Сообщения заносятся в файл monodroid.log на рабочем столе.Log messages are written to the monodroid.log file on your desktop.

Visual Studio для Mac всегда записывает журналы развертывания устройства.Visual Studio for Mac always writes device deployment logs. Поиск их немного сложнее; AndroidUtils файл журнала создается для каждого дня + время развертывания происходит, например: AndroidTools-2012-10-24_12-35-45.log.FInding them is slightly more difficult; a AndroidUtils log file is created for every day + time that a deployment occurs, for example: AndroidTools-2012-10-24_12-35-45.log.

  • В Windows, файлы журналов записываются в %LOCALAPPDATA%\XamarinStudio-{VERSION}\Logs.On Windows, log files are written to %LOCALAPPDATA%\XamarinStudio-{VERSION}\Logs.
  • В OS X, файлы журналов записываются в $HOME/Library/Logs/XamarinStudio-{VERSION}.On OS X, log files are written to $HOME/Library/Logs/XamarinStudio-{VERSION}.

Выходные данные журнала для отладки AndroidAndroid Debug Log Output

Android будет записывать много сообщений для Android журнал отладки.Android will write many messages to the Android Debug Log. Xamarin.Android использует системные свойства Android для управления созданием дополнительных сообщений в журнал отладки Android.Xamarin.Android uses Android system properties to control the generation of additional messages to the Android Debug Log. Системные свойства Android можно задать с помощью setprop команду в пределах Android Debug Bridge (adb):Android system properties can be set through the setprop command within the Android Debug Bridge (adb):

adb shell setprop PROPERTY_NAME PROPERTY_VALUE

Системные свойства считываются во время запуска процесса, а следовательно, должен быть либо задать прежде чем запустить приложение или приложение необходимо перезапустить после изменения свойства системы.System properties are read during process startup, and thus must be either set before the application is launched or the application must be restarted after the system properties are changed.

Системные свойства Xamarin.AndroidXamarin.Android System Properties

Xamarin.Android поддерживает следующие системные свойства:Xamarin.Android supports the following system properties:

  • Debug.Mono.Debug: Если строка не пустой, это эквивалентно *mono-debug*.debug.mono.debug: If a non-empty string, this is equivalent to *mono-debug*.

  • Debug.Mono.env: Отделенный вертикальной чертой ("|") список переменных среды для экспорта во время запуска приложения перед mono была инициализирована.debug.mono.env: A pipe-separated ('|') list of environment variables to export during application startup, before mono has been initialized. Таким образом, задание переменных среды, управляющих mono ведением журнала.This allows setting environment variables that control mono logging.

    • Примечание. Так как значение "|"-запятыми, значение должно содержать дополнительный уровень заключения в кавычки, как ` оболочки adb ` команды приведет к удалению парные кавычки.Note: Since the value is '|'-separated, the value must have an extra level of quoting, as the `adb shell` command will remove a set of quotes.

    • Примечание. Значения свойств системы Android не может превышать 92 символов в длину.Note: Android system property values can be no longer than 92 characters in length.

    • ПримерExample:

        adb shell setprop debug.mono.env "'MONO_LOG_LEVEL=info|MONO_LOG_MASK=asm'"
      
  • Debug.Mono.log: Разделенный запятыми (",") список компонентов, которые должна вывести дополнительные сообщения в журнал отладки Android.debug.mono.log: A comma-separated (',') list of components that should print additional messages to the Android Debug Log. По умолчанию имеет значение nothing.By default, nothing is set. Компоненты:Components include:

    • все: Печать всех сообщенийall: Print all messages
    • сборщик мусора: Печать сообщений о сборки Мусора.gc: Print GC-related messages.
    • gref, установленное: Печать сообщений выделение и освобождение ссылки (слабыми, глобальные).gref: Print (weak, global) reference allocation and deallocation messages.
    • lref: Печать выделение и освобождение сообщений локальной ссылки.lref: Print local reference allocation and deallocation messages.

    Примечание: это чрезвычайно verbose.Note: these are extremely verbose. Не следует включать, если вам действительно нужно.Do not enable unless you really need to.

  • Debug.Mono.Trace: Позволяет задавать mono--трассировки =PROPERTY_VALUE параметр.debug.mono.trace: Allows setting the mono --trace=PROPERTY_VALUE setting.

Xamarin.Android не удается разрешить System.ValueTupleXamarin.Android cannot resolve System.ValueTuple

Эта ошибка возникает из-за несовместимости с помощью Visual Studio.This error occurs due to an incompatibility with Visual Studio.

  • Visual Studio 2017 с обновлением 1 (версия 15.1 или более ранней версии) совместима только с System.ValueTuple NuGet 4.3.0 (или более ранней версии).Visual Studio 2017 Update 1 (version 15.1 or older) is only compatible with the System.ValueTuple NuGet 4.3.0 (or older).

  • Visual Studio 2017 с обновлением 2 (версия 15.2 или более поздней версии) совместима только с System.ValueTuple NuGet 4.3.1 (или более поздней версии).Visual Studio 2017 Update 2 (version 15.2 or newer) is only compatible with the System.ValueTuple NuGet 4.3.1 (or newer).

Выберите правильный System.ValueTuple NuGet, которая соответствует вашей установки Visual Studio 2017.Please choose the correct System.ValueTuple NuGet that corresponds with your Visual Studio 2017 installation.

Сборщик Мусора сообщенийGC Messages

Сообщения компонента глобального Каталога можно просмотреть, задав системное свойство debug.mono.log значение, которое содержит сборки мусора.GC component messages can be viewed by setting the debug.mono.log system property to a value that contains gc.

Сборщик Мусора сообщения создаются в том случае, если сборщик Мусора выполняет и предоставляет сведения о том, какая работа сборка Мусора была:GC messages are generated whenever the GC executes and provides information about how much work the GC did:

I/monodroid-gc(12331): GC cleanup summary: 81 objects tested - resurrecting 21.

Дополнительные сведения о сборке Мусора, такие как сведения о времени может формироваться путем настройки MONO_LOG_LEVEL переменную среды, чтобы debug:Additional GC information such as timing information can be generated by setting the MONO_LOG_LEVEL environment variable to debug:

adb shell setprop debug.mono.env MONO_LOG_LEVEL=debug

В результате (и даже) Дополнительные Mono сообщения, включая этих трех последствий:This will result in (lots of) additional Mono messages, including these three of consequence:

D/Mono (15723): GC_BRIDGE num-objects 1 num_hash_entries 81226 sccs size 81223 init 0.00ms df1 285.36ms sort 38.56ms dfs2 50.04ms setup-cb 9.95ms free-data 106.54ms user-cb 20.12ms clenanup 0.05ms links 5523436/5523436/5523096/1 dfs passes 1104 6883/11046605
D/Mono (15723): GC_MINOR: (Nursery full) pause 2.01ms, total 287.45ms, bridge 225.60 promoted 0K major 325184K los 1816K
D/Mono ( 2073): GC_MAJOR: (user request) pause 2.17ms, total 2.47ms, bridge 28.77 major 576K/576K los 0K/16K

В GC_BRIDGE сообщение, num-objects — количество объектов моста, рассматривает этот этап и num_hash_entries — количество объектов, обработанных при данном вызове кода моста.In the GC_BRIDGE message, num-objects is the number of bridge objects this pass is considering, and num_hash_entries is the number of objects processed during this invocation of the bridge code.

В GC_MINOR и GC_MAJOR сообщений, total — это количество времени, во время приостановки мира (потоки не выполняются), хотя bridge — количество времени, затраченное в bridge, обработки кода (что имеет дело с виртуальной Машиной Java).In the GC_MINOR and GC_MAJOR messages, total is the amount of time while the world is paused (no threads are executing), while bridge is the amount of time taken in the bridge processing code (which deals with the Java VM). Мир не приостановлена в процессе обработки моста.The world is not paused while bridge processing occurs.

В целом, чем больше значение num_hash_entries, больше времени, bridge вступят в коллекции и тем больше total будет время, затраченное на сбор.In general, the larger the value of num_hash_entries, the more time that the bridge collections will take, and the larger the total time spent collecting will be.

Сообщений глобальной ссылкиGlobal Reference Messages

Чтобы включить ведение журнала, глобальной ссылки loggig (gref, Установленное) debug.mono.log системное свойство должно содержать gref, установленное, например:To enable Global Reference loggig (GREF) logging, the debug.mono.log system property must contain gref, e.g.:

adb shell setprop debug.mono.log gref

Xamarin.Android использует Android глобальные ссылки для обеспечения сопоставления между экземплярами Java и связанных управляемых экземпляров, как при вызове метода Java экземпляр Java необходимо указать для Java.Xamarin.Android uses Android global references to provide mappings between Java instances and the associated managed instances, as when invoking a Java method a Java instance needs to be provided to Java.

Эмуляторы Android, к сожалению, разрешить только 2000 глобальные ссылки должны существовать во время.Unfortunately, Android emulators only allow 2000 global references to exist at a time. Оборудование ограничен гораздо выше 52000 глобальной ссылки.Hardware has a much higher limit of 52000 global references. Нижний предел может быть проблематичным, когда выполнение приложения в эмуляторе, поэтому важно знать, где правильных экземпляр из может быть очень полезно.The lower limit can be problematic when running applications on the emulator, so knowing where the instance came from can be very useful.

Примечание: глобальный счетчик является внутренним для Xamarin.Android и не учитывает (и не может включают глобальные ссылки, выполняемое другие собственные библиотеки, загружаемые в процесс.Note: the global reference count is internal to Xamarin.Android, and does not (and cannot) include global references taken out by other native libraries loaded into the process. Используйте глобальный счетчик для оценки.Use the global reference count as an estimate.

I/monodroid-gref(12405): +g+ grefc 108 gwrefc 0 obj-handle 0x40517468/L -> new-handle 0x40517468/L from    at Java.Lang.Object.RegisterInstance(IJavaObject instance, IntPtr value, JniHandleOwnership transfer)
I/monodroid-gref(12405):    at Java.Lang.Object.SetHandle(IntPtr value, JniHandleOwnership transfer)
I/monodroid-gref(12405):    at Java.Lang.Object..ctor(IntPtr handle, JniHandleOwnership transfer)
I/monodroid-gref(12405):    at Java.Lang.Thread+RunnableImplementor..ctor(System.Action handler, Boolean removable)
I/monodroid-gref(12405):    at Java.Lang.Thread+RunnableImplementor..ctor(System.Action handler)
I/monodroid-gref(12405):    at Android.App.Activity.RunOnUiThread(System.Action action)
I/monodroid-gref(12405):    at Mono.Samples.Hello.HelloActivity.UseLotsOfMemory(Android.Widget.TextView textview)
I/monodroid-gref(12405):    at Mono.Samples.Hello.HelloActivity.<OnCreate>m__3(System.Object o)
I/monodroid-gref(12405): handle 0x40517468; key_handle 0x40517468: Java Type: `mono/java/lang/RunnableImplementor`; MCW type: `Java.Lang.Thread+RunnableImplementor`
I/monodroid-gref(12405): Disposing handle 0x40517468
I/monodroid-gref(12405): -g- grefc 107 gwrefc 0 handle 0x40517468/L from    at Java.Lang.Object.Dispose(System.Object instance, IntPtr handle, IntPtr key_handle, JObjectRefType handle_type)
I/monodroid-gref(12405):    at Java.Lang.Object.Dispose()
I/monodroid-gref(12405):    at Java.Lang.Thread+RunnableImplementor.Run()
I/monodroid-gref(12405):    at Java.Lang.IRunnableInvoker.n_Run(IntPtr jnienv, IntPtr native__this)
I/monodroid-gref(12405):    at System.Object.c200fe6f-ac33-441b-a3a0-47659e3f6750(IntPtr , IntPtr )
I/monodroid-gref(27679): +w+ grefc 1916 gwrefc 296 obj-handle 0x406b2b98/G -> new-handle 0xde68f4bf/W from take_weak_global_ref_jni
I/monodroid-gref(27679): -w- grefc 1915 gwrefc 294 handle 0xde691aaf/W from take_global_ref_jni

Существует четыре сообщения последствий:There are four messages of consequence:

  • Создание глобальной ссылки: это строки, начинающиеся с + g + и предоставит трассировку стека для создания пути кода.Global reference creation: these are the lines that start with +g+ , and will provide a stack trace for the creating code path.
  • Уничтожение глобальной ссылки: это строки, начинающиеся с - g- и может предоставлять трассировку стека для удаления ссылки на глобальные пути кода.Global reference destruction: these are the lines that start with -g- , and may provide a stack trace for the code path disposing of the global reference. Если сборщик Мусора освобождение gref, установленное, будет предоставляться не выполняется трассировка стека.If the GC is disposing of the gref, no stack trace will be provided.
  • Слабая глобального ссылка создания: это строки, начинающиеся с + w + .Weak global reference creation: these are the lines that start with +w+ .
  • Слабая глобального ссылка уничтожения: это строки, начинающиеся с -w- .Weak global reference destruction: these are lines that start with -w- .

Во всех сообщениях grefc значение является счетчиком глобальные ссылки, создаваемые в Xamarin.Android, хотя grefwc значение является счетчиком слабые глобальные ссылки, создаваемые в Xamarin.Android.In all messages, The grefc value is the count of global references that Xamarin.Android has created, while the grefwc value is the count of weak global references that Xamarin.Android has created. Обрабатывать или obj дескриптор значение равно значение дескриптора JNI, а знак после " /" является типом значения дескриптора: /L для ссылки на местную, /G для глобального ссылок и /W для слабых ссылок на глобальный.The handle or obj-handle value is the JNI handle value, and the character after the ' /' is the type of handle value: /L for local reference, /G for global references, and /W for weak global references.

В рамках процесса сборки Мусора, глобальные ссылки (+ g +) преобразуются в слабые ссылки на глобальные (причиной "+" w + и - g-), запускается сборка Мусора на стороне Java и затем слабую ссылку на глобальный проверяется, чтобы см. в разделе, если они были собраны.As part of the GC process, global references (+g+) are converted into weak global references (causing a +w+ and -g-), a Java-side GC is kicked, and then the weak global reference is checked to see if it was collected. Если все еще существует, новый gref, установленное создается вокруг слабые ссылки (+ g +, -w-), в противном случае уничтожается слабые ссылки (-w).If it's still alive, a new gref is created around the weak ref (+g+, -w-), otherwise the weak ref is destroyed (-w).

Экземпляр Java и инкапсулируется MCWJava instance is created and wrapped by a MCW

I/monodroid-gref(27679): +g+ grefc 2211 gwrefc 0 obj-handle 0x4066df10/L -> new-handle 0x4066df10/L from ...
I/monodroid-gref(27679): handle 0x4066df10; key_handle 0x4066df10: Java Type: `android/graphics/drawable/TransitionDrawable`; MCW type: `Android.Graphics.Drawables.TransitionDrawable`

Сборка Мусора выполняется...A GC is being performed...

I/monodroid-gref(27679): +w+ grefc 1953 gwrefc 259 obj-handle 0x4066df10/G -> new-handle 0xde68f95f/W from take_weak_global_ref_jni
I/monodroid-gref(27679): -g- grefc 1952 gwrefc 259 handle 0x4066df10/G from take_weak_global_ref_jni

Объект существует, как дескриптор! = nullObject is still alive, as handle != null

wref преобразуются обратно в gref, установленноеwref turned back into a gref

I/monodroid-gref(27679): *try_take_global obj=0x4976f080 -> wref=0xde68f95f handle=0x4066df10
I/monodroid-gref(27679): +g+ grefc 1930 gwrefc 39 obj-handle 0xde68f95f/W -> new-handle 0x4066df10/G from take_global_ref_jni
I/monodroid-gref(27679): -w- grefc 1930 gwrefc 38 handle 0xde68f95f/W from take_global_ref_jni

Объект не существует, как дескриптор == nullObject is dead, as handle == null

wref является освобожденные, новые gref, установленное созданwref is freed, no new gref created

I/monodroid-gref(27679): *try_take_global obj=0x4976f080 -> wref=0xde68f95f handle=0x0
I/monodroid-gref(27679): -w- grefc 1914 gwrefc 296 handle 0xde68f95f/W from take_global_ref_jni

Имеется один «интересный» абсолютно здесь: для целевых объектов под управлением Android, предшествующей 4.0, gref, установленное значение равно на адрес объекта Java в памяти среды выполнения Android.There is one "interesting" wrinkle here: on targets running Android prior to 4.0, the gref value is equal to the address of the Java object in the Android runtime's memory. (То есть такое сборщик Мусора не перемещение, умеренная, сборщик, и его прочь прямые ссылки на эти объекты.) Таким образом после + g +, + w +, - g-, + g +, - w-последовательности, полученный gref, установленное будет иметь то же значение, что исходное значение gref, установленное.(That is, the GC is a non-moving, conservative, collector, and it's handing out direct references to those objects.) Thus after a +g+, +w+, -g-, +g+, -w- sequence, the resulting gref will have the same value as the original gref value. В результате grepping журналах довольно просто.This makes grepping through logs fairly straightforward.

Тем не менее, Android 4.0 имеет скользящего сборщика и больше не передает прямые ссылки на среды выполнения Android объекты виртуальной Машины.Android 4.0, however, has a moving collector and no longer hands out direct references to Android runtime VM objects. Следовательно, после + g +, + w +, - g-, + g +, - w-последовательности, gref, установленное значение будет отличаться.Consequently, after a +g+, +w+, -g-, +g+, -w- sequence, the gref value will be different. Если объект выдерживает его, несколько глобальных каталогов, вы перейдете по несколько значений gref, установленное, что усложняет для определения, где экземпляр был выделен из.If the object survives multiple GCs, it will go by several gref values, making it harder to determine where an instance was actually allocated from.

Запрос программным способомQuerying Programmatically

Вы можете запрашивать количество gref, Установленное и WREF, запросив JniRuntime объекта.You can query both the GREF and WREF counts by querying the JniRuntime object.

Java.Interop.JniRuntime.CurrentRuntime.GlobalReferenceCount — Глобальный счетчик ссылокJava.Interop.JniRuntime.CurrentRuntime.GlobalReferenceCount - Global Reference Count

Java.Interop.JniRuntime.CurrentRuntime.WeakGlobalReferenceCount -Счетчик слабых ссылокJava.Interop.JniRuntime.CurrentRuntime.WeakGlobalReferenceCount - Weak Reference Count

Журналы отладки AndroidAndroid Debug Logs

Android отладочный журналы могут предоставлять дополнительный контекст о любой ошибки времени выполнения, вы видите.The Android Debug Logs may provide additional context regarding any runtime errors you're seeing.

С плавающей запятой производительности ужасно!Floating-Point performance is terrible!

Кроме того «Мое приложение запускает 10 раз быстрее с отладочную сборку, чем с сборки выпуска!»Alternatively, "My app runs 10x faster with the Debug build than with the Release build!"

Xamarin.Android поддерживает несколько устройств ABI: armeabi, armeabi-v7a, и x86.Xamarin.Android supports multiple device ABIs: armeabi, armeabi-v7a, and x86. ABI устройства должно лежать в пределах свойства проекта > вкладка "приложения" > Поддерживаемые архитектуры.Device ABIs can be specified within Project Properties > Application tab > Supported architectures.

Отладочные сборки используйте пакет Android, который предоставляет все ABI и таким образом будет использовать самый быстрый интерфейс ABI для целевого устройства.Debug builds use an Android package which provides all ABIs, and thus will use the fastest ABI for the target device.

Сборки выпуска будет включать только ABI, выбранного на вкладке свойств проекта. Можно выбрать более одного.Release builds will only include the ABIs selected in the Project Properties tab. More than one can be selected.

armeabi используется по умолчанию ABI и имеет самую широкую поддержку устройств.armeabi is the default ABI, and has the broadest device support. Тем не менее, armeabi не поддерживает устройства с несколькими ЦП и оборудования с плавающей запятой, amont прочего.However, armeabi doesn't support multi-CPU devices and hardware floating-point, amont other things. Следовательно приложения, использование среды выполнения выпуска armeabi будут привязаны к единственному ядру и будет использоваться реализация soft-float.Consequently, apps using the armeabi Release runtime will be tied to a single core and will be using a soft-float implementation. Оба варианта может привести к значительно более низкую производительность для вашего приложения.Both of these can contribute to significantly slower performance for your app.

Если вашему приложению требуется неплохую производительность с плавающей запятой (например, игры), то следует включить armeabi-v7a ABI.If your app requires decent floating-point performance (e.g. games), you should enable the armeabi-v7a ABI. Вы можете поддерживать только armeabi-v7a среды выполнения, на то, что это означает, что старые устройства, которые поддерживают только armeabi не сможет запустить приложение.You may want to only support the armeabi-v7a runtime, though this means that older devices which only support armeabi will be unable to run your app.

Не удалось найти пакет SDK для AndroidCould not locate Android SDK

Доступны 2 файлы для скачивания из Google для Android Windows SDK для.There are 2 downloads available from Google for the Android SDK for Windows. Если установщик .exe, он будет записывать разделы реестра, которые сообщают Xamarin.Android, где он был установлен.If you choose the .exe installer, it will write registry keys that tell Xamarin.Android where it was installed. Если вы выберите ZIP-файл и распакуйте его, Xamarin.Android не знает, где искать SDK.If you choose the .zip file and unzip it yourself, Xamarin.Android does not know where to look for the SDK. Чтобы узнать Xamarin.Android, где находится пакет SDK в Visual Studio, выбрав Сервис > Параметры > Xamarin > Параметры Android:You can tell Xamarin.Android where the SDK is in Visual Studio by going to Tools > Options > Xamarin > Android Settings:

Расположение пакета SDK для Android в параметрах Xamarin AndroidAndroid SDK Location in Xamarin Android Settings

IDE не отображает целевое устройствоIDE does not display target device

Иногда будет пытаться развернуть приложение для устройства, но устройство, которое вы хотите развернуть на не отображается в диалоговом окне Выбор устройства.Sometimes you will attempt to deploy your application to a device, but the device you want to deploy to isn't shown in the Select Device dialog. Это может произойти, когда мост отладки Android решает отдохнуть.This can happen when the Android Debug Bridge decides to go on vacation.

Чтобы определить проблему, найдите программы adb, затем запустите:To diagnose this issue, find the adb program, then run:

adb devices

Если устройство не отображается, необходимо перезапустить сервер Android Debug Bridge так, что устройство можно найти:If your device isn't present, then you need to restart the Android Debug Bridge server so that your device can be found:

adb kill-server
adb start-server

Программное обеспечение для синхронизации HTC может препятствовать start сервер adb работать должным образом.HTC Sync software may prevent adb start-server from working properly. Если start сервер adb команды не распечатать какой порт, он начинается, закройте программное обеспечение для синхронизации HTC и повторите перезапускается сервер adb.If the adb start-server command doesn't print out which port it's starting on, please exit the HTC Sync software and try restarting the adb server.

Не удается запустить указанный исполняемый файл задачи «keytool»The specified task executable "keytool" could not be run

Это означает, что путь не содержит каталог, где находится каталог bin пакета SDK для Java.This means that your PATH does not contain the directory where the Java SDK's bin directory is located. Проверьте, что вы выполнили эти действия из установки руководства.Check that you followed those steps from the Installation guide.

monodroid.exe или aresgen.exe завершил работу с кодом 1monodroid.exe or aresgen.exe exited with code 1

Для решения этой проблемы, перейти в Visual Studio и изменить уровень детализации MSBuild, чтобы сделать это, выберите: Сервис > Параметры > проекта и решений > построения и запуска > уровень детализации выходных данных сборки проекта MSBuild и это значение равно обычный.To help you debug this problem, go into Visual Studio and change the MSBuild verbosity level, to do this, select: Tools > Options > Project and Solutions > Build and Run > MSBuild Project Build Output Verbosity and set this value to Normal.

Перестроить и проверьте области вывода Visual Studio, которое должно содержать полные сведения об ошибке.Rebuild, and check Visual Studio's Output pane, which should contain the full error.

Не хватает места хранения на устройстве для развертывания пакетаThere is not enough storage space on the device to deploy the package

Это происходит, когда не запустить эмулятор из среды Visual Studio.This occurs when you don't start the emulator from within Visual Studio. При запуске эмулятора вне Visual Studio, необходимо передать -partition-size 512 параметры, напримерWhen starting the emulator outside of Visual Studio, you need to pass the -partition-size 512 options, e.g.

emulator -partition-size 512 -avd MonoDroid

Убедитесь, т. е. При использовании имени правильный симулятор имя, используемое при настройке имитатор.Ensure you use the correct simulator name, i.e. the name you used when configuring the simulator.

Установка_FAILED_НЕДОПУСТИМЫЙ_APK, при установке пакетаINSTALL_FAILED_INVALID_APK when installing a package

Имена пакетов Android необходимо , содержат точку (".").Android package names must contain a period ('.'). Измените имя пакета, чтобы оно содержит точку.Edit your package name so that it contains a period.

  • В Visual Studio:Within Visual Studio:
    • Щелкните правой кнопкой мыши проект > СвойстваRight click your project > Properties
    • Перейдите на вкладку манифеста Android, в левой части.Click the Android Manifest tab on the left.
    • Обновите поле имени пакета.Update the Package name field.
      • Если вы видите сообщение “AndroidManifest.xml не найден.If you see the message “No AndroidManifest.xml found. Щелкните, чтобы добавить его. ”, щелкните ссылку и затем обновите поле имени пакета.Click to add one.”, click the link and then update the Package name field.
  • В Visual Studio для Mac:Within Visual Studio for Mac:
    • Щелкните правой кнопкой мыши проект > Параметры.Right click your project > Options.
    • Перейти к сборке и раздел приложения Android.Navigate to the Build / Android Application section.
    • Изменить поле имени пакета должен содержать ".".Change the Package name field to contain a '.'.

Установка_FAILED_MISSING_SHARED_БИБЛИОТЕКИ при установке пакетаINSTALL_FAILED_MISSING_SHARED_LIBRARY when installing a package

«Общей библиотеки» в данном контексте является не общую библиотеку машинного кода (libfoo.so) файла; это вместо библиотеки, который должен устанавливаться отдельно на целевом устройстве, например Google Maps.A "shared library" in this context is not a native shared library (libfoo.so) file; it is instead a library that must be separately installed on the target device, such as Google Maps.

Пакет Android указывает, какие общие библиотеки требуются с <uses-library/> элемент.The Android package specifies which shared libraries are required with the <uses-library/> element. Если требуется библиотека отсутствует на целевом устройстве (например //uses-library/@android:requiredtrue, используемого по умолчанию), то произойдет сбой установки пакета с УСТАНОВИТЬ_ Не удалось_MISSING_SHARED_БИБЛИОТЕКИ.If a required library is not present on the target device (e.g. //uses-library/@android:required is true, which is the default), then package installation will fail with INSTALL_FAILED_MISSING_SHARED_LIBRARY.

Чтобы узнать, какие общие библиотеки являются обязательными, найдите создан AndroidManifest.xml файла (например obj\Отладка\android \AndroidManifest.xml) и найдите <uses-library/> элементов.To determine which shared libraries are required, view the generated AndroidManifest.xml file (e.g. obj\Debug\android\AndroidManifest.xml) and look for the <uses-library/> elements. <uses-library/> элементы можно добавить вручную в вашем проекте свойства\AndroidManifest.xml файла и через UsesLibraryAttribute настраиваемого атрибута.<uses-library/> elements can be added manually in your project's Properties\AndroidManifest.xml file and via the UsesLibraryAttribute custom attribute.

Например, при добавлении ссылки на сборку Mono.Android.GoogleMaps.dll неявно добавляется <uses-library/> для общей библиотеки Google Maps.For example, adding an assembly reference to Mono.Android.GoogleMaps.dll will implicitly add a <uses-library/> for the Google Maps shared library.

Установка_FAILED_обновления_НЕСОВМЕСТИМЫЕ при установке пакетаINSTALL_FAILED_UPDATE_INCOMPATIBLE when installing a package

Android пакеты имеют три требования:Android packages have three requirements:

  • Они должны содержать "." (см. предыдущие записи)They must contain a '.' (see previous entry)
  • Они должны иметь уникальное строковое имя пакета (таким образом соглашение tld обратном порядке, в приложении Android имена, например com.android.chrome для приложения Chrome)They must have a unique string package name (hence the reverse-tld convention seen in Android app names, e.g. com.android.chrome for the Chrome app)
  • При обновлении пакетов, пакет должен иметь тот же ключ подписи.When upgrading packages, the package must have the same signing key.

Таким образом рассмотрим следующую ситуацию:Thus, imagine this scenario:

  1. Сборка и развертывание приложения как приложения отладкиYou build & deploy your app as a Debug app
  2. Изменился ключ подписывания, например на использование как выпуска приложения (или так, как вам не нравятся предоставляемых по умолчанию отладке ключ подписывания)You change the signing key, e.g. to use as a Release app (or because you don't like the default-provided Debug signing key)
  3. Установите приложение, не удаляя его, во-первых, например Отладка > Запуск без отладки в Visual StudioYou install your app without removing it first, e.g. Debug > Start Without Debugging within Visual Studio

В этом случае установка пакета завершится ошибкой с установкой_FAILED_обновления_НЕСОВМЕСТИМЫЕ ошибку, так как имя пакета не изменили при подписывании клавиша выполняла.When this happens, package installation will fail with a INSTALL_FAILED_UPDATE_INCOMPATIBLE error, because the package name didn't change while the signing key did. Android журнал отладки также будет содержать сообщение, подобное:The Android Debug Log will also contain a message similar to:

E/PackageManager(  146): Package [PackageName] signatures do not match the previously installed version; ignoring!

Чтобы устранить эту ошибку, полностью удалите приложение с устройства перед повторной установкой.To fix this error, completely remove the application from your device before re-installing.

Установка_FAILED_UID_ИЗМЕНЕНО при установке пакетаINSTALL_FAILED_UID_CHANGED when installing a package

При установке пакета Android, оно назначается идентификатор пользователя (UID).When an Android package is installed, it is assigned a user id (UID). Иногда, по соображениям настоящее время неизвестно, при установке через уже установленного приложения, установка завершится ошибкой с INSTALL_FAILED_UID_CHANGED:Sometimes, for currently unknown reasons, when installing over an already installed app, the installation will fail with INSTALL_FAILED_UID_CHANGED:

ERROR [2015-03-23 11:19:01Z]: ANDROID: Deployment failed
Mono.AndroidTools.InstallFailedException: Failure [INSTALL_FAILED_UID_CHANGED]
   at Mono.AndroidTools.Internal.AdbOutputParsing.CheckInstallSuccess(String output, String packageName)
   at Mono.AndroidTools.AndroidDevice.<>c__DisplayClass2c.<InstallPackage>b__2b(Task`1 t)
   at System.Threading.Tasks.ContinuationTaskFromResultTask`1.InnerInvoke()
   at System.Threading.Tasks.Task.Execute()

Чтобы обойти эту проблему, полностью удалить пакета Android, либо путем установки приложения из графического пользовательского интерфейса Android целевого объекта, или с помощью adb:To work around this issue, fully uninstall the Android package, either by installing the app from the Android target's GUI, or using adb:

$ adb uninstall @PACKAGE_NAME@

НЕ используйте adb uninstall -k, как это будет Сохранить данные приложений и таким образом сохранить конфликтующие UID на целевом устройстве.DO NOT USE adb uninstall -k, as this will preserve application data, and thus preserve the conflicting UID on the target device.

Выпуск приложений не запущен на устройствеRelease apps fail to launch on device

Выходной Android журнал отладки будет содержать сообщение, подобное:Does the Android Debug Log output will contain a message similar to:

D/AndroidRuntime( 1710): Shutting down VM
W/dalvikvm( 1710): threadid=1: thread exiting with uncaught exception (group=0xb412f180)
E/AndroidRuntime( 1710): FATAL EXCEPTION: main
E/AndroidRuntime( 1710): java.lang.UnsatisfiedLinkError: Couldn't load monodroid: findLibrary returned null
E/AndroidRuntime( 1710):        at java.lang.Runtime.loadLibrary(Runtime.java:365)

Если Да, существует две возможные причины:If so, there are two possible causes for this:

  1. Apk-файла не предоставляет ABI, который поддерживает целевое устройство.The .apk doesn't provide an ABI that the target device supports. Например apk-файла содержит только двоичные файлы для armeabi-v7a, и целевое устройство поддерживает только armeabi.For example, the .apk only contains armeabi-v7a binaries, and the target device only supports armeabi.

  2. Android ошибки.An Android bug. Если это так, удалите приложение, cross пальцы и переустановите приложение.If this is the case, uninstall the app, cross your fingers, and reinstall the app.

Чтобы устранить проблему (1), изменить параметры и свойства проекта и добавлена поддержка требуется интерфейс ABI в список поддерживаемых ABI.To fix (1), edit the Project Options/Properties and add support for the required ABI to the list of Supported ABIs. Чтобы определить, какие ABI, необходимо добавить, выполните следующую команду adb от целевого устройства: To determine which ABI you need to add, run the following adb command against your target device:

adb shell getprop ro.product.cpu.abi
adb shell getprop ro.product.cpu.abi2

Выходные данные будут содержать основной (и необязательно вторичная) ABI.The output will contain the primary (and optional secondary) ABIs.

$ adb shell getprop | grep ro.product.cpu
[ro.product.cpu.abi2]: [armeabi]
[ro.product.cpu.abi]: [armeabi-v7a]

Для проекта не задано свойство OutPath “MyApp.csproj”The OutPath property is not set for project “MyApp.csproj”

Это обычно означает, что у вас есть компьютера с HP и переменную среды “платформы” было присвоено что-то образом MCD или HPD.This generally means you have an HP computer and the environment variable “Platform” has been set to something like MCD or HPD. Эта лицензия конфликтует со свойством платформа MSBuild, который обычно имеет значение “любой ЦП” или “x86”.This conflicts with the MSBuild Platform property that is generally set to “Any CPU” or “x86”. Необходимо будет удалить эту переменную среды с компьютера, для того чтобы использовать MSBuild можно:You will need to remove this environment variable from your machine before MSBuild can function:

  • Панель управления > Система > Дополнительно > переменные средыControl Panel > System > Advanced > Environment Variables

Перезапустите Visual Studio или Visual Studio для Mac и попытки перестроить.Restart Visual Studio or Visual Studio for Mac and try to rebuild. Что теперь должен работать соответствующим образом.Things should now work as expected.

java.lang.ClassCastException: mono.android.runtime.JavaObject не может быть приведен к...java.lang.ClassCastException: mono.android.runtime.JavaObject cannot be cast to...

Xamarin.Android 4.x не маршалинга правильно вложенных универсальных типов должным образом.Xamarin.Android 4.x doesn't properly marshal nested generic types properly. Например, рассмотрим следующие C# кода, используя SimpleExpandableListAdapter:For example, consider the following C# code using SimpleExpandableListAdapter:

// BAD CODE; DO NOT USE
var groupData = new List<IDictionary<string, object>> () {
        new Dictionary<string, object> {
                { "NAME", "Group 1" },
                { "IS_EVEN", "This group is odd" },
        },
};
var childData = new List<IList<IDictionary<string, object>>> () {
        new List<IDictionary<string, object>> {
                new Dictionary<string, object> {
                        { "NAME", "Child 1" },
                        { "IS_EVEN", "This group is odd" },
                },
        },
};
mAdapter = new SimpleExpandableListAdapter (
        this,
        groupData,
        Android.Resource.Layout.SimpleExpandableListItem1,
        new string[] { "NAME", "IS_EVEN" },
        new int[] { Android.Resource.Id.Text1, Android.Resource.Id.Text2 },
        childData,
        Android.Resource.Layout.SimpleExpandableListItem2,
        new string[] { "NAME", "IS_EVEN" },
        new int[] { Android.Resource.Id.Text1, Android.Resource.Id.Text2 }
);

Проблема в том, что Xamarin.Android неправильно маршалирует вложенных универсальных типов.The problem is that Xamarin.Android incorrectly marshals nested generic types. List<IDictionary<string, object>> Который маршалируется java.lang.ArrrayList, но ArrayList — содержащий mono.android.runtime.JavaObject экземпляров (которой Dictionary<string, object> экземпляров) вместо, реализующую java.util.Map, что может привести следующее исключение:The List<IDictionary<string, object>> is being marshaled to a java.lang.ArrrayList, but the ArrayList is containing mono.android.runtime.JavaObject instances (which reference the Dictionary<string, object> instances) instead of something that implements java.util.Map, resulting in the following exception:

E/AndroidRuntime( 2991): FATAL EXCEPTION: main
E/AndroidRuntime( 2991): java.lang.ClassCastException: mono.android.runtime.JavaObject cannot be cast to java.util.Map
E/AndroidRuntime( 2991):        at android.widget.SimpleExpandableListAdapter.getGroupView(SimpleExpandableListAdapter.java:278)
E/AndroidRuntime( 2991):        at android.widget.ExpandableListConnector.getView(ExpandableListConnector.java:446)
E/AndroidRuntime( 2991):        at android.widget.AbsListView.obtainView(AbsListView.java:2271)
E/AndroidRuntime( 2991):        at android.widget.ListView.makeAndAddView(ListView.java:1769)
E/AndroidRuntime( 2991):        at android.widget.ListView.fillDown(ListView.java:672)
E/AndroidRuntime( 2991):        at android.widget.ListView.fillFromTop(ListView.java:733)
E/AndroidRuntime( 2991):        at android.widget.ListView.layoutChildren(ListView.java:1622)

Решение — использовать предоставленный типы коллекций Java вместо System.Collections.Generic типы для “внутреннее” типов.The workaround is to use the provided Java Collection types instead of the System.Collections.Generic types for the “inner” types. Это приведет к соответствующих типов Java при маршалинге экземпляров.This will result in appropriate Java types when marshaling the instances. (Приведенный ниже сложнее, чем необходимо, чтобы сократить время существования gref, установленное.(The following code is more complicated than necessary in order to reduce gref lifetimes. Он может быть упрощен до изменения исходного кода с помощью s/List/JavaList/g и s/Dictionary/JavaDictionary/g Если gref, установленное время существования не придется волноваться.)It can be simplified to altering the original code via s/List/JavaList/g and s/Dictionary/JavaDictionary/g if gref lifetimes aren't a worry.)

// insert good code here
using (var groupData = new JavaList<IDictionary<string, object>> ()) {
    using (var groupEntry = new JavaDictionary<string, object> ()) {
        groupEntry.Add ("NAME", "Group 1");
        groupEntry.Add ("IS_EVEN", "This group is odd");
        groupData.Add (groupEntry);
    }
    using (var childData = new JavaList<IList<IDictionary<string, object>>> ()) {
        using (var childEntry = new JavaList<IDictionary<string, object>> ())
        using (var childEntryDict = new JavaDictionary<string, object> ()) {
            childEntryDict.Add ("NAME", "Child 1");
            childEntryDict.Add ("IS_EVEN", "This child is odd.");
            childEntry.Add (childEntryDict);
            childData.Add (childEntry);
        }
        mAdapter = new SimpleExpandableListAdapter (
            this,
            groupData,
            Android.Resource.Layout.SimpleExpandableListItem1,
            new string[] { "NAME", "IS_EVEN" },
            new int[] { Android.Resource.Id.Text1, Android.Resource.Id.Text2 },
            childData,
            Android.Resource.Layout.SimpleExpandableListItem2,
            new string[] { "NAME", "IS_EVEN" },
            new int[] { Android.Resource.Id.Text1, Android.Resource.Id.Text2 }
        );
    }
}

Это будет исправлено в будущем выпуске.This will be fixed in a future release.

Непредвиденным исключениям NullReferenceExceptionUnexpected NullReferenceExceptions

Иногда Android журнал отладки будем рассказывать о исключений NullReferenceException, “невозможны,” или берутся Mono для кода среды выполнения Android незадолго до из строя приложений:Occasionally the Android Debug Log will mention NullReferenceExceptions that “cannot happen,” or come from Mono for Android runtime code shortly before the app dies:

E/mono(15202): Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object
E/mono(15202):   at Java.Lang.Object.GetObject (IntPtr handle, System.Type type, Boolean owned)
E/mono(15202):   at Java.Lang.Object._GetObject[IOnTouchListener] (IntPtr handle, Boolean owned)
E/mono(15202):   at Java.Lang.Object.GetObject[IOnTouchListener] (IntPtr handle, Boolean owned)
E/mono(15202):   at Android.Views.View+IOnTouchListenerAdapter.n_OnTouch_Landroid_view_View_Landroid_view_MotionEvent_(IntPtr jnienv, IntPtr native__this, IntPtr native_v, IntPtr native_e)
E/mono(15202):   at (wrapper dynamic-method) object:b039cbb0-15e9-4f47-87ce-442060701362 (intptr,intptr,intptr,intptr)

илиor

E/mono    ( 4176): Unhandled Exception:
E/mono    ( 4176): System.NullReferenceException: Object reference not set to an instance of an object
E/mono    ( 4176): at Android.Runtime.JNIEnv.NewString (string)
E/mono    ( 4176): at Android.Util.Log.Info (string,string)

Это может произойти, когда решает отменить процесс, который может происходить по ряду причин, включая gref, Установленное предельного масштаба целевого объекта или действия среды выполнения Android “неправильный” с JNI.This can happen when the Android runtime decides to abort the process, which can happen for any number of reasons, including hitting the target's GREF limit or doing something “wrong” with JNI.

Чтобы увидеть, если это так, в журнале Android отладка сообщение от процесс аналогичен:To see if this is the case, check the Android Debug Log for a message from your process similar to:

E/dalvikvm(  123): VM aborting

Прервать из-за нехватки глобальной ссылкиAbort due to Global Reference Exhaustion

Уровень среды выполнения Android JNI поддерживает только ограниченный набор ссылок на объекты JNI функционировал в любой момент времени.The Android runtime's JNI layer only supports a limited number of JNI object references to be valid at any given point in time. При превышении этого предела, прервать вещи.When this limit is exceeded, things break.

Gref, Установленное (глобальной ссылки) это значение равно 2000 ссылки в эмуляторе и ~ 52000 ссылается на оборудовании.The GREF (global reference) limit is 2000 references in the emulator, and ~52000 references on hardware.

Вы знаете, что вы начинаете создавать слишком много GREFs при появлении сообщения, такие как это, в журнал отладки Android:You know you're starting to create too many GREFs when you see messages such as this in the Android Debug Log:

D/dalvikvm(  602): GREF has increased to 1801

По достижении gref, Установленное ограничение, выводится сообщение, например следующие:When you reach the GREF limit, a message such as the following is printed:

D/dalvikvm(  602): GREF has increased to 2001
W/dalvikvm(  602): Last 10 entries in JNI global reference table:
W/dalvikvm(  602):  1991: 0x4057eff8 cls=Landroid/graphics/Point; (20 bytes)
W/dalvikvm(  602):  1992: 0x4057f010 cls=Landroid/graphics/Point; (28 bytes)
W/dalvikvm(  602):  1993: 0x40698e70 cls=Landroid/graphics/Point; (20 bytes)
W/dalvikvm(  602):  1994: 0x40698e88 cls=Landroid/graphics/Point; (20 bytes)
W/dalvikvm(  602):  1995: 0x40698ea0 cls=Landroid/graphics/Point; (28 bytes)
W/dalvikvm(  602):  1996: 0x406981f0 cls=Landroid/graphics/Point; (20 bytes)
W/dalvikvm(  602):  1997: 0x40698208 cls=Landroid/graphics/Point; (20 bytes)
W/dalvikvm(  602):  1998: 0x40698220 cls=Landroid/graphics/Point; (28 bytes)
W/dalvikvm(  602):  1999: 0x406956a8 cls=Landroid/graphics/Point; (20 bytes)
W/dalvikvm(  602):  2000: 0x406956c0 cls=Landroid/graphics/Point; (20 bytes)
W/dalvikvm(  602): JNI global reference table summary (2001 entries):
W/dalvikvm(  602):    51 of Ljava/lang/Class; 164B (41 unique)
W/dalvikvm(  602):    46 of Ljava/lang/Class; 188B (17 unique)
W/dalvikvm(  602):     6 of Ljava/lang/Class; 212B (6 unique)
W/dalvikvm(  602):    11 of Ljava/lang/Class; 236B (7 unique)
W/dalvikvm(  602):     3 of Ljava/lang/Class; 260B (3 unique)
W/dalvikvm(  602):     4 of Ljava/lang/Class; 284B (2 unique)
W/dalvikvm(  602):     8 of Ljava/lang/Class; 308B (6 unique)
W/dalvikvm(  602):     1 of Ljava/lang/Class; 316B
W/dalvikvm(  602):     4 of Ljava/lang/Class; 332B (3 unique)
W/dalvikvm(  602):     1 of Ljava/lang/Class; 356B
W/dalvikvm(  602):     2 of Ljava/lang/Class; 380B (1 unique)
W/dalvikvm(  602):     1 of Ljava/lang/Class; 428B
W/dalvikvm(  602):     1 of Ljava/lang/Class; 452B
W/dalvikvm(  602):     1 of Ljava/lang/Class; 476B
W/dalvikvm(  602):     2 of Ljava/lang/Class; 500B (1 unique)
W/dalvikvm(  602):     1 of Ljava/lang/Class; 548B
W/dalvikvm(  602):     1 of Ljava/lang/Class; 572B
W/dalvikvm(  602):     2 of Ljava/lang/Class; 596B (2 unique)
W/dalvikvm(  602):     1 of Ljava/lang/Class; 692B
W/dalvikvm(  602):     1 of Ljava/lang/Class; 956B
W/dalvikvm(  602):     1 of Ljava/lang/Class; 1004B
W/dalvikvm(  602):     1 of Ljava/lang/Class; 1148B
W/dalvikvm(  602):     2 of Ljava/lang/Class; 1172B (1 unique)
W/dalvikvm(  602):     1 of Ljava/lang/Class; 1316B
W/dalvikvm(  602):     1 of Ljava/lang/Class; 3428B
W/dalvikvm(  602):     1 of Ljava/lang/Class; 3452B
W/dalvikvm(  602):     1 of Ljava/lang/String; 28B
W/dalvikvm(  602):     2 of Ldalvik/system/VMRuntime; 12B (1 unique)
W/dalvikvm(  602):    10 of Ljava/lang/ref/WeakReference; 28B (10 unique)
W/dalvikvm(  602):     1 of Ldalvik/system/PathClassLoader; 44B
W/dalvikvm(  602):  1553 of Landroid/graphics/Point; 20B (1553 unique)
W/dalvikvm(  602):   261 of Landroid/graphics/Point; 28B (261 unique)
W/dalvikvm(  602):     1 of Landroid/view/MotionEvent; 100B
W/dalvikvm(  602):     1 of Landroid/app/ActivityThread$ApplicationThread; 28B
W/dalvikvm(  602):     1 of Landroid/content/ContentProvider$Transport; 28B
W/dalvikvm(  602):     1 of Landroid/view/Surface$CompatibleCanvas; 44B
W/dalvikvm(  602):     1 of Landroid/view/inputmethod/InputMethodManager$ControlledInputConnectionWrapper; 36B
W/dalvikvm(  602):     1 of Landroid/view/ViewRoot$1; 12B
W/dalvikvm(  602):     1 of Landroid/view/ViewRoot$W; 28B
W/dalvikvm(  602):     1 of Landroid/view/inputmethod/InputMethodManager$1; 28B
W/dalvikvm(  602):     1 of Landroid/view/accessibility/AccessibilityManager$1; 28B
W/dalvikvm(  602):     1 of Landroid/widget/LinearLayout$LayoutParams; 44B
W/dalvikvm(  602):     1 of Landroid/widget/LinearLayout; 332B
W/dalvikvm(  602):     2 of Lorg/apache/harmony/xnet/provider/jsse/TrustManagerImpl; 28B (1 unique)
W/dalvikvm(  602):     1 of Landroid/view/SurfaceView$MyWindow; 36B
W/dalvikvm(  602):     1 of Ltouchtest/RenderThread; 92B
W/dalvikvm(  602):     1 of Landroid/view/SurfaceView$3; 12B
W/dalvikvm(  602):     1 of Ltouchtest/DrawingView; 412B
W/dalvikvm(  602):     1 of Ltouchtest/Activity1; 180B
W/dalvikvm(  602): Memory held directly by tracked refs is 75624 bytes
E/dalvikvm(  602): Excessive JNI global references (2001)
E/dalvikvm(  602): VM aborting

В приведенном выше примере (который, между прочим, поставляется вместе с bug 685215) проблемы является то, что слишком много Android.Graphics.Point, создаются экземпляры; см. в разделе комментарий #2 список исправлений для этой конкретной ошибки.In the above example (which, incidentally, comes from bug 685215) the problem is that too many Android.Graphics.Point instances are being created; see comment #2 for a list of fixes for this particular bug.

Как правило, полезное решение должно найти какой тип имеет слишком много экземпляров выделенных – Android.Graphics.Point в дампе выше – найдите, где созданные в исходный код и удалите их соответствующим образом (таким образом, чтобы их Сокращено время существования Java-Object).Typically, a useful solution is to find which type has too many instances allocated – Android.Graphics.Point in the above dump – then find where they're created in your source code and dispose of them appropriately (so that their Java-object lifetime is shortened). Этот способ не всегда подходит (#685215 является многопоточным, поэтому тривиальные решение позволяет избежать вызова Dispose), но это первое, что необходимо учитывать.This is not always appropriate (#685215 is multithreaded, so the trivial solution avoids the Dispose call), but it's the first thing to consider.

Вы можете включить gref, Установленное ведение журнала при создании GREFs и сколько существует.You can enable GREF Logging to see when GREFs are created and how many exist.

Прервать из-за несоответствия типа JNIAbort due to JNI type mismatch

Если наката руки JNI кода не исключено, что типы не будет соответствовать правильно, например при попытке вызвать java.lang.Runnable.run на тип, который не реализует java.lang.Runnable.If you hand-roll JNI code, it's possible that the types won't match correctly, e.g. if you try to invoke java.lang.Runnable.run on a type that doesn't implement java.lang.Runnable. В этом случае будет существовать сообщение следующего вида в журнал отладки Android:When this occurs, there will be a message similar to this in the Android Debug Log:

W/dalvikvm( 123): JNI WARNING: can't call Ljava/Type;;.method on instance of Lanother/java/Type;
W/dalvikvm( 123):              in Lmono/java/lang/RunnableImplementor;.n_run:()V (CallVoidMethodA)
...
E/dalvikvm( 123): VM aborting

Поддержка динамического кодаDynamic Code Support

Динамический код не компилируется.Dynamic code does not compile

Чтобы использовать C# dynamic в приложении или библиотеке, необходимо добавить в проект System.Core.dll, Microsoft.CSharp.dll и Mono.CSharp.dll.To use C# dynamic in your application or library, you have to add System.Core.dll, Microsoft.CSharp.dll and Mono.CSharp.dll to your project.

В окончательном построении MissingMethodException происходит для динамического кода во время выполнения.In Release build, MissingMethodException occurs for dynamic code at run time.

  • Вполне вероятно, что проект приложения не содержит ссылки на System.Core.dll, Microsoft.CSharp.dll или Mono.CSharp.dll.It is likely that your application project does not have references to System.Core.dll, Microsoft.CSharp.dll or Mono.CSharp.dll. Убедитесь, что существуют ссылки на эти сборки.Make sure those assemblies are referenced.

    • Имейте в виду, динамического кода всегда затраты.Keep in mind that dynamic code always costs. Если требуется эффективный код, рекомендуется не использовать динамического кода.If you need efficient code, consider not using dynamic code.
  • В первой предварительной версии эти сборки были исключены, если типы в каждой сборке явным образом не используются кодом приложения.In the first preview, those assemblies were excluded unless types in each assembly are explicitly used by the application code. Ознакомьтесь с решение этой проблемы: http://lists.ximian.com/pipermail/mo...il/009798.htmlSee the following for a workaround: http://lists.ximian.com/pipermail/mo...il/009798.html

Проекты, построенные с помощью AOT + LLVM аварийного завершения на x86 устройствProjects built with AOT+LLVM crash on x86 devices

При развертывании приложения, созданного с помощью AOT + LLVM x86 устройств, может появиться сообщение об ошибке исключения, аналогичную следующей:When deploying an app built with AOT+LLVM on x86-based devices, you may see an exception error message similar to the following:

Assertion: should not be reached at /Users/.../external/mono/mono/mini/tramp-x86.c:124
Fatal signal 6 (SIGABRT), code -6 in tid 4051 (amarin.bug56111)

Это известная проблема в 56111.This is a known issue as reported in 56111. Обойти это можно отключить LLVM.The workaround is to disable LLVM.