Несколько приложений с общей базой кода - PullRequest
13 голосов
/ 01 марта 2012

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

Начиная с r14, мы можем использовать библиотечные проекты с ресурсами, так что, насколько я могу судить, это было бы отличным решением этой конкретной проблемы. Поэтому я ознакомился с проектами библиотек и заключениями, и мне любопытно узнать, какое минимальное количество файлов требуется в проектах разных версий. Мои вопросы поэтому:

  • Могу ли я иметь весь код в общем проекте и иметь голый проект с просто манифестом?
    • Если так, я должен? это оптимальный путь концептуально? (кроме того факта, что это зависит от моей кодовой базы)
  • Как мне обращаться с именами пакетов библиотеки, существуют ли особые правила?
  • Существуют ли инструменты, позволяющие сравнивать код из двух разных проектов и, возможно, объединять их автоматически или автоматически, и какой вариант предпочтительнее?

Ответы [ 2 ]

9 голосов
/ 25 марта 2013

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

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

Даже если это не так, при использовании полиморфизма способами, описанными ниже, ваши различные приложения могут существенно различаться и по-прежнему использовать общую библиотеку проектов.

Библиотека проектов может бытьопределяется в Eclipse так же, как может быть определен любой проект Android, но он помечен как библиотека проекта (отметив флажок «Библиотека» в нижней части страницы Android в диалоговом окне «Свойства проекта» библиотеки) и не может быть скомпилировани бежать самостоятельно.Вместо этого он предназначен для включения по ссылке в один или несколько других проектов, которые являются реальными приложениями (путем добавления ссылки на него на странице Android в диалоговом окне «Свойства проекта» каждого такого приложения).Эти приложения будут использовать библиотеку проектов и, таким образом, будут делиться своим кодом и возможностями.

Каждое такое ссылочное приложение будет иметь свой собственный файл манифеста (где могут быть объявлены их соответствующие различные пакеты), и они также могут определятьих собственные классы (включая классы, производные от классов Activity и / или Application из библиотеки Project), так что эти классы могут быть полиморфно специализированы для каждого приложения, использующего библиотеку Project (например, путем переопределения методов или предоставления определений для методов, которыеопределены как абстрактные в классах Project или Application-based библиотеки проекта, хотя вы также можете использовать эти классы библиотеки без изменений (при условии, что они не являются абстрактными), просто ссылаясь на них в файле манифеста (например, в операции илитег приложения) каждого приложения, которое использует библиотеку, так же, как вы бы ссылались на классы Activity или производные от приложения классы, определенные в самом приложении.

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

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

Что касается именования пакетов, любое старое имя пакета будет работать для проекта библиотеки, но, конечно, имеет смысл использовать то же самоепрефикс для пакета библиотечного проекта, который вы используете для своих отдельных (например, бесплатных и платных) приложений, которые его используют, с чем-то вроде «.library» в качестве последней части имени, в то время как различные приложения могут иметь такие окончания, как «.myappfree "и" .myapppaid ".Естественно, вы захотите использовать соглашение об обратном доменном имени для префикса пакета библиотеки, чтобы предотвратить конфликты, так же, как и для имени пакета выпущенного приложения.

В Windows - хороший инструмент с открытым исходным кодом.для сравнения кодовых баз есть WinMerge:

http://winmerge.org/

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

Наконец, в качестве альтернативы, вы можете рассмотреть возможность использования одного бесплатного приложения, которое по умолчанию имеет возможности вашего бесплатного приложения, с возможностью обновления.к полным возможностям вашего приложения (поставляется в одном и том же APK) через платеж внутри приложения, а не через отдельные бесплатные и платные приложения.Платежи в приложениях значительно улучшились за последние несколько месяцев (с выпуском версии 3 IAB), и хотя некоторые глюки все еще существуют, они стали более практичной альтернативой дихотомии free / full, чем были впервый.

8 голосов
/ 01 марта 2012
  1. Да, у вас может быть проект, который по сути является просто манифестом, определяющим имя приложения, пространство имен, значок и т. Д., Со всем актуальным кодом и 99% ресурсов в проекте библиотеки.

  2. Да, я думаю, вы должны использовать этот подход.Для решения проблемы бесплатного / платного приложения очень часто используются библиотечные проекты.

  3. У меня не было проблем с именами, хотя вы должны быть осторожны с любыми ресурсами в отдельных проектахчтобы не использовать одни и те же имена.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...