Подтвердить что ты не робот

Управление кодом/сборкой для магазинов приложений Android (Google/Amazon/etc)?

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

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

По общему признанию, я не эксперт по Eclipse/Java, поэтому не стесняйтесь меня в школе.

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

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

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

4b9b3361

Ответ 1

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

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

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

  • Потяните все ваши специфические переменные подпроекта в один или несколько классов, которые просто служат контейнером (-ами) для этих переменных
  • Создайте проект "dummy" Java (фиктивный)
  • Конфигурировать proj-A, чтобы добавить новую ссылку источника в каталог bin dummy
  • Добавить конфигурационные классы в каждом подпроекте с изменениями, специфичными для проекта
  • прибыль!

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

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

Edit: Теперь, когда Google перейдет на Android Studio и Gradle, лучше перейти к этому, если вы начинаете новый проект, если хотите поддерживать несколько APK, см. Сайт Android dev Построение проекта с помощью Gradle #Work с вариантами сборки. Это определенно не мешает оценить этот вариант, прежде чем принимать решение.

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

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

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

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

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

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

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

Ответ 4

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

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

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

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