Android Dalvik Проверка в Эклере - PullRequest
       13

Android Dalvik Проверка в Эклере

1 голос
/ 01 сентября 2011

Недавно я изучал фрагментацию уровней 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!

1 Ответ

3 голосов
/ 01 сентября 2011

Начиная с Android 2.0, верификатор Dalvik умнее проверяет только те классы, которые фактически используются во время работы.

При этом показанный здесь код будет работать, только если вы никогда не коснетесь класса CameraActivity при работе настарые версии платформы.Учитывая, что это не то, что вы показываете, объяснение может состоять в том, что на некоторых старых сборках платформы этот API был, но еще не доступен в SDK.

...