在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如何以及何时加载特定类的信息。
答案 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]