以这种方式编写Android兼容代码是否安全?

时间:2012-10-13 08:22:46

标签: android dalvik

在Android上编写兼容代码是否安全?

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

我的一位同事和我争辩说,运行上面的代码时可能会抛出ClassNotFoundException,因为ClassLoader试图在android 11下面的android os设备上加载newClass。但是我已经尝试了几次,并且没有看到这种情况发生了。 在谷歌搜索几个小时后,我没有找到任何关于android默认classLoader如何以及何时加载特定类的信息。

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

你总是可以使用reflection检查该类是否存在:

try {
  Class.forName("yourclass")
} catch (ClassNotFoundExecption) {
  oldClass instance = new oldClass();
}

答案 2 :(得分:0)

是的,这在Android的最新版本上是安全的。我想说froyo及以上,但它可能早于此。我不记得了。

dalvik在安装时对dex文件执行验证传递会发生什么。对于无法解析的任何类/方法/字段,它会使用抛出VerifyError的指令替换这些访问。

在您的示例中,如果加载了该代码,例如api 10,newClass instance = new newClass()在概念上会被throw new VerifYError()替换。因此,只要该分支永远不会在运行时执行,一切都很好。

答案 3 :(得分:-1)

简短回答 - 不要这样做。

大多数虚拟机只在绝对需要时加载一个类。但是,允许类加载器预先缓存类的二进制表示[1]。

  

允许类加载器缓存类型的二进制表示,   在预期最终使用或负载类型的早期加载类型   在相关小组中一起。

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

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

编辑 - 您是否检查过您需要的课程是否可用作Android支持包的一部分? [2]