对 Android 应用程序崩溃的原因以及 API 级别的含义感到困惑

Posted

技术标签:

【中文标题】对 Android 应用程序崩溃的原因以及 API 级别的含义感到困惑【英文标题】:Confused as to why Android app crashes and what API levels mean 【发布时间】:2017-06-27 11:43:42 【问题描述】:

我最近使用 Xamarin 开发了一个 iosandroid 应用程序。在我亲自出席的商业活动中,相对少数用户使用了该应用程序。尽管该应用程序在所有 iOS 设备和大多数 Android 设备上都运行了 find,但我有一些 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 及更高级别。其中一台设备是三星 Galaxy Core Prime (Android 5.1),另一台是三星 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;

参考:Understanding Android API Levels

【讨论】:

我已经尝试过了,但它编译得很好(使用 Visual Studio for Mac = Xamarin Studio)。我在Android.Support.V7.Widget.Toolbar 上使用它,因此使用Xamarin.Android.Support.v7.AppCompat 包。这可能解释了为什么它甚至可以编译到 API 级别 15。但它仍然没有解释为什么它不能在这两种特定设备(或 Android 版本)上工作。 抱歉,只是注意到Target frameworkTarget Android version之间的区别。为链接 +1。

以上是关于对 Android 应用程序崩溃的原因以及 API 级别的含义感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

API 21 新 DatePicker 显示周数崩溃

Android拍照调用系统相册仿微信封装总结,治疗各种崩溃,图片横竖问题压缩等问题。

Android:应用程序由于未知原因而崩溃

Android 9 (API 28) 活动在启动时崩溃 (setContentView)

地理编码器是否需要地图api密钥才能在Android模拟器上运行

Android 12 已来,你的 App 崩溃了吗?