如何维护应用程序的付费和免费版本

时间:2012-05-08 13:43:19

标签: java android eclipse

我已经建立了一个游戏应用程序的免费版本,现在市场上有一个像com.mycompany.myfreegame这样的名字。现在我想制作一个付费版本。毫无疑问,对于未来几年所需的两个版本都将进行调整和错误修复,因此我希望以尽可能紧凑的方式封装免费与付费信息的编码,以便我可以同时修复两个版本中的错误。 / p>

如果在运行时处理了两个版本之间的全部差异,那么我可以在源代码中设置一个标志,这将是问题的结束。不幸的是还有两件事需要考虑,

  1. 两个版本之间的包名称需要不同。
  2. 某些xml需要不同。例如,免费版本需要线性布局来保存广告,付费版本不需要。
  3. 实现这一目标的最简单方法是什么?

5 个答案:

答案 0 :(得分:7)

我认为我尝试的第一种方法是在Eclipse中使用3个项目:一个用于游戏版本,另一个用于包含所有共享代码的库项目。图书馆项目将是您的核心游戏玩法的所有代码,并且特定于版本的项目管理加载不同的布局,将广告放入免费版本,以及向付费版本添加级别/功能/帽子。

您可以使用ant任务使用编译器标志来实现单个代码库的目标,但这超出了我的范围。

答案 1 :(得分:4)

我认为您正在寻找的是图书馆计划http://developer.android.com/guide/developing/projects/index.html#LibraryProjects

从该网页开始:

If you are creating an application that exists in both free and paid versions. You move the part of the application that is common to both versions into a library project. The two dependent projects, with their different package names, will reference the library project and provide only the difference between the two application versions.

另一个与此非常相似的问题,似乎有一个不错的讨论和答案:Multiple Apps with a shared code base

编辑:这是一个关于如何实现库项目的链接。 http://developer.android.com/guide/developing/projects/projects-eclipse.html

对于略有不同的不同版本,图书馆项目可以容纳。首先构建库项目,然后最后构建父项(使用该库的项目)并将它们合并在一起。两个项目都可以定义相同的资源标识符和最后构建的项目(父项目),获得优先级(覆盖)。基本上,您可以在父/调用应用程序中覆盖字符串/布局(可能更多,不确定?)。

例如:假设您有两个项目,免费和付费。您可以使用默认实现(免费版本)创建一个字符串,并在付费版本(父应用程序)中覆盖它。

共享库中的代码Strings.xml文件:

<string name="AppName">My Application (Free)</string>

父应用程序Strings.xml文件中的代码:

<string name="AppName">My Application Premium</string>

答案 2 :(得分:3)

我会选择Maven。您可以使用三个子项目定义父项目,例如:

  • 通用
  • 付费

Maven允许拥有不同的配置文件,同时具有相同的代码库。

例如,我目前有一个项目,其中使用了两个数据库,因此所有应用程序配置文件都保留在一个公共项目中,其中数据库配置文件和类保留在每个项目文件夹中。当我在父项目中进行构建时,每个子项目都会构建,单元测试会通过,等等......

而且,这只是maven的千种优势之一!

编辑:我刚刚发现,你有一个android-plugin maven,还有很酷的功能

答案 3 :(得分:1)

现在最好的方法是使用Android Studio + gradle。 这种情况允许在控制台中使用一个命令构建付费和免费版本。 有关详细信息,请参阅此帖子:https://stackoverflow.com/a/17286142/1705370

答案 4 :(得分:0)

我认为你正在寻找类似的东西:

Multiple Android Application Package .apk files from single source code

基本上,这里最简单的方法是使用两个不同的清单文件和两个不同的主要活动,并使用Ant切换编译,尽管后者是可选的。

希望它有所帮助。

相关问题