Недавно я изучал фрагментацию уровней API и нашел отличный учебник по поддержке различных уровней API в вашем исходном коде:
Как указано в руководстве, во избежание ошибок во время выполнения при использовании более новых классов / методов, чем уровень API, следует проверить уровень API и использовать отложенную загрузку.
Я проверил код и могу подтвердить, что на Android <2.0 вы должны использовать отложенную загрузку, чтобы избежать VerifyError. Что было для меня большим сюрпризом, так это то, что в 2.1 ленивая загрузка больше не нужна. </p>
Я буду использовать метод Camera.setDisplayOrientation
, чтобы продемонстрировать проблему. Метод был введен в Froyo 2.2.
import android.hardware.Camera;
...
public class CameraActivity extends Activity implements SurfaceHolder.Callback{
Camera mCamera;
...
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h){
final int APIversion = Integer.parseInt(Build.VERSION.SDK);
if (APIversion >= Build.VERSION_CODES.FROYO){
camera.setDisplayOrientation(90);
}
...
}
}
Код скомпилирован с использованием Froyo Compiler (API 8)
При подозрении на запуск APK на Android версии <2.0 я получу исключение VerifyError при запуске CameraActivity. </p>
Но что меня удивляет, так это то, что когда я запускаю тот же APK на Eclair 2.1 , приложение загружается без проблем. И я дважды проверил интерфейс камеры и обнаружил, что метод setDisplayOrientation был представлен только в Froyo 2.2.
Напротив, если я попытаюсь вызвать метод, я получу исключение, т.е.
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h){
final int APIversion = Integer.parseInt(Build.VERSION.SDK);
camera.setDisplayOrientation(90);
}
Вкл. Эклер Это выбросит NoSuchMethodError
.
Почему это работает? Это как-то связано с отключением проверки класса?
PS : я проверил, что setDisplayOrientation действительно не существует в Eclair 2.1. Я сделал это, пытаясь удалить проверку Build Version SDK перед вызовом метода. Если я просто вызову метод, я получу исключение NoSuchMethod. Но если IF есть, я не получаю VerifyError!