android的兼容性。 我使用Build.VERSION_CODES时感到困惑

Log.d(TAG, "Build.VERSION_CODES.ICE_CREAM_SANDWICH: " + Build.VERSION_CODES.ICE_CREAM_SANDWICH); 

我这样写代码,我用sdk4.0来编译这个android程序,所以没有造成编译错误。 当我在运行android 2.3.4的手机上运行这个程序时,运行的很好。

为什么? 我很困惑,版本2.3.4(api级别10)有Build.VERSION_CODES.ICE_CREAM_SANDWICH属性? 而当我用sdk2.3.4会导致编译错误。

更多

我testing下面的这些代码,

 private ScaleGestureDetector mScaleGestureDetector; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR_MR1) { mScaleGestureDetector = new ScaleGestureDetector(this, new MyOnScaleGestureListener()); } 

这个代码将运行在Android 1.6 API级别4,但是

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR_MR1) { Log.d(TAG, "getx(0): " + event.getX(0)); } 

这个程序在android 1.6 api level 4上运行失败。

他们都运行在android 2.3.4上。

为什么? (在ScaleGestureDetector类中使用event.getX(0) (自api级别5))

我testing一些代码更多..

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Fragment f = new Fragment(); } 

当我运行它在Android 1.6模拟器上它抛出java.lang.VerifyError,但在我的手机运行Android 2.3.4它抛出java.lang.NoClassDefFoundError。

为什么??

Solutions Collecting From Web of "android的兼容性。 我使用Build.VERSION_CODES时感到困惑"

这不像看起来那么奇怪。 它与Java如何处理基元的常量值有关。 在编译期间,常量的值放在字节码中,而不是实际常量的引用。

例如:

Log.d(TAG,“Build.VERSION_CODES.ICE_CREAM_SANDWICH:”+ Build.VERSION_CODES.ICE_CREAM_SANDWICH);

将被编译器自动转换为:

Log.d(TAG,“Build.VERSION_CODES.ICE_CREAM_SANDWICH:”+ 14);

所以对实际常量(和类)的引用被删除。

关于不能运行的代码,它必须做的是MotionEvent.getX(int n)方法直到api level 5才可用。在此之前,多点触控不被支持,因此不需要任何其他方法比getX()

如果实际调用不存在的方法,则无关紧要。 当class级正在加载并由平台validation时,出现错误。 您最有可能在日志中得到一个VerifyError,因为它会发现你正在尝试在validation过程中调用一个不存在的方法。

另一方面,如果你尝试使用一个不存在的类,你会得到一个ClassNotFoundException。 请注意,有时,即使文档没有这样说,Android中也存在一个类。 一些类在早期的Android版本中存在,但直到后期才公开。 有些人甚至走了另一条路。

所以:

尝试使用不存在的类–ClassNotFoundException尝试使用在存在的类上不存在的方法 – VerifyError

(当涉及到使用碎片时,它们可用于独立Android支持库的早期版本)