2012-10-13 55 views
1

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

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

我的一个同事跟我争辩说,ClassNotFoundException的可能运行上面的代码,因为类加载器试图加载的NewClass的Android操作系统的设备,其下方的Android 11.当被扔了,但我试过几次,并没有看到这种情况发生。 搜索了几个小时后,我没有找到任何有关android默认classLoader如何以及何时加载特定类的信息。

回答

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; 
} 
+0

谢谢,这个盖下方的Android版本4的设备是安全的直接使用SDK_INT当最小的SDK版本大于4 – ethangao

+0

是的,你可以使用SDK_INT直接 –

-1

简短的回答 - 不这样做。

大多数虚拟机只在绝对需要时才加载类。然而,一个类加载器可以事先缓存类的二进制表示[1]。

类加载器被允许缓存类型的二进制表示, 负载类型的最终使用的预期,或相关团体负载类型 一起月初。

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

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

编辑 - 你检查,如果你需要的类可作为支持Android软件包的一部分? [2]

+0

使用支持库是在我眼中最后的选择,因为它会增加apk的大小。 – ethangao

+0

“换句话说,如果一个类加载器在早期加载时遇到缺失或格式错误的类文件,它必须等待直到该类首次被程序活动使用时才报告该错误,如果该类未被程序主动使用,类加载器将永远不会报告错误。“似乎只有当该类被程序主动使用时才抛出异常。但这是jvm规范,我不知道如何在Android上的dalvik vm处理这个。 – ethangao

+0

我站好了。我仍然会使用支持包而不是编写有条件加载类的代码。 V13的支持类仅引入约400 kb的开销 –

0

可以送花儿给人使用reflection检查是否存在类:

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

当然,在Android上使用反射是可行的。然而反射同时带来了性能问题,这就是为什么我试图避免使用它。 – ethangao

0

是的,这是安全的,最近的Android版本做。我想说froyo和以上,但它可能比这更早。我不确定。

发生什么事情是,dalvik在安装时对dex文件执行验证过程。对于任何无法解析的类/方法/字段,它将用引发VerifyError的指令来替换这些访问。

在您的示例中,如果该代码已加载,例如api 10,newClass instance = new newClass()在概念上将被替换为throw new VerifYError()。所以只要该分支从不在运行时执行,一切都很好。