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