Android TargetApi注释和Just-In-Time编译器

时间:2013-10-22 14:33:18

标签: android annotations jit android-annotations

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

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

然后在MainActivity onCreate期间,如果需要,我会像这样构建对象:

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

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

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

  

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

所以问题是:

  • 实际发生了什么事情以及为什么我偶尔会发生这次崩溃而不是每次都发生这种情况?

1 个答案:

答案 0 :(得分:3)

  

我的意思是,该类确实存在,并且它只是那里的空对象。

在API级别14中添加了

NfcAdapter.CreateNdefMessageCallback。因此,旧版设备上的Dalvik无法成功加载它,因为它无法解析该接口。

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

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