我在Android市场上有一个付费应用程序,但是,我想发布一个免费的广告支持版本。
我认为最简单的方法是在我的subversion存储库上设置一个分支,其中包含添加广告的附加代码。但是,当我将其提交到Android市场时,它们需要唯一的包名。这个解决方案不再适用于我,因为我必须更改每个类文件的包,这会使主干和分支合并非常痛苦。
最好的方法是将这两个项目放在一起,共享补丁,但使用不同的包?
答案 0 :(得分:8)
您是否考虑过编译器指令?
示例:
#define FREE
// ...
#if FREE
Console.WriteLine("Free version");
#else
Console.WriteLine("Paid version");
#endif
您可以保留完全相同的代码库,并使用两个单独的构建脚本或可参数构建脚本来定位两个构建。
msbuild /p:DefineConstants=FREE
答案 1 :(得分:5)
只有您的应用程序包必须是唯一的。见here。这是您的清单文件中声明的包。您可以将大部分代码放在com.mydomain.myapp
中,并在com.mydomain.myapp.free
中使用不同的主要活动。
答案 2 :(得分:3)
如果您确实想要分开,最好的方法是将其设置为同一存储库的两个部分。这样,您至少可以合并不同分支的更改。如果你想把事情完全分开,那么你将会做很多片段补丁文件。
我已经做到了这一点,坦率地说,这在实践中并不是一个很好的策略。更好的是,特别是在编译环境中,要有一个单独的构建过程,免费与付费,所以有一个代码库而不是两个。如果有两个代码库,将分歧。
答案 3 :(得分:0)
版本控制是管理这类事情的一种糟糕方式。您最终会遇到维护噩梦 - 两个独立的应用程序需要几乎相同
。您是否考虑过多项目解决方案? (告诫:我实际上并没有这样做,但似乎可行,我认为Android会允许它。我稍后会尝试并查看。)将所有应用代码编译成主项目< EM>罐。然后创建两个单独的Android应用程序,一个用于付费版本,另一个用于免费版本。这将解决您的包命名问题。除了您的广告版本将包含支持广告的代码之外,这些应用程序只会委托主jar进行几乎所有操作。
您可能还会发现this discussion on a similar topic有趣。
答案 4 :(得分:0)
使用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
这样,您的版本是统一的,并且版本控制源中只需要一个分支
在您的特定脚本中,您必须检查该功能是否已获得授权,否则,您不会显示该功能