Управление двумя похожими приложениями - PullRequest
0 голосов
/ 22 декабря 2011

Я некоторое время программировал приложение для Android, и мы хотим выпустить две его версии, которые имеют незначительные отличия друг от друга.Я беспокоюсь о поддержке приложения, как только мы разделили его на две части (я изменяю что-то в одной и не обновляю в другой).Каков наилучший способ сделать это?Я думал о создании двух веток svn для каждой версии приложения и о том, чтобы люди передавали изменения в ствол, а затем объединяли их в ветки?Это самое простое и эффективное по времени решение?

Ответы [ 3 ]

2 голосов
/ 22 декабря 2011

Лучший способ - поместить большую часть кода в проект библиотеки. Затем создайте столько проектов, сколько вам нужно, тонких шпонов поверх библиотеки. Мы делаем это, например, для создания отдельных приложений для Android Market и Amazon Appstore. (Мы используем лицензионный код для первого, а не для второго; манифесты должны немного отличаться; для приложений, которые ссылаются на рынок, нам нужны разные URL для каждого рынка; и т. Д.)

2 голосов
/ 22 декабря 2011

Научитесь использовать муравья.

http://developer.android.com/guide/developing/projects/projects-cmdline.html

В качестве базового примера вы можете создать файл build.xml из командной строки, внутри директории проекта с помощью

android update project -p ./

Затем вы можете сделатькаталог конфигурации и хранит некоторые элементы, такие как AndroidManifest.xml и Config.java, которые вы храните в своем пакете.Замените некоторые элементы токенами, например, build-appone.properties может прочитать

config.package_name=com.me.appone
config.some_var = "foobar"

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

...
public static final String FOO_BAR = "@CONFIG.SOME_VAR@";
...

Затем вы можете отредактировать свой build.xml и добавить пользовательские цели, например

<target name="-configapp">
    <copy file="config/Config.java" todir="${source.dir}/com/me/appone/"
          overwrite="true" encoding="utf-8">

          <filterset>
              <filter token="CONFIG.SOME_VAR" value="${config.some_var}"/>
          </filterset>
    </copy>
</target>

<target name="release-appone">
    <loadproperties srcFile="build-appone.properties"/>
    <antcall target="-configapp"/>
    <antcall target="release"/>
</target>

, затем вы можете создать целевой выпуск-appone, запустив

ant release-appone

или щелкнув правой кнопкой мыши по build.xml, Run As -> 2. Задача Ant ..., затем выберите цель и нажмите кнопку запуска.

Дополнительную информацию о муравьях можно найти в паутинах.

AndroidManifest.xml

Стоит отметить, что если вы собираетесь переместить имя пакета, код версии и имя версии в файл build.properties и скопировать его в корневой каталог, используя фильтры из конфигурации/AndroidManifest.xml, вам нужно учитывать разные имена пакетов.Таким образом, нет относительных путей к действиям в манифесте, и вам также потребуется настроить цель -pre-compile для перемещения сгенерированной R.java в правильный каталог (на основе имени пакета) и использовать бит ant regex, чтобы исправить имя пакета вR.java, где -pre-compile - это уже существующая пустая цель, выделенная для вашего использования google

Обновление R.java

Чтобы обновить R.java,Вы хотите переопределить цель -pre-compile, найти R.java, переместить файл и использовать replaceregexp, чтобы соответствующим образом отредактировать имя пакета внутри файла.Вы можете искать документацию для каждого вызова муравья, чтобы настроить его в соответствии с вашими потребностями.Вот пример, который может содержать ошибки с некоторыми комментариями к соответствующим частям для дальнейшего чтения в документации по муравьям.

<target name="-pre-compile">
    <echo>Fixing R.java</echo>
    <!-- setup a prop for reuse that points to R.java containing dir -->
    <property name="config.gen_pkg" value="${gen.absolute.dir}/com/me/dir"/>

    <!-- this pulls a list of directories and assigns it to a refid via "id" -->
    <dirset id="config.R_loc" dir="${config.gen_pkg}" includes="*"/>

    <!-- this takes the refid and pushes it into a usable property -->
    <property name="prop.R_loc" refid="config.R_loc"/>

    <!-- now we move the file to where we want -->
    <move file="${config.gen_pkg}/${prop.R_loc}/R.java" todir="${config.gen_pkg}"
            overwrite="true" encoding="utf-8"/>

    <!-- use regex to update the package name -->
    <replaceregexp file="${config.gen_pkg}/R.java" match="^package com.*$"
            replace="package com.correct.package.name" byline="true"/>
</target>

Вам, конечно, придется адаптировать это к вашим собственным обстоятельствам.

1 голос
/ 22 декабря 2011

Есть ли способ добавить какой-либо переключатель функций в ваше приложение?Возможно, что-то, что будет жить в конфигурации приложения, или будет основано на аутентификации пользователя для включения / выключения правильного набора функций?

Таким образом, у вас есть одна кодовая база с обоими наборами функций (при условии, что между двумя приложениями существует общий код).

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

Я бы не стал разбивать ее на две разные кодовые базы.Для вас это просто намного больше затрат на обслуживание.

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