Как включить исходники одного модуля внутрь другого, не копируя банку с помощью Gradle?

Я хотел бы разделить проект библиотеки Android на модули. Предполагаемая структура проекта:

├─ androidLibraryModule
│
├─ kotlinLibraryModuleA
│
└─ kotlinLibraryModuleB

Где androidLibraryModule зависит от kotlinLibraryModuleA и kotlinLibraryModuleB:

dependencies {
    implementation project(":kotlinLibraryModuleA")
    implementation project(":kotlinLibraryModuleB")
}

Единственное, что я опубликую, это .aar, который является результатом сборки androidLibraryModule, и я хотел бы, чтобы он включал код из kotlinLibraryModuleA и kotlinLibraryModuleA. Единственный способ, который я нашел до сих пор для достижения этой цели, — это скопировать файлы .jar kotlinLibraryModuleA и kotlinLibraryModuleB в папку libs androidLibraryModule следующим образом:

task copyJar(type: Copy) {
    from jar
    into "${project(":androidLibraryModule").projectDir.absolutePath}/libs"
}

jar.finalizedBy(copyJar)

Это решение работает, но немного похоже на взлом. Это единственное решение или есть лучший способ добиться этого результата?

РЕДАКТИРОВАТЬ: если бы androidLibraryModule был модулем приложения для Android, это просто работало бы без необходимости задачи копирования.


person Sir Codesalot    schedule 20.10.2020    source источник


Ответы (1)


Дело в том, что aar по умолчанию содержит только код и ресурсы из своего модуля. Когда вы создаете приложение, модуль библиотеки передает свои зависимости приложению, поэтому все классы включаются в окончательный apk.

Если вы хотите опубликовать только библиотеку как aar, у вас есть 2 варианта:

  • Включите зависимости в виде jar внутри — это называется толстым jar/aar (быстрый поиск нашел несколько подобных плагинов, но у меня нет опыта ни с одним из них, так что вам нужно будет убедиться в этом самостоятельно)
  • Если вы публикуете библиотеку в maven, вы можете указать ее зависимости в pom.xml, например. этот ответ: зависимости библиотеки Android отсутствуют в POM с Gradle
person ferini    schedule 20.10.2020
comment
Я знаю об этих двух вариантах, как вы можете видеть в вопросе, я использую первый (я сам напишу плагин, если это единственный способ). Мой вопрос: есть ли другой способ, и если нет, то почему? Почему модуль приложения отличается от модуля библиотеки? - person Sir Codesalot; 20.10.2020