1

私たちのアプリに Android Beam のサポートを含めています。しかし、まだ 2.2 をサポートしているため *咳、咳、死ぬ、ジンジャーブレッド、咳* クラス内のすべての NFC コードをNfcHandlerTargetApi アノテーションでパックして、次のようなリント警告を回避しました。

    @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.foo.MainActivity.onCreate から参照されるクラス 'com.baseapp.eyeem.os.NfcHandler' が見つかりませんでした

つまり、クラスは存在し、それはただの null オブジェクトです。

XXHDPI デバイスのアプリは 23 MB で、ldpi Gingerbread は 5 MB であるため、ジャスト イン タイム コンパイラ (JIT) またはその他のランタイム最適化によって不要なリソースが削除されていることがわかります。ICE_CREAM_SANDWICHそれはそれを削除するための注釈であるため、私の NfcHandler クラスと同じケースになるのではないかと思います。

質問は次のとおりです。

  • 実際に何が起こっているのか、なぜこのクラッシュが毎回ではなくたまに発生するのですか?
4

1 に答える 1

3

つまり、クラスは存在し、それはただの null オブジェクトです。

NfcAdapter.CreateNdefMessageCallbackは API レベル 14 で追加されました。そのため、古いデバイスの Dalvik はそのインターフェースを解決できないため、正常にロードすることはできません。

原則として、NfcHandler上記のコード スニペットが参照している唯一の場所である場合、または他のすべてのオカレンスにif(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH)それを防御する同じ Java バージョン ガード ブロックがある場合、Dalvik は Gingerbread デバイスにハンドラー クラスをロードしようとしません。 .

これが示唆するのは、これらのデバイスでBuild.VERSION.SDK_INTは が期待値を返していないということです。これは、ファームウェアのバグか、おそらく root 化されたデバイス ユーザーが環境を微調整するために行ったことのいずれかが原因です。

于 2013-10-22T14:44:32.757 に答える