Как объединить / объединить два файла AAR? - PullRequest
0 голосов
/ 01 марта 2019

Мой пример использования следующий:

  1. У меня есть библиотека aar (скажем, L1), предоставленная мне третьей стороной.Обратите внимание, что у меня нет источника для этого.
  2. Я хочу написать слой-обертку поверх L1 и создать еще один aar (SDK) (скажем, L2).L1 должен быть упакован внутри L2.Обратите внимание, что код в L2 минимален, он похож на оболочку для L1.
  3. Идея состоит в том, что если кто-то интегрирует этот SDK в свое приложение Android, приложение должно взаимодействовать только с L2, оно должнодаже не нужно знать, что L1 существует.По сути, я хочу, чтобы в файл приложения Gradle был включен только L2.

Мой вопрос: возможно ли это?Я посмотрел на несколько похожих вопросов о переполнении стека - я получил следующие возможные решения - но ни одно из них не показалось подходящим:

  1. Использовать плагин android-fat-aar - насколько я понимаю, этот плагин неработать с последними версиями Gradle и больше не поддерживается.Я использую Android Studio версии 3.3.1 и Gradle версии 4.10.1.Я думаю, что он также имеет некоторые другие ограничения неэффективной работы с файлами помощи.
  2. Некоторые ответы, по-видимому, указывают на публикацию aar в каком-либо хранилище, например, maven, и в этом случае это будет решено.Я не совсем уверен, правильно ли я это понял, но в любом случае публикация L1 или L2 в любом общедоступном репозитории для меня не вариант.

Итак, еще раз повторим следующие основные требования:

  1. Приложение должно вызывать только API-интерфейсы и взаимодействовать с L2.
  2. Приложению необходимо только включить зависимость L2 в свой файл Gradle?

Есть ли способ достичь этого с учетом упомянутых мною ограничений - это не обязательно должно быть путем слияния aars.

Возможно ли следующее / имеет ли смысл:

  1. Напишите код, необходимый для L2, и создайте из него банку.
  2. Извлеките L1 AAR (поскольку AAR в основном является архивом)
  3. Добавьте банку, созданную на шаге 1 выше, и создайте новый AAR.(скажем, L3), который включает в себя API-интерфейсы L2.
  4. Теперь приложению необходимо добавить в качестве зависимости и взаимодействовать только с одной зависимостью L3 (которая будет иметь API-интерфейса L2).

1 Ответ

0 голосов
/ 10 марта 2019

Мудро, если вы хотите скрыть L1, просто добавьте его в свой проект с помощью ключевого слова "реализация".Таким образом, он не попадет на путь потребителя.Теперь это не означает, что L1 мгновенно упаковывается в L2.Обычные бинарные файлы упаковывают только свои классы, и ожидается, что внешние классы будут поставляться из репозитория.Таким образом, у вас есть два возможных пути:

1.-Загрузите L1 и L2 в какое-то хранилище.Обратите внимание, что указанный репозиторий не обязательно должен быть публичным, вы можете установить свой собственный репозиторий и предоставить учетные данные пользователям.Это наименее болезненный путь в долгосрочном сценарии.

2.-Создайте убер аар / жир аар.Есть несколько плагинов, которые вы можете использовать для этого.Например это one , который находится в активной разработке.Или вы можете использовать плагин Maven для Android и создать L2 с помощью Maven;в этом случае любой плагин maven для Uber двоичных файлов должен работать.Плагин maven для Android совместим с форматом проекта gradle, поэтому вам потребуется только файл POM.Очевидно, что если вы используете дополнительные Gradle-плагины для сборки L2, это может оказаться невозможным.

3. Запакуйте все классы L1 внутри L2.Например, вы можете создать файл aar вручную.Предостережение в том, что обслуживание станет кошмаром.По сути, вы вернетесь к ANT-подобному сценарию, и существует множество причин, по которым люди избегают работать с муравьем.Если L1 изменится, будет больно.Кроме того, конечный файл не будет работать, так как вам нужно будет также отследить ВСЕ переходные зависимости L1 и добавить их в путь L2, чтобы они были импортированы.Если по какой-то причине люди, предоставившие вам L1, сделали что-то похожее, вы покорны.

4. - Предоставьте пользователям файлы L1 и L2, чтобы они добавили их в свои папки lib.В этом случае, даже если L1 импортируется как «реализация», он попадет в путь, так как практически все просто импортируют всю папку libs.

Все сказано, вам нужно выбрать яд.Моя рекомендация?Создайте частное репо (для этого вы даже можете использовать github).Это наименее болезненный вариант, вы можете ограничить доступ к пользователям в любое время, и если это необходимо для обработки пользовательских сборок для всех из них, это можно сделать, просто изменив artifactId / groupID.На всех других путях есть ошибки, которые в определенный момент доставят вам неприятности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...