Насколько разумным является Eclipse/ADT, когда речь идет о проектах библиотеки Android?

Итак, у меня есть несколько классов стиля "Utility" в некоторых моих проектах. Мне любопытно, могу ли я перенести их в проект библиотеки Android, который содержит весь или большинство моего кода, не относящегося к конкретному приложению (в основном оболочки и интерфейсы).

Итак, мой вопрос заключается в том, что происходит с файлами, которые мне не нужны в этой библиотеке. Я знаю, что проекты библиотеки Android в основном просто копируют свой код в другой проект, поэтому, если я скажу, что использую 25% кода в моей библиотеке общего назначения, мое приложение фактически содержит байт-код для всех 100%, или это правильно это только для того, что мне нужно.

В прошлом у меня были некоторые проблемы с неиспользуемыми классами в Proguard, поэтому я просто один раз укусил, дважды застенчивый с ADT...

Ответ 1

К сожалению, все ваши проекты будут расти, когда библиотека станет больше - даже если большинство содержимого этой библиотеки не используются. Я сам тестировал это, создав приложение A и библиотеку L. Если L - библиотека, используемая в A, файл classes.dex(и, следовательно, файл A.apk) растет, если я добавляю больше классов, даже если они не являются б.

Подводя итог: прямо сейчас я бы создал базовую библиотеку для небольших вещей, которые могут использоваться многими проектами, и создать новую библиотеку для каждого нового компонента, который будет больше и используется только некоторые проекты. Хорошим кандидатом для новой библиотеки будет новый компонент пользовательского интерфейса с несколькими изображениями, определенными в ресурсах. Хорошим кандидатом на базовую библиотеку являются обычно используемые методы и такие вещи, как файловые кеши, например. Скомпилированный код достаточно сжат для Dalvik, который вы можете увидеть здесь . (Вся презентация на самом деле забавно смотреть: -)

Изменить: если ProGuard активирован, он также удалит неиспользуемый код для вас. Достаточно proguard.cfg по умолчанию. Он не будет запускаться при построении отладки (по умолчанию), но при компиляции окончательного .apk. Так что это действительно возможно!

Ответ 2

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

Ответ 3

Обратите внимание, что проекты библиотеки Android также сильно страдают при работе с ресурсами. ADT будет восстанавливать R.java один раз для каждой библиотеки, и каждый R.java будет содержать копию всех идентификаторов ресурсов из всех библиотек. Основная проблема здесь в том, что ресурсы регенерируются для всего проекта в целом, и нет никакой возможности "создать банку" для зависимости, как можно было бы ожидать с обычными "библиотеками". Мы попытались интегрироваться с OpenFeint и имели все виды ада, связанные с библиотеками и зависимостями. Я думаю, что мы закончили просто слияние всех исходных и ресурсных файлов OpenFeint в наш собственный проект и отключение проекта "Библиотека", поскольку он предлагал мало ценности.

Проекты библиотеки Android являются неуклюжим способом совместного использования кода между проектами и имеют ряд недостатков. Я обнаружил, что все, что было выполнено с помощью проекта библиотеки, также можно выполнить с помощью символических ссылок (источник символических ссылок на два проекта). Я еще не нашел usecase, где проект Android Library предложил нечто, что было нелегко реплицировать другими, менее хрупкими средствами.