繁体   English   中英

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

[英]Android TargetApi annotation and the Just-In-Time compiler

我为我们的应用程序提供了Android Beam支持。 但是因为我们仍然支持2.2 * 咳嗽死了froyo,死姜饼,咳嗽 *我已经使用TargetApi注释在NfcHandler类中打包了所有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 )我将意图传递给它,因此它可以检查它是否正在接收波束。

一切都很好,很好,大部分时间都有效。 但在很少的场合姜饼设备崩溃:

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

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

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

所以问题是:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM