我一直在编程一个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开发中成功地使用了这种技术,根据系统的用户,我们有相同的应用程序,不同的功能打开。
我将避免把它分成两个不同的代码库。它只会给您带来更多的维护开销。