gpt4 book ai didi

Android TargetApi 注释和即时编译器

转载 作者:行者123 更新时间:2023-11-29 17:55:47 25 4
gpt4 key购买 nike

我为我们的应用添加了 Android Beam 支持。但是因为我们仍然支持 2.2 * cough cough die froyo, die gingerbread, cough * 我已经将类 NfcHandler 中的所有 NFC 代码打包到带有 TargetApi 注释的类中避免这样的 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 ) 我将 Intent 传递给它,因此它可以检查它是否正在接收光束。

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

10-22 16:08:01.022 1734-1734/com.baseapp.eyeem.p0 E/dalvikvm﹕ Could not find class 'com.baseapp.eyeem.os.NfcHandler', referenced from method com.foo.MainActivity.onCreate

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

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

那么问题是:

  • 实际发生了什么,为什么我只是偶尔遇到一次崩溃,而不是每次都发生?

最佳答案

I mean, the class does exist and it's just a null object of it there.

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

现在,原则上,如果上面显示的代码 fragment 是您唯一引用它的地方,或者如果所有其他事件具有相同的 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) Java 版本保护 block 保护它。

这表明在这些设备上,Build.VERSION.SDK_INT 没有返回预期值,这可能是因为固件错误,也可能是某些已获得 root 权限的设备用户调整了他们的设备环境。

关于Android TargetApi 注释和即时编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19520800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com