Создание приложений Android с несколькими SDK в Eclipse без потери времени компиляции

Я разрабатываю приложение для Android в Eclipse. Я хотел бы ориентироваться на широкий спектр устройств и версий SDK (например, я могу дополнительно поддерживать мультитач). Я понимаю рекомендуемый подход, заключающийся в том, чтобы изолировать все новые функциональные возможности от отдельного класса и использовать ленивую загрузку, чтобы загружать этот класс только во время выполнения, если хост-устройство действительно поддерживает эту функцию.

Недостатком этого подхода является то, что мне приходится компилировать весь мой код с помощью SDK новейшей функции, которую я хочу использовать. Это означает, что если какая-то новая функция просочится в мой "нейтральный к версии" код, компилятор больше не сможет ее перехватить.

Мне бы хотелось, чтобы в Eclipse была возможность скомпилировать мой проект со старым Android SDK, чтобы убедиться, что мой "нейтральный к версии" код подходит. Я хотел бы избежать перемещения моей системы сборки из Eclipse, если это возможно. Я согласен с тем, что сборка старого SDK немного неудобна в работе.

Я думаю, что это сводится к выполнению некоторого условного комплимента (или условного "связывания") внутри Eclipse? Например, в моем проекте при сборке с использованием SDK-1.6 я хотел бы исключить источник "MultiTouchHandler.java" из сборки. Однако я не уверен, что в Eclipse можно выразить подобные "типы сборки".

Похоже, что хакерское решение заключается в том, чтобы просто вручную изменить версию SDK проекта, перестроить и просмотреть ошибки, а также игнорировать "ожидаемые" ошибки. Похоже, что решением для перерасхода является написание моих собственных скриптов ant / maven / make build.

Смежные вопросы

Этот вопрос: управление версиями и общие кодовые базы в Eclipse охватывают аналогичную основу, но могут включать перемещение всех классов, зависящих от версии, в отдельные "библиотеки". (И я думаю, что в Eclipse у меня все еще будет проблема нескольких типов сборки).

Этот вопрос: сборка нескольких конфигураций проекта с помощью eclipse подразумевает, что я должен перейти на внешнюю систему сборки (например, ant или maven), но это гораздо больше, чем просто время от времени пытаться собрать сборку со старым SDK.

2 ответа

Решение

Обновления февраль 2012 (v17) для инструмента Lint в ADT должны помочь решить эту проблему, не требуя многократных сборок. Когда приложение нацелено на старый минимальный SDK, но скомпилировано с самым новым SDK (как рекомендуется), инструмент lint заметит, если вызовы к более новому SDK вызваны. Если вы уверены, что вызов в порядке (поскольку вы спрятали его за проверкой SDK_INT во время выполнения или чем-то еще), вы можете быстро исправить аннотацию, чтобы предотвратить предупреждение.

Например, в моем коде у меня есть вызов View.setSystemUiVisibility, который был представлен в API 11, но я нацеливаюсь на API 8. Запуск Lint показывает:

Для вызова требуется уровень API 11 (текущий минимум 8): android.view.View # setSystemuiVisibility

QuickFix предлагает два вида исправлений: добавление аннотации, которая подавляет предупреждение, или добавление аннотации, которая объявляет кусок кода как работающий в API 11.

Более подробная информация здесь: http://tools.android.com/recent/lintapicheck

Несколько менее чистый / менее производительный метод будет заключаться в использовании отражения для доступа к новым API, которые вам нужны, вместо того, чтобы пытаться ссылаться на них напрямую с ленивой загрузкой. Это должно позволить вам компилировать против более низкого уровня SDK.

Другие вопросы по тегам