管理两个类似的应用程序



我一直在编程一个Android应用程序一段时间,我们想要发布它的两个版本,有微小的变化从另一个。我担心一旦我们将应用分成两个部分(我在其中一个部分进行了修改,而在另一个部分不进行更新),它的维护问题就会出现。做这件事最好的办法是什么?我正在考虑为每个版本的应用程序创建两个svn分支,并让人们向主干提交更改,然后将它们合并到分支中?这是最简单、最有效的解决方案吗?

学会使用ant。

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

作为一个基本的例子,您可以在项目目录中使用 从命令行生成build.xml文件。
android update project -p ./

然后你可以创建一个配置目录,并在那里存储一些项目,如AndroidManifest.xml和config .java,你保存在你的包中。用令牌替换某些项,例如,build-appone。属性可能读取

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>

那么你可以通过运行

来构建目标版本。
ant release-appone

或右键单击build.xml, Run As -> 2。蚂蚁任务…,然后选择你的目标并点击运行按钮。

更多的信息可以在网上找到。

AndroidManifest.xml

值得一提的是,如果您打算将包名、版本代码和版本名移动到构建中。属性文件并使用config/AndroidManifest.xml中的过滤器将其复制到根目录,您需要考虑不同的包名称。所以没有相对路径到manifest中的活动,你还需要自定义-pre-compile目标移动生成的R.java到正确的目录(基于包名),并使用ant regex位来修复R.java中的包名,其中-pre-compile是一个已经存在的空目标,由google为你的使用预留

更新参数

要更新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>

当然你需要根据自己的情况来调整。

最好的方法是将大部分代码放在库项目中。然后创建尽可能多的项目,你需要薄贴面库。例如,我们为Android Market和Amazon Appstore分别开发应用。(我们对前者使用许可代码,而不对后者使用许可代码;清单需要略有不同;对于链接到市场的应用,我们需要为每个市场提供不同的url;等)

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

这样,你就有了一个包含两组功能的代码库(假设两个应用程序之间有公共代码)。

我没有做过android或移动开发,但在Java web开发中成功地使用了这种技术,根据系统的用户,我们有相同的应用程序,不同的功能打开。

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

相关内容

  • 没有找到相关文章

最新更新