管理两个类似的应用

时间:2011-12-21 21:26:08

标签: android svn version-control ant

我已经编写了一段时间的Android应用程序,我们希望发布两个版本,它们彼此之间有微小的变化。一旦我们将应用程序分成两部分,我就担心应用程序的维护(我在一部分中更改某些内容而在另一部分中不更新它)。最好的方法是什么?我想为每个版本的应用程序创建两个svn分支,并让人们对主干进行更改,然后将它们合并到分支中?这是最简单,最有效的解决方案吗?

3 个答案:

答案 0 :(得分:2)

最好的方法是将大部分代码放在库项目中。然后根据需要创建尽可能多的项目作为库上的薄单板。例如,我们这样做是为Android Market和Amazon Appstore构建单独的应用程序。 (我们使用前者的许可代码而不是后者;清单需要略有不同;对于链接回市场的应用程序,我们需要为每个市场提供不同的URL;等等。)

答案 1 :(得分:2)

学习使用蚂蚁。

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

作为一个基本示例,您可以使用

从项目目录中的命令行生成build.xml文件
android update project -p ./

然后你可以创建一个config目录并在那里存储一些项目,例如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 - &gt; 2. Ant Task ...,然后选择目标并点击运行按钮。

可以在互联网上找到关于蚂蚁的更多信息。

<强>的AndroidManifest.xml

值得一提的是,如果您要将包名称,版本代码和版本名称移动到build.properties文件中,并使用config / AndroidManifest.xml中的过滤器将其复制到根目录,则需要考虑不同的包名称。因此,没有相关路径到清单中的活动,您还需要自定义-pre-compile目标以将生成的R.java移动到正确的目录(基于包名称)并使用ant regex位来修复包名称R.java,其中-pre-compile是一个已经存在的空目标,留给谷歌使用

更新R.java

要更新R.java,您要覆盖-pre-compile目标,找到R.java,移动文件,并使用replaceregexp适当地编辑文件内部的包名称。您可以查找每个ant调用的文档,以根据您的需要进行自定义。这是一个可能包含错误的示例,其中包含相关部分的一些注释,以便在ant文档中进一步阅读。

<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>

当然,你需要根据自己的情况进行调整。

答案 2 :(得分:1)

有没有办法在应用程序中添加某种功能切换?也许某些东西会存在于应用程序的配置中,或者会基于用户身份验证来打开/关闭正确的功能集?

这样,您就拥有了一个具有两组功能的代码库(假设两个应用程序之间存在通用代码)。

我还没有完成Android或移动开发,但是已经在Java Web开发中成功使用了这种技术,我们在同一个应用程序中打开了不同的功能,具体取决于系统的用户。

我会避免将它分成两个不同的代码库。它只会为您带来更多的维护开销。