Управление кодом / сборкой для магазинов приложений Android (Google / Amazon / и т. Д.)? - PullRequest
18 голосов
/ 22 марта 2012

У меня есть приложение для Android, которое загружается в основном с Android Market (сейчас Google Play). Мы внесли несколько изменений в исходный код, а также отправили его в Amazon App Store, чтобы узнать, какую тягу он получает. Сейчас я ищу устойчивый способ разработки из общей базы кода и, в то же время, сборки, чтобы я мог подчиниться как одному, так и обоим.

Магазин Amazon имеет некоторые ограничения в отношении доступных API, и поэтому я хотел бы условно удалить / изменить функции из этой версии. Поскольку Java не поддерживает традиционную условную компиляцию и условное включение файлов в Eclipse не кажется тривиальным (возможно ли даже это?), Я хотел спросить, что делают другие, чтобы решить эту проблему.

Конечно, я не эксперт по Eclipse / Java, поэтому не стесняйтесь учить меня.

Что я ищу в решении:

  • Сборка / отладка с использованием Eclipse.
  • Файлы статического кода с переключателями окружения / настроек для управления тем, что нужно строить.
  • Нет дублирующего кода или условной логики в коде для выбора потока кода во время выполнения

Это то, что вы решили специально для приложений Android или для других проектов на основе Java / Eclipse? Предложения с чего начать?

Ответы [ 4 ]

10 голосов
/ 02 апреля 2012

Это довольно легко сделать в новейших версиях ADT (версия 17), хотя я нахожу, что это делает сборку немного длиннее:

  1. Создайте новый проект Android ( proj-A )
  2. Перейдите в Project-> Properties, выберите Android и установите флажок «Есть библиотека»
  3. Переместите весь свой общий код в proj-A , импортвсе необходимые библиотеки
  4. Создание нового проекта Android для Google Play ( proj-B )
  5. Перейдите в Project-> Properties, выберите Android и добавьте Proj-A для библиотеки
  6. Повторите # 4 и 5 для версии Amazon

Если у вас есть некоторые переменные, которые должны быть установлены по-разному для каждого подпроекта (т. Е. Логическое GOOGLE_PLAY_VERSION длявключить определенные функции Google Play), необходимо создать другой проект, содержащий эти значения, поскольку у вас не может быть проектов, которые ссылаются друг на друга по кругу.Вы можете решить эту проблему, добавив следующие шаги:

  1. Извлеките все переменные, относящиеся к вашему подпроекту, в один или несколько классов, которые просто служат в качестве контейнера (ов) для этих переменных
  2. Создайте «фиктивный» Java-проект ( dummy )
  3. Config proj-A для добавления новой ссылки на источник в каталог bin dummy
  4. Добавление классов конфигурации в каждом подпроекте с изменениями, специфичными для проекта
  5. Прибыль!

Обратите внимание, что переменные в dummy должны не будет установлено как окончательное, в противном случае оно будет переопределять настройку подпроекта.

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

Редактировать: Теперь, когда Google перешел на Android Studio & Gradle, может быть, лучше перейти к этому, если вы начинаете новый проект, если вы хотите поддерживать несколько APK.см. сайт разработчика Android Сборка вашего проекта с Gradle # Work с вариантами сборки .Определенно, не помешает оценить этот вариант, прежде чем принять решение.

1 голос
/ 02 апреля 2012

К сожалению, в Android есть своего рода соглашение об изменении потока во время выполнения на основе того, что было бы в C / C ++ - условной компиляции.

Наше приложение должно поддерживать различное поведение для разных уровней API, поэтому мы создали некоторые константы уровня приложения, которые статически инициализируются на основе доступной нам информации уровня API и используются во всем коде. Именно так Google работает в своих примерах (например, см. Библиотеку совместимости ActionBarCompat и, в частности, фабричный метод, используемый здесь ).

Вы можете создать интерфейс CustomBuild и реализовать его в AmazonBuild и GooglePlayBuild, а затем использовать статический метод getBuild () для переключения функций по мере необходимости:

if(getBuild().shouldEnableFeatureX()){
    doStuff();
} else {
    doDifferentStuff();
}

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

Я собираюсь поддержать второе предложение выше: перейти на что-то вроде Maven для строительства; это должно сделать вашу жизнь намного проще, как только вы ее настроите.

Я также хочу сказать, что вы должны сделать ядро ​​приложения библиотекой, как предложено выше, и иметь два разных модуля (один для amazon, один для play store), которые зависят от библиотеки, но каждый содержит только один настраиваемый файл фабрики (или просто статический класс для каждого типа сборки, который содержит одинаковые методы «должен ли я это делать?» ... если у вас есть инфраструктура, это просто вопрос предпочтений).

0 голосов
/ 28 марта 2012

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

Тогда для создания соответствующих jar-файлов достаточно двух целей Ant, использующих свойства для переключения исключенных файлов из набора файлов javac.

Цель состоит в том, чтобы получить чистое приложение для каждой цели без какого-либо кода от другой.

С функциями, перечисленными как подключаемые поведения в файле свойств или конфигурации XML, ваша среда выполнения адаптируется с добавлением пунктов меню.

0 голосов
/ 26 марта 2012

На самом деле я еще не пробовал, но об этом я думал.

Как насчет использования Eclipse для связи с файлами из каталога за пределами вашей рабочей области?

Начните с одного проекта Eclipse: в качестве аргумента, скажем, это версия Google Play.

Теперь создайте второй проект, начав с того, что попросите Eclipse связать (а не скопировать) исходные файлы из вашего первого проекта.

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

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

Как вы думаете, это будет работать?

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