Не понимаю, почему приложение Android дает сбой и что означают уровни API

Недавно я разработал приложение для iOS и Android с помощью Xamarin. Приложение использовалось относительно небольшим числом пользователей на деловом мероприятии, на котором присутствовал я лично. Хотя приложение работало на всех устройствах iOS и большинстве устройств Android, у меня было несколько устройств Android, на которых приложение постоянно аварийно завершало работу в одном и том же месте. Я решил отправить два отчета о сбоях, которые позже исследовал в Goole Developer Console.

Оказалось, что приложение вылетает на: java.lang.NoSuchMethodError: no non-static method "Landroid/view/View;.setForegroundTintList(Landroid/content/res/ColorStateList;)V" Похоже, оно вылетает при вызове setForegroundTintList. Я настроил свое приложение для совместимости с уровнем API 15, и документально подтверждено, что он доступен только с уровня API 21. Итак, пожалуйста...

Но подождите, нет, устройства, с которых я отправлял отчеты о сбоях, работали под управлением Android 5.0 и 5.1, и оба должны поддерживать уровень API 21 и выше. Одно из устройств — Samsung Galaxy Core Prime (Android 5.1), а другое — Samsung Galaxy S5 (klte), предположительно работающее под управлением Android 5.0, согласно отчету о сбое, хотя в консоли разработчика указано, что оно (поставляется??) с Android 4.0.3 - 4.0.4.

Я очень новичок в разработке Xamarin и Android, так что кто-нибудь может это объяснить? И что мне делать, чтобы предотвратить это в будущем?

Настроить больше эмуляторов для некоторых ключевых версий Android и протестировать больше эмуляторов? Есть ли что-нибудь, что компилятор может сделать для меня. Даже когда я понижаю целевой уровень API до уровня API 15, он компилируется и строится нормально. Разве он не должен жаловаться на использование методов, недоступных на целевом уровне API?


person Marco Miltenburg    schedule 09.02.2017    source источник


Ответы (1)


Target Framework используется во время компиляции, например, установите для него значение API19, тогда вы получите ошибку компиляции для вашего свойства ForegroundTintList:

Ошибка CS1061: тип Android.Widget.Button не содержит определения ForegroundTintList.

Конечно, вы не сможете использовать новые API, так как теперь они будут ошибками компилятора.

Minimum Android Version используется во время выполнения, поэтому вам потребуется выполнять проверку во время выполнения, чтобы избежать сбоев на старых уровнях API устройств.

if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
{
    var x = button.ForegroundTintList;
}

Ссылка: Понимание уровней Android API

person SushiHangover    schedule 09.02.2017
comment
Я уже пробовал это, но он отлично компилируется (с Visual Studio для Mac = Xamarin Studio). Я использую его на Android.Support.V7.Widget.Toolbar и, таким образом, использую пакет Xamarin.Android.Support.v7.AppCompat. Это, вероятно, объясняет, почему он компилируется даже до уровня API 15. Но это все еще не объясняет, почему он не будет работать на этих двух конкретных устройствах (или версиях Android). - person Marco Miltenburg; 09.02.2017
comment
Извините, я заметил разницу между целевой платформой и целевой версией Android. +1 за ссылку. - person Marco Miltenburg; 09.02.2017