【问题标题】:Android TargetApi annotation and the Just-In-Time compilerAndroid TargetApi 注解和即时编译器
【发布时间】:2013-10-31 11:54:48
【问题描述】:

我正在为我们的应用添加 Android Beam 支持。但是因为我们仍然支持 2.2 * coughcough die froyo, diegingerbread,cough * 我已经在 NfcHandler 类中使用 TargetApi 注释打包了所有 NFC 代码,以避免像这样的 lint 警告:

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

然后在onCreate 期间从MainActivity 构建对象,如有必要,如下所示:

    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 注释它会删除它。

所以问题是:

  • 到底发生了什么?为什么我只是偶尔而不是每次都发生这种崩溃?

【问题讨论】:

    标签: android annotations jit android-annotations


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 引用它的其他代码只是处理活动意图的方法上的if(nfcHandler != null && nfcHandler.handleIntent(intent)) return;。有问题的设备是我们绰号为“糟糕设备”的测试设备之一,它是 2.3.5 上的 HTC Wildfire S。我将尝试将NfcAdapter.CreateNdefMessageCallback 打包到内部对象中并报告
    • 看来它成功了。因为该对象正在实现一个接口,JVM 不知道它一直在抱怨它并偶尔崩溃。谢谢!
    • @Budius:用if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) 保护nfcHandler.handleIntent(intent) 就足够了吗?
    • @Mr_and_Mrs_D 我不知道,也许会。但是在我将接口设置为私有对象后,现在一切正常。因此,VM 在版本比较之前“看到”的唯一对象就是我创建的对象。
    猜你喜欢
    • 1970-01-01
    • 2019-04-11
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多