5

我在 android 市场上有一个付费应用程序,但是,我想发布一个免费的广告支持版本。

我认为最简单的方法是在我的 subversion 存储库上设置一个分支,其中包含添加广告的附加代码。但是,当我将其提交到 android 市场时,他们需要唯一的包名称。这个解决方案不再适用于我,因为我必须更改每个类文件的包,这会使合并主干和分支非常痛苦。

我可以将这两个项目放在一起,共享补丁,但使用不同的包的最佳方式是什么?

4

5 回答 5

8

您是否考虑过编译器指令

例子:

#define FREE
// ...
#if FREE
Console.WriteLine("Free version");
#else
Console.WriteLine("Paid version");
#endif

您可以保持完全相同的代码库,并使用两个单独的构建脚本或一个可参数化的脚本来定位两个构建。

msbuild /p:DefineConstants=FREE

要使用 Java,请阅读thisthis。也许这个

于 2012-04-18T14:15:50.827 回答
5

只有您的应用程序包必须是唯一的。见这里。那就是在清单文件中声明的包。您可以将大部分代码com.mydomain.myapp放在com.mydomain.myapp.free.

于 2012-04-18T14:54:27.190 回答
3

如果你真的想分开,最好的方法是将它设置为同一个存储库的两个部分。这样,您至少可以跨不同分支合并更改。如果你想让事情完全分开,那么你将做很多修补补丁文件。

我已经这样做了,坦率地说,这在实践中并不是一个很好的策略。更好的是,特别是在编译环境中,免费和付费有一个单独的构建过程,所以有一个代码库而不是两个。如果有两个代码库,事情就会不同。

于 2012-04-18T14:15:49.280 回答
0

版本控制是管理此类事情的一种糟糕方式。您最终会遇到维护噩梦 - 两个独立的应用程序需要几乎相同。

您是否考虑过多项目解决方案?(警告:我实际上并没有这样做,但它似乎可行,而且我认为 Android 会允许它。我稍后会尝试并确定。)将所有应用程序代码编译到主项目jar中。然后创建两个单独的 Android 应用程序,一个用于您的付费版本,一个用于免费版本。这将解决您的包命名问题。除了您的广告版本将包含支持广告的代码外,这些应用程序只会将几乎所有内容委托给主 jar。

您可能还会发现关于类似主题的讨论很有趣。

于 2012-04-18T14:42:47.750 回答
0

使用 a 构建您的应用程序feature toggle可以让您实现目标,但您可能需要重新编写大量代码。

通过在 .ini 文件中定义 2(我建议 3)功能容器环境,例如:

[paid]
features.ads = false
features.featureOne = true
features.featureTwo = true
features.premiumFeature = true
features.underDevFeature = false
features.debug = false;

[free:paid]
features.ads = true
features.premiumFeature = false

; And the optionnal third
[development:paid]
features.debug = true
features.underDevFeature = true

这样,您就有了一个统一的版本,并且在您的版本控制源中只需要一个分支

然后,在您的特定脚本中,您必须检查该功能是否被授权,如果没有,则不显示它

于 2012-04-18T15:39:53.497 回答