Как эффективно поддерживать 2 проекта с небольшим различием в коде?
=====================================================================

 У нас сначала был только 1 проект, но со временем появилась необходимость сделать такое же приложение с брендированием клиента (другими словами, White-label product). Единственными отличиями от первоначального проекта были цвета, ресурсы и код некоторых классов.  
  

Я принял решение сделать копию ветки в Git и внедрять изменения. В результате сейчас у меня есть 2 приложения, где дублирование кода составляет около 95%. Главная проблема в том, что делать изменения в одинаковом для приложений коде очень время затратно, так как эти две ветки невозможно смерджить (merge). У них разный пакет, а название пакета в Android соответствует пути к файлам на диске. Соответственно, все файлы просто находятся в разных директориях.  
  

Я обратил внимание на [Product Flavors](https://developer.android.com/studio/build/build-variants.html#product-flavors).  Это решает вопрос «как поддерживать 2 проекта в одной git ветке», но не совсем понятно как эффективно вносить изменения. Если у меня есть 2 класса, что незначительно отличаются, я должен хранить их в разных директориях чтобы Gradle смог подхватить нужный файл при сборке.   
  

Но как эффективно вносить изменения в общий код для этих файлов? Возможно, вы сталкивались с такой проблемой раньше. 

 Сделайте [fork](https://help.github.com/articles/fork-a-repo/). 

 У меня есть 3 проекта на одном коде. Я вынес весь системный (одинаковый) код в субрепозиторий. Таким образом разные цвета мержить не приходится, так как они в разных проектах.  

А если я в одном из проектов пофиксил системный код, то он улучшится сразу в трёх проектах, при ближайшем адейте. 

 А если весь одинаковый код внести в отдельную ветку. Потом Создать другую ветку для первого продукта, и ещё одну для второго.  

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

 Мы с помощью git cherry-pick переносим коммиты с "новыми фичами" в нужные ветки. 

 Мог бы написать длинный ответ, но, к счастью Ханнес Дорфман пару месяцев назад уже изложил всю мою боль по поводу поддержки двух проектов с относительно общей кодовой базой в [своей статье](http://hannesdorfmann.com/android/from-prefabricated-house-to-lego-house), поэтому посылаю вас к нему. 

 В одном проекте студии создать модуль в котором находиться общий код.   

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

Связать эти модули и все.  

Использую данный подход для поддержки 14 приложения в которых отличаются только темы оформления, названия, иконки и БД.  
  

Разные классы в проектах можно реализовать через интерфейс.