17

我已经构建了一个游戏应用程序的免费版本,现在市场上的名称类似于 com.mycompany.myfreegame。现在我想做一个付费版本。毫无疑问,未来几年都需要对这两个版本进行调整和错误修复,因此我想以尽可能紧凑的方式封装免费和付费信息的编码,以便我可以同时修复两个版本中的错误。

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

  1. 包的名称在两个版本之间需要不同。
  2. 一些xml需要不同。例如,免费版需要线性布局来放置广告,而付费版则不需要。

实现这一目标的最简单方法是什么?

4

5 回答 5

7

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

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

于 2012-05-08T14:03:21.313 回答
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>
于 2012-05-08T14:09:31.023 回答
3

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

  • 常见的
  • 有薪酬的
  • 自由

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

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

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

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

于 2012-05-08T14:17:09.717 回答
1

现在可能最好的方法是使用Android Studio + gradle。这种情况下允许在控制台中使用一个命令构建付费和免费版本。更多详细信息在这篇文章中:https ://stackoverflow.com/a/17286142/1705370

于 2013-06-24T22:29:51.153 回答
0

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

来自单一源代码的多个 Android 应用程序包 .apk 文件

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

希望能帮助到你。

于 2012-05-08T14:09:50.430 回答