Использование интерфейсов AIDL для модулей / подпроектов в Gradle

у меня есть проект, состоящий из нескольких модулей gradle (плагин com.андроид.библиотека), ссылающиеся друг на друга (дерево, а не плоское). Я интенсивно использую AIDL, и поэтому случается, что я ссылаюсь на интерфейсы AIDL из одного модуля (modA) в интерфейсе AIDL в другом модуле (modB).

modA / src / main/aidl/modA / foo.AIDL по:

package modA; 
interface foo {
    void modAcall();
}

modB / src / main/aidl/modB / bar.AIDL по:

package modB;
import modA.foo;
interface bar {
    foo modBcall();
}

modB / build.Gradle в:

dependencies {
    compile project(':modA')
}

Я могу ссылаться на parcelables modA в AIDL файлах в modB и я могу ссылаться на интерфейсы modA в java-коде в modB, но не в AIDL в modB. Вместо этого сообщение об ошибке couldn't find import for class отображается инструментом aidl.

Я заметил, что .AAR-файлы также не содержат информации об интерфейсах AIDL библиотеки, перечислены только parcelables. Я предполагаю, что это имеет ту же причину, что и проблема, описанная выше.

поскольку у меня уже есть файлы aidl в одном месте, я не хочу копировать их в другое подпроект, потому что в этом случае изменения должны быть скопированы вручную. Мне также не нравится идея использования символических ссылок для этого, потому что неправильно изменять каталог src modB, чтобы включить что-то из modA.

  • есть ли способ включить интерфейсы aidl в aar, чтобы он мог использоваться другими модулями?
  • можно ли расширить путь включения aidl в Gradle, чтобы использовать файлы AIDL модуля зависимостей (для подпроектов это должно быть возможно, поскольку файлы aidl присутствуют в файловой системе) без" компиляции " их снова (файлы классов сгенерированного интерфейса/классов java уже включены в импорт AAR/module)?

1 ответов


Я нашел решение. Существует, по-видимому, недокументированная функция в инструментах сборки Android gradle для включения произвольных файлов aidl в выходные данные .файл aar. Это позволяет ссылаться на них в других подпроектах.

android {
    aidlPackageWhiteList "modA/foo.aidl"
}

Это далеко не идеально, но, по крайней мере, можно использовать для решения моей проблемы.