Краткая форма: Каковы некоторые способы организации кода/POM для AAR, так что приложения, использующие этот AAR, имеют только зависимости, которые им действительно нужны?Gradle для Android, AAR и условные зависимости
Длинная форма:
Предположим, что у нас есть приложение, которое зависит от проекта Android библиотеки упаковываются в AAR (L).
L содержит смесь классов, и любое данное приложение (например, A) будет использовать только подмножество этих классов. Например:
L может содержать
Fragment
реализации для нативного уровня API 11 фрагментов, портированные фрагменты и ActionBarSherlock-приправленных фрагментыL может содержать
Activity
реализации для регулярных мероприятий,FragmentActivity
,ActionBarActivity
и ActionBarSherlock-ароматизированная деятельностьL может вызывать события через
LocalBroadcastManager
, Square Отто и greenrobot в EventBusИ так далее
Эти случаи имеют два основных сходств, как я это вижу:
приложения обычно заботятся только о некоторых из классов. Например, приложение, использующее Otto, не заботится о коде, который ссылается на EventBus greenrobot, или на приложение, которое использует
ActionBarActivity
, не будет заботиться о ActionBarSherlock.Если AAR является артефактом в репо, приложениям не понадобятся все возможные зависимости вверх, которые необходимы для построения AAR. Например, приложению, которое использует исходный уровень API 11 фрагментов не нужно будет
support-v4
илиactionbarsherlock
, хотя сама AAR нуждается в них, чтобы построить AAR
Если бы мы должны были пойти с JAR-файлами вместо AARS и свалками управление зависимостями, это довольно просто. Построение JAR будет иметь зависимости от времени компиляции (например, support-v4
). Однако приложения, использующие этот JAR, могут пропустить эти зависимости, и пока эти приложения не используют классы, которые действительно нуждаются в этих зависимостях, жизнь хороша.
Однако у меня возникли трудности с тем, как сделать то же самое с артефактами AAR и Maven, указанными в файле build.gradle
. Если L имеет блок dependencies
, ссылающийся на зависимости вверх, приложения будут, в свою очередь, загружать эти зависимости транзитивно, когда приложения зависят от L.
Одним из решений, которое, я уверен, будет работать, является разделение L на несколько библиотек. Например, используя сценарий фрагмента, мы могли бы иметь:
L1, который содержит реализацию для нативной версии фрагментов Level API 11, плюс любой общий код, необходимый для других сценариев. У этой библиотеки не было бы зависимостей вверх по течению.
L2, который содержит реализацию, которая использует backport фрагментов Android Support. L2 будет иметь зависимости от L1 и от
support-v4
.L3, который содержит реализацию, в которой используются фрагменты с ароматом Шерлока. L3 будет иметь зависимости от L1 и
actionbarsherlock
.
Затем приложение будет выбрать, будет ли зависеть от L1, L2 или L3, и, следовательно, только получить необходимые вверх по течению зависимостей (если таковые имеется).
Мой вопрос: это лучшее решение? Или есть что-то еще в мире Gradle для Android, AAR и артефактов в стиле Maven, которые позволят приложениям зависеть от одного L? Я обеспокоен возможными комбинаторными взрывами библиотек для обработки разнообразного сочетания зависимостей вверх. Я также обеспокоен необычными приложениями, которые на самом деле do нуждаются в нескольких реализациях, и можем ли мы надежно определять зависимости для них (например, приложение в зависимости от L1 и L2, потому что это то, что автор этого приложения считает нужным для приложения) ,
Я знаю, что есть способы для приложения к
блоку
исключить зависимостей (см ответа Джозефа Эрла синтаксиса), так что приложение может зависеть от L, но затем блокирует actionbarsherlock
вверх по течению зависимости, если она не нужна , Хотя это может сработать, в тех случаях, когда я являюсь автором L, я предпочитаю подход L1/L2/L3, поскольку это кажется более чистым.
Любые другие предложения?
Я голосую за отделенные библиотеки, даже если он сильно болит в поддержке. Не нужно упоминать L1, поскольку L3 имеет транзитивную зависимость от L1 –
Что означает аббревиатура AAR? – gunar
@gunar: Android ARchive – CommonsWare