Не понятно, почему происходит сбой приложения 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?

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;
}

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

Другие вопросы по тегам