2011-02-10 2 views
11

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

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

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

ответ

4

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

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

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

+0

Спасибо за отзыв - из любопытства, вы пробовали с или без ProGuard? - Я слышал, что он может удалить неиспользуемые классы, и мне любопытно, как это влияет на вещи. Большинство моих вещей в библиотеке - это код, а не образы ресурсов, поэтому я думаю, что вы можете сказать, что это не огромная проблема. – camperdave

+0

Я обновил свое сообщение: если ProGuard активирован, он удалит ненужный код для вас в финальной версии сборки. :-) – mreichelt

+0

Спасибо за обновление, вы отлично ответили на мой вопрос. Установите флажок: P – camperdave

0

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

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

1

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