Аннотация уровня API Android для библиотек Android

Я пишу библиотеку Android. Подавляющее большинство интерфейса в библиотеке поддерживает Android API уровня 10 или выше. Однако для некоторых функций требуется более высокий уровень API. Например, часть библиотеки требует API 18 для Bluetooth Low Energy.

Для конкретности предположим, что библиотека производит три классаClassA, ClassB а такжеClassC. ClassA использует функциональность, доступную в API 10,ClassB использует функциональность, доступную в API 14 иClassC использует функциональность, доступную в API 18.

Я хочу иметь возможность вызывать проблему ворса (предупреждение / ошибка) всякий раз, когда кто-то использует класс из моей библиотеки, не имея требуемого уровня API в своем проекте (если только он не подавляет предупреждение с соответствующей аннотацией), аналогично уже встроенному в выпуске NewApi используется lint.

После поиска я нашел следующие возможные решения:

1) Это решение не в духе линейки: разбейте библиотеку на три файла .jar, скажем,lib_10.jar это включает в себя все классы, использующие функциональные возможности, доступные в API 10 (ClassA в примере),lib_14.jar который включает в себя все классы с использованием функциональности, доступной в API 14 (ClassB в примере) иlib_18.jar это включает в себя все классы, использующие функциональность, доступную в API 18 (ClassC в примере). Это решение допускает переносимость, но усложнит последующую поддержку кодовой базы и потенциально потребует также некоторого дублирования кода.

2) Создайте мою собственную аннотацию (скажем,@RequireAndroidApi(API_LEVEL) указание минимального уровня API, требуемого аннотированным классом / методом / и т. д.), и используйтеlint-api.jar (http://tools.android.com/tips/lint-custom-rules) создавать собственные правила lint, которые проверяют использование любых аннотированных классов / методов / и т. д. с более низким API, чем требуется. Что-то, что позже будет выглядеть так:

@RequireAndroidApi(10)
Class ClassA {
}

@RequireAndroidApi(14)
Class ClassB {
}

@RequireAndroidApi(18)
Class ClassC {
}

Проблема в том, что я не смог найти хорошую документацию для API lint, и кажется, что он заново изобретает колесо для функции, которая уже поддерживает lint (lint уже проверяет проблему «NewApi»).

3) Наконец мне удалось отредактировать<SDK>/platform-tools/api/api-versions.xml чтобы указать уровень API, требуемый для каждого класса, следующим образом:

<api version="1">
    ...
    <class name="package/path/ClassA" since="10">
        <extends name="java/lang/Object" />
        <method name="&lt;init>()V" />
    </class>
    <class name="package/path/ClassB" since="14">
        <extends name="java/lang/Object" />
        <method name="&lt;init>()V" />
    </class>
    <class name="package/path/ClassC" since="18">
        <extends name="java/lang/Object" />
        <method name="&lt;init>()V" />
    </class>
</api>

Это вызвало то, что lint вызвал проблему NewApi таким же образом, как это было бы с API-интерфейсами Android. Мне нравится этот тип решения, потому что он не изобретает велосипед, и в дальнейшем любые ошибки, возникающие таким образом, будут использовать предложенные решения, запрограммированные в Eclipse или Android Studio, для решения проблемы (то есть «быстрые исправления» в Eclipse). Проблема с этим решением в том, что оно требует редактированияapi-versions.xml поставляется с Android SDK, что делает это решение не слишком переносимым для выпуска библиотеки по нескольким причинам, включая: a)api-versions.xml файл не является локальным для проекта и изменяет поведение lint для всех проектов Android, включая те, которые не используют библиотеку; и б)api-versions.xml будет перезаписываться при каждом обновлении SDK из диспетчера Android SDK, который будет перезаписывать любые сделанные изменения.

Мне было интересно, есть ли более простое решение для достижения этого "минимального количества ошибок / предупреждений API" или есть способ написать отдельный файл, похожий наapi-versions.xml который может быть помещен в каталог проекта, который может быть прочитан lint при каждом запуске lint в рассматриваемом проекте (что-то похожее наlint.xml).

Спасибо за терпение во время этого подробного описания проблемы, и я заранее благодарен за любую помощь.

Ответы на вопрос(2)

Ваш ответ на вопрос