Я новичок в разработке Android и хотел немного узнать об инструменте Lint и проверке NewApi. Однако после некоторых тестов я немного запутался.

После создания нового проекта Android-приложения в IntelliJ IDEA я добавил код в метод onCreate, и теперь он выглядит так:

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Display d = getWindowManager().getDefaultDisplay();
    Point size = new Point();

    d.getSize(size); // API level 13
    isDestroyed(); // API level 17

    NativeActivity nativeActivity = new NativeActivity(); // API level 11
    nativeActivity.getContentResolver(); // API level 11
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); // API level 9
    boolean canDisableShutterSound = cameraInfo.canDisableShutterSound; // API level 17
}

В файле манифеста у меня есть

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="17" />

После компиляции проекта и запуска lint из командной строки:

lint --check NewApi --classpath c:\_dev\TestNewApi\out c:\_dev\TestNewApi

Я получил следующий результат:

Scanning TestNewApi: .......
out\production\TestNewApi\com\example\TestNewApi\MyActivity.class: Error: Call requires API level 9 (current min is 7): android.app.NativeActivity#getContentResolver [NewApi]
out\production\TestNewApi\com\example\TestNewApi\MyActivity.class: Error: Call requires API level 9 (current min is 7): new android.app.NativeActivity [NewApi]
out\production\TestNewApi\com\example\TestNewApi\MyActivity.class: Error: Call requires API level 9 (current min is 7): new android.hardware.Camera.CameraInfo [NewApi]
out\production\TestNewApi\com\example\TestNewApi\MyActivity.class: Error: Field requires API level 9 (current min is 7): android.hardware.Camera.CameraInfo#canDisableShutterSound [NewApi]
4 errors, 0 warnings

Так что никаких претензий к методам getSize и isDestroyed нет. И после изменения minSdkVersion на 9 результат проверки:

Scanning TestNewApi: .......

No issues found.

Мне кажется, что в обоих случаях проверяются только классы, и если класс был введен в minSdkVersion или после него, то все в порядке. Это ожидаемое поведение? А может я что-то упускаю?

1
Arek Dygas 9 Июн 2013 в 17:05

1 ответ

Лучший ответ

Это ожидаемое поведение?

ИМХО нет. Я вижу такое же поведение в Eclipse, и ИМХО, это ошибка. Обычно Lint будет жаловаться на методы, которые новее, чем ваши android:minSdkVersion или @TargetApi(). Я не совсем уверен, почему здесь этого не делают.

Я подал проблему, связанную с этим.

1
CommonsWare 9 Июн 2013 в 17:22
Спасибо! Судя по поданной вами проблеме, я теперь знаю, что это должно работать в следующем выпуске.
 – 
Arek Dygas
9 Июн 2013 в 21:28
@ArekDygas: Одна из приятных вещей в регистрации ошибок, связанных с инструментами, заключается в том, что мы часто получаем отзывы, и мы часто получаем их довольно быстро. :-)
 – 
CommonsWare
9 Июн 2013 в 21:35
Полезно знать - в следующий раз я, наверное, начну с регистрации проблемы :)
 – 
Arek Dygas
9 Июн 2013 в 22:00