Создание проекта Android с помощью ant, имеющего зависимость проекта библиотеки от другого проекта библиотеки

У меня, возможно, это не очень распространенная настройка:

( >= зависимость)
Проект Android > Проект библиотеки Android 1 > Проект библиотеки Android 2
Поэтому у меня есть проект библиотеки Android, который имеет зависимость от другого проекта библиотеки.

Когда я строю проект в Eclipse, все работает отлично, но я не могу заставить свою сборку работать с Ant.

Первый Ant компилирует проект библиотеки Android 2, который генерирует class.jar и помещает этот файл в папку bin.
Затем Ant пытается скомпилировать проект библиотеки Android 1, но затем я получаю ошибки, потому что у него отсутствуют классы из проекта библиотеки Android 2.

Ну, это не так странно, потому что файл jar не включен в папки libs. Но в project.properties я сделал зависимость от проекта библиотеки 2, поэтому почему Ant не копирует классы .jar в папки libs проекта библиотеки 1?

Ну, я могу подумать о решении использовать задачу Ant для копирования файла в папку libs, но тогда мне нужно изменить файл build.xml, который я не предпочитаю.

** РЕДАКТИРОВАТЬ

Проблема в том, что класс R отсутствует, когда я смотрю в classes.jar, этот java файл не содержит R-класс. Таким образом, мое решение будет неэффективно работать.

Ответы

Ответ 1

Это поведение было вызвано изменением в R17 инструментов построения: http://tools.android.com/recent/dealingwithdependenciesinandroidprojects

Вкратце: файлы R для библиотек больше не упаковываются в classes.jar для этой библиотеки. Однако, поскольку pareent.R для родительской библиотеки (project1 в вашем примере) также содержит ссылки на ресурсы для "дочерней" библиотеки (project2 в вашем примере), вам не нужно ссылаться на child-R в любом случае.

Замените все операторы export2.R-import в project1 с помощью операторов import1.R, и вы должны быть в порядке.

Ответ 2

Для ant для компиляции зависимости add в ant.properties. например:

android.library.reference.1=../path/to/library

Ответ 3

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

Например; выполните шаблон моста, чтобы перевести вызовы между обеими библиотеками, и приложите их к проекту Android. Таким образом, у вас нет кода в любой библиотеке, которая зависит от другой, и единственным проектом, который должен обрабатывать настройку зависимостей, является ваш основной проект.

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

Вот еще одна хорошая статья о применении шаблона моста в Java: http://java.dzone.com/articles/design-patterns-bridge

Ответ 4

Ну, проблема в том, что класс R отсутствовал.
Поэтому я удалил зависимость класса R между двумя библиотечными проектами.
Я не знаю, исправлено ли это, но я считаю, что это плохая практика.

Без этой зависимости Ant строит отлично.

Ответ 5

Старый вопрос, но, как и я, другие могут ударить головой об этом...

Официальным ответом является "это не может быть сделано", в частности:

При времени сборки библиотеки объединяются с приложением по одному, начиная с самого низкого приоритета и заканчивая наивысшим. Обратите внимание: библиотека не может сама ссылаться на другую библиотеку и что во время сборки библиотеки не сливаются друг с другом, а затем сливаются с приложением.

(извлечен из официальной документации: "Ссылка на проект библиотеки" ).

Это означает, что все идет, так как нет "чистого" способа сделать это с помощью инструментов (и грязные методы в порядке).

Надеюсь, что это поможет