Может ли JAR-библиотека Android быть в зависимости от библиотеки Android AAR?

У меня есть проект библиотеки Android FooLib . FooLib ссылается на такие вещи, как Android Context но не требует каких-либо файлов ресурсов (вещи в res/ ), поэтому я в настоящее время упаковываю это как JAR для моего приложения, чтобы потреблять.

Теперь я хочу, чтобы FooLib зависел от BarLib , но BarLib действительно использует ресурсы, поэтому я не могу упаковать BarLib как JAR. Вместо этого он упакован как AAR. Возможно ли, чтобы FooLib зависел от BarLib но продолжает упаковывать FooLib как JAR? Или, если зависимость AAR в FooLib заставляет меня сделать это AAR?

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

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

Если вы говорите о библиотечных модулях в многомодульном проекте в среде IDE, это другое дело. Если у вас есть модуль A, который может скомпилировать простой JAR (он использует apply plugin: 'java' в файле сборки), то он не может зависеть от модуля Android ( apply plugin: 'android-library' ) Который компилируется в AAR. Вероятно, это никогда не будет исправлено или, по крайней мере, не в обозримом будущем: это связано с тем, что модули Android имеют гораздо более сложное представление об исходных папках, а плагин Java в Gradle не может понять исходные наборы Android.

Обратное верно, хотя – модули Android могут зависеть от простых модулей Java.

ЗАМЕТКА

Из-за ограничений, еще не разрешенных в Gradle builder, вы не можете получить доступ к локальным AAR таким же образом, как и JAR в ваших файлах сборки (путем ссылки на них с помощью compile files(...) ); Вам нужно обмануть Gradle, подумав, что они находятся в каком-то репозитории Maven (возможно, помещая их в реальный репозиторий Maven, который может быть локальным). См. Добавление локальных .aar-файлов в мою сборку градиентов для обходного пути, если вам это нужно.

Поскольку формат AAR не содержит классы напрямую, как файлы jar, это не подходит для проекта без Android. Поэтому было бы лучше сделать FooLib AAR.

Другим решением было бы извлечь библиотеку jar из BarLib и зависеть от нее.