1

Androidでそのような互換性のあるコードを書いても安全ですか?

if (Build.os.SDK_INT >= 11) {
    newClass instance = new newClass();
    ....
}
else {
    oldClass instance = new oldClass();
    ....
}

私の同僚の 1 人は、ClassLoader が Android 11 未満の Android OS デバイスに newClass をロードしようとしているため、上記のコードを実行すると ClassNotFoundException がスローされる可能性があると主張しています。起こる。数時間グーグルで調べた後、AndroidのデフォルトclassLoaderが特定のクラスをロードする方法とタイミングに関する情報は見つかりませんでした。

4

4 に答える 4

0

次のように互換性を確認する必要があります...上記よりも正確になります:

   private static int currentApi = 0;

   public static int getApiLevel() {

    if (currentApi > 0) {
        return currentApi;
    }

    if (android.os.Build.VERSION.SDK.equalsIgnoreCase("3")) {
        currentApi = 3;
    } else {
        try {
            Field f = android.os.Build.VERSION.class.getDeclaredField("SDK_INT");
            currentApi = (Integer) f.get(null);
        } catch (Exception e) {
            return 0;
        }
    }

    return currentApi;
}
于 2012-10-13T09:10:28.660 に答える
0

はい、これは Android の最近のバージョンで安全に実行できます。フロヨ以上と言いたいところですが、それよりも前だったのかもしれません。よく覚えていません。

dalvik は、インストール時に dex ファイルに対して検証パスを実行します。解決できないクラス/メソッド/フィールドについては、それらのアクセスを VerifyError をスローする命令に置き換えます。

あなたの例では、そのコードがロードされた場合、たとえば api 10newClass instance = new newClass()は概念的にthrow new VerifYError(). そのブランチが実行時に実行されない限り、すべて問題ありません。

于 2012-10-13T17:36:11.657 に答える
0

reflectionクラスが存在するかどうかを確認するためにいつでも使用できます。

try {
  Class.forName("yourclass")
} catch (ClassNotFoundExecption) {
  oldClass instance = new oldClass();
}
于 2012-10-13T09:27:09.160 に答える
-1

短い答え - しないでください。

ほとんどの VM は、絶対に必要な場合にのみクラスをロードします。ただし、クラスローダーはクラスのバイナリ表現を事前にキャッシュすることができます[1]。

クラスローダーは、型のバイナリ表現をキャッシュしたり、最終的な使用を見越して早期に型をロードしたり、関連するグループで型をまとめてロードしたりすることができます。

[1] - http://www.artima.com/insidejvm/ed2/lifetype2.html

[2] - http://developer.android.com/tools/extras/support-library.html

編集 - 必要なクラスが Android サポート パッケージの一部として利用可能かどうかを確認しましたか? [2]

于 2012-10-13T09:15:41.897 に答える