Использование интерфейсов 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"
}
Это далеко не идеально, но, по крайней мере, можно использовать для решения моей проблемы.