我已经编写了一段时间的Android应用程序,我们希望发布两个版本,它们彼此之间有微小的变化。一旦我们将应用程序分成两部分,我就担心应用程序的维护(我在一部分中更改某些内容而在另一部分中不更新它)。最好的方法是什么?我想为每个版本的应用程序创建两个svn分支,并让人们对主干进行更改,然后将它们合并到分支中?这是最简单,最有效的解决方案吗?
答案 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>
然后你可以通过运行
来构建目标版本 - apponeant 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开发中成功使用了这种技术,我们在同一个应用程序中打开了不同的功能,具体取决于系统的用户。
我会避免将它分成两个不同的代码库。它只会为您带来更多的维护开销。