【发布时间】:2010-05-16 09:12:00
【问题描述】:
您好,我是一名初级 android 开发人员,使用 windows 和 eclipse IDE 开发 java android 应用程序。我已经发布了一款游戏,但有免费版和付费版。 google 市场坚持不同的版本必须有不同的包名。到目前为止,我一直在用 2 个不同的名称重构包,并在每次构建不同版本时更改 R 资源文件导入。两个版本的代码 99% 相同。有更好的方法吗?
【问题讨论】:
您好,我是一名初级 android 开发人员,使用 windows 和 eclipse IDE 开发 java android 应用程序。我已经发布了一款游戏,但有免费版和付费版。 google 市场坚持不同的版本必须有不同的包名。到目前为止,我一直在用 2 个不同的名称重构包,并在每次构建不同版本时更改 R 资源文件导入。两个版本的代码 99% 相同。有更好的方法吗?
【问题讨论】:
你们在here和there这个话题上有各种讨论,但基本上解决方案类似于复制项目。
例如(不是基于eclipse):
很难回答这个问题,因为我们不知道您的应用的免费版本和非免费版本之间有什么区别。
我将假设这些差异可以通过某种全局免费/非免费标志来处理。我的意思是,相同的代码将构成应用程序的两个版本,启用或使用哪些部分将取决于某处的某些公共静态数据成员:
if (SomeClass.IS_PAID_APP) {
// add more stuff to menu, etc.
}
如果您可以这样组织您的应用,那么您只需要一个代码库。
将其设置为以一种方式(免费或付费,由您选择)构建您的应用,并在清单中为该版本的应用使用适当的包。
然后,添加执行以下操作的 Ant 任务:
- 将项目目录的树形副本复制到临时位置
- 通过 搜索和替换
- 将旧包版本 R 的所有导入语句切换为 新包,再次通过搜索和替换,再次在副本上, 不是你原来的
- 将您的 IS_PAID_APP(或其他)更改为相反的值 (在副本中搜索和替换)
- 为项目副本执行 Ant 构建
- 将二进制文件从该构建复制到主项目的 bin/ 使用不同名称的目录(因此它不会破坏您的其他副本 APK)
- 删除在步骤 #1 中创建的树副本
如果 Java 有一个预处理器,这会稍微简单一些。然而,我上面描述的基本技术已经使用了几十年。它很笨重,但它可以工作,这意味着你只有一组源代码要处理。 请注意,Ant
<replace>任务会很好地处理您的搜索和替换内容。
【讨论】:
这是 Android Market 的失败之一,尽管我明白他们为什么这样做。它只是不是为您的应用程序的免费和付费版本而设计的(他们声称 24 小时退货政策是为了这个,但它却被用于盗版)-:
无论如何,最简单的做法是编写一个 Ant 构建脚本(或您使用的任何脚本语言)。通过所有 .xml 和 .java 文件搜索替换您的包名称。然后在那里构建您的应用程序。恕我直言,重构代码比它的价值更痛苦......
【讨论】: