Android 如果我在低api设备中编译高api运行apk,会发生什么?

Android 如果我在低api设备中编译高api运行apk,会发生什么?,android,Android,现在我有一个项目,它是用API 14编译的。通过“is compiled”,我的意思是project.properties文件有一行“target=android-14”。但是,我在AndroidManifest.xml中定义了android:minSDK=8 在这个项目中,我使用了高api特性,比如android.animation.ValueAnimator、android.app.ActionBar。当然,该项目将在高api设备中完美运行 因为minSDK是8,所以我们可以在2.x设备中安

现在我有一个项目,它是用API 14编译的。通过“is compiled”,我的意思是project.properties文件有一行“target=android-14”。但是,我在AndroidManifest.xml中定义了android:minSDK=8

在这个项目中,我使用了高api特性,比如android.animation.ValueAnimator、android.app.ActionBar。当然,该项目将在高api设备中完美运行


因为minSDK是8,所以我们可以在2.x设备中安装apk,但是接下来会发生什么呢?值Animator和ActionBar将被删除?或者我们实际上无法在2.x设备中安装apk?

如果您使用的不是支持库中的相应类,而是仅包含在更高版本的Android中的本机类,则您的应用程序将因ClassNotFoundException或NoSuchMethodError而崩溃


解决方法是切换到支持库(如果有,取决于您使用的功能),或者根据应用程序运行的API版本禁用应用程序的某些功能。

如果您的应用程序加载到内存中,如果无法解析类/方法,logcat将收到警告。例如:

I/dalvikvm﹕ Could not find method java.lang.String.isEmpty, referenced from method eu.lp0.slf4j.android.LoggerFactory.getConfig
W/dalvikvm﹕ VFY: unable to resolve virtual method 524: Ljava/lang/String;.isEmpty ()Z
D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0010
D/dalvikvm﹕ VFY: dead code 0x0013-0044 in Leu/lp0/slf4j/android/LoggerFactory;.getConfig (Ljava/lang/String;)Leu/lp0/slf4j/android/LoggerConfig;
如果您的应用程序试图执行设备不支持的代码,则会出现异常
NoSuchMethodError
ClassNotFoundException

W/dalvikvm﹕ Exception Ljava/lang/NoSuchMethodError; thrown during Lde/k3b/android/cellinfo/demo/CellInfoDemoActivity;.
下面是一个完整的logcat示例:

避免调用设备不支持的方法/类 您可以使用这样的代码

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
  // call method/class that is only available in HONEYCOMB and later
}
有关更多详细信息,请参阅