Библиотека Android: файл класса не найден, когда «проект реализации» используется для зависимости модуля библиотеки - PullRequest
0 голосов
/ 20 октября 2018

Я работаю в проекте, который имеет 3 модуля, как показано ниже:

Project
|
|-- Common 
|
|-- SDK
|
|-- App

Common - это модуль библиотеки Android, от которого зависят все остальные модули, но мне не нужно его публиковатьв любом месте, потому что он содержит только общий код для других модулей.С другой стороны, SDK - это еще один проект библиотеки Android, который должен быть опубликован в нашей внутренней артефакте.

App - пример проекта SDK.Я могу опубликовать артефакт SDK без проблем, но когда я импортирую его в клиентское приложение, компиляция завершается неудачно, потому что ни один из классов из модуля Common не найден.

Для третьей сторонызависимости, от которых зависит модуль SDK, я использую implementation (например, implementation 'com.squareup.okhttp3:okhttp:3.11.0', и все эти зависимости успешно добавляются в файл SDK POM) и для зависимости от модуля Common, который я использую implementation project(path: ':Common').

В клиентском приложении, которое импортирует библиотеку SDK, компилятор показывает следующую ошибку

Error: cannot access Foo
class file for com.acme.Foo not found

(Foo является классом в модуле Common)

Почему при импортеSDK ни один из классов из модуля Common не найден?Я ожидаю, что компилятор объединит два модуля в один.Кто-нибудь знает, как я могу решить эту проблему?

(я знаю, что решение - это опубликовать Common на артефакте, но я не хочу этого делать, поскольку это только внутренний общий код).

Ответы [ 4 ]

0 голосов
/ 12 июля 2019

Я столкнулся с той же проблемой.

В моем случае я создал библиотеку kotlin и попытался добавить ее с помощью проекта Java.Поэтому, пожалуйста, убедитесь, что kotlin должен быть настроен для библиотеки.

Это работает для меня сейчас.

0 голосов
/ 08 ноября 2018

Это ожидаемое поведение для модулей Gradle;как вы и предполагали, публикация каждого как отдельного артефакта (и перечисление зависимостей в файле pom) является единственным поддерживаемым использованием.

Существует плагин, который может делать то, что вам нужно, на https://github.com/adwiv/android-fat-aar,но он больше не поддерживается, поэтому ваш пробег может отличаться.В качестве альтернативы, вы можете добиться аналогичных результатов, обновив исходные наборы SDK так, чтобы они указывали непосредственно на общие источники модулей, и полностью удалили зависимость gradle.Не могу найти хорошую ссылку для этого, но это должно быть возможно.Это удаляет всю встроенную обработку модулей, но может лучше соответствовать тому, как вы используете модуль.

0 голосов
/ 09 ноября 2018

У меня была похожая проблема.

Визуальная помощь заключается в использовании Android Studio собственного представления структуры проекта: enter image description here

Файл -> Структура проекта

Тогда для вашего :app вы можете проверить, что у вас есть modules dependencies:

enter image description here

Если вам нужно, вы можете удалить текущийЗависимости модуля и добавьте их снова только для двойной проверки.После этого, когда вы нажмете «ОК», gradle попытается синхронизировать свои файлы.

Таким образом, вы позволите Android Studio выполнить интеграцию всех модулей, и, надеюсь, это исправит вашу проблему.


PS: Я считаю, что вы импортируете свой проект неправильно.Вы должны использовать api вместо implementation.Из документации:

api: Когда модуль включает зависимость api, он сообщает Gradle, что модуль хочет транзитивно экспортировать эту зависимость в другие модули, чтобы он был доступеним как во время выполнения, так и во время компиляции.Эта конфигурация ведет себя так же, как компиляция (которая теперь устарела), и вы обычно должны использовать это только в библиотечных модулях.Это связано с тем, что, если зависимость API изменяет свой внешний API, Gradle перекомпилирует все модули, которые имеют доступ к этой зависимости во время компиляции.Таким образом, наличие большого числа зависимостей API может значительно увеличить время сборки.Если вы не хотите раскрывать API зависимостей для отдельного тестового модуля, модули приложения должны вместо этого использовать зависимости реализации.

Проверьте официальные документы: https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#new_configurations

0 голосов
/ 20 октября 2018

Repleace implementation project(path: ':Common') by api project(path: ':Common') О разнице между API и реализацией вы можете проверить эту статью .

...