1

我正在为我们的应用程序提供 Android Beam 支持。但是因为我们仍然支持 2.2 *咳咳死 froyo,死姜饼,咳嗽* 我已经将类中的所有 NFC 代码NfcHandler与 TargetApi 注释一起打包以避免像这样的 lint 警告:

    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    public class NfcHandler implements NfcAdapter.CreateNdefMessageCallback

然后MainActivityonCreate我构建对象的过程中,如有必要,如下所示:

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH)
        nfcHandler = new NfcHandler(this);

在构造函数中,它完成了所有必要的 NFC 工作,稍后在代码中if( nfcHandler != null )我将意图传递给它,因此它可以检查它是否正在接收光束。

一切都很好,而且大部分时间都有效。但在极少数情况下,Gingerbread 设备会崩溃:

10-22 16:08:01.022 1734-1734/com.baseapp.eyeem.p0 E/dalvikvm:找不到类'com.baseapp.eyeem.os.NfcHandler',引用自方法com.foo.MainActivity.onCreate

我的意思是,这个类确实存在,它只是它的一个空对象。

因为我们在 XXHDPI 设备上的应用程序是 23mb,而在 ldpi Gingerbread 上是 5mb,我可以看到即时编译器 (JIT) 或其他一些运行时优化正在删除不必要的资源。我想知道它是否可能与我的 NfcHandler 类的情况相同,因为它是注释,因为它ICE_CREAM_SANDWICH会删除它。

所以问题是:

  • 实际发生了什么,为什么我只是偶尔而不是每次都发生这种崩溃?
4

1 回答 1

3

我的意思是,这个类确实存在,它只是它的一个空对象。

NfcAdapter.CreateNdefMessageCallback在 API 级别 14 中添加。因此,旧设备上的 Dalvik 无法成功加载它,因为它将无法解析该接口。

现在,原则上,Dalvik 永远不应该尝试NfcHandler在 Gingerbread 设备上加载您的处理程序类,如果您上面显示的代码片段是您引用它的唯一位置,或者如果所有其他事件都有相同的if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH)Java 版本保护块来保护它.

它表明,在这些设备上,Build.VERSION.SDK_INT没有返回预期值,要么是因为固件错误,要么是因为某些根设备用户为了调整他们的环境所做的事情。

于 2013-10-22T14:44:32.757 回答