我有一个主要从Android Market(现在是Google Play)下载的Android应用。我们对源进行了一些调整,并提交给亚马逊应用商店,以了解它获得了什么样的牵引力。我现在正在寻找一种可持续发展方式,从一个共同的代码库开发,然后构建,以便我可以提交给两个/两个。
Amazon的商店对可用的API有一些限制,因此我想有条件地从该版本中删除/修改功能。由于Java不支持传统的条件编译,并且在Eclipse中有条件地包含文件似乎并不简单(甚至可能吗?),我想问其他人正在做些什么来解决这个问题。
不可否认,我不是Eclipse / Java专家,所以请随时给我上学。
我在解决方案中寻找的是什么:
这是您为Android应用专门解决的问题,还是其他基于Java / Eclipse的项目?建议从哪里开始?
答案 0 :(得分:10)
在最新版本的ADT(版本17)中很容易做到,虽然我发现它使编译时间更长:
如果你有一些变量应该为每个子项目设置不同(即布尔GOOGLE_PLAY_VERSION以启用Google Play特定功能),你必须创建另一个项目来包含这些值,因为你不能有引用一个项目的项目 - 另一个循环的方式。您可以通过添加以下步骤来解决此问题:
请注意, dummy 中的变量应不设置为final,否则将覆盖子项目的设置。
这可能看起来像是一些前期工作,但就版本控制来说,它对我来说效果很好。
修改强> 现在谷歌转向Android Studio& Gradle,如果你想要支持多个APK,如果你要开始一个新项目,可能会更好,请参阅Android开发者网站的Building Your Project with Gradle#Work with build variants。在决定之前评估该选项肯定没有坏处。
答案 1 :(得分:1)
不幸的是,Android中的一种惯例是根据C / C ++中的内容条件编译来改变运行时的流量。
我们的应用程序必须为不同的API级别维护不同的行为,因此我们创建了一些应用程序级常量,这些常量根据我们可用的API级别信息进行静态初始化,并在整个代码中使用。这是Google在其示例中执行操作的方式(例如,请参阅ActionBarCompat兼容性库,特别是使用的工厂方法here)。
您可以创建一个接口CustomBuild,并在AmazonBuild和GooglePlayBuild中实现它,然后使用静态getBuild()方法根据需要切换功能:
if(getBuild().shouldEnableFeatureX()){
doStuff();
} else {
doDifferentStuff();
}
然后,您必须担心在构建之间切换是工厂中的一行或两行代码,同时在哪些版本中维护您想要启用的内容。或者,您可以为每个构建包含不同版本的静态类CustomBuild。
我将重新提出其他人的建议:转向像Maven这样的建筑;一旦你完成它,它应该让你的生活更轻松。
我也会说你应该把应用程序的核心作为上面建议的库,并且有两个不同的模块(一个用于亚马逊,一个用于游戏商店),它们依赖于库,但每个只包含一个自定义工厂文件(或者只是每种类型的构建的静态类,包含相同的“我应该做这件事吗?”方法......一旦你拥有基础设施,这只是一个偏好的问题。)
答案 2 :(得分:0)
我还没有尝试过这个,但这是我一直想到的。
如何使用Eclipse链接到工作区外的目录中的文件?
从一个Eclipse项目开始:为了争论,请说它是Google Play版本。
现在构建第二个项目,首先要求Eclipse链接(不复制)第一个项目中的源文件。
要开发第二个项目,请添加从原始项目中继承子类的类以实现您的修改。对于资源,您可以使用包含,属性覆盖和选择器的某种组合。
如果无法进行子类化或扩展,那么显然你只需要复制原始源文件并进行破解即可。如果你真的是OCD,你可能只是维护一个补丁集而不是整个冗余文件集。
您怎么看?它会起作用吗?
答案 3 :(得分:-1)
您可以在Eclipse中手动创建两个指向相同源文件夹但具有不同包含/排除过滤器和不同目标目录的项目。
然后,使用属性从javac文件集切换排除文件的两个Ant目标足以生成相应的jar文件。
目标是为每个目标获得一个干净的应用程序,而不需要任何代码。
在属性文件或XML配置中将功能列为可插入行为时,运行时将通过添加菜单项来适应自身。