我最近开始在Google Android Market上销售我的Android应用程序,并实施了他们的应用程序许可方案,以防止未经授权使用我的应用程序。我现在正计划在亚马逊Android App Store上发布它,并希望了解维护我的应用程序的两个版本的最佳方式:一个实现Android许可,另一个不实现。
虽然我目前的解决方案有效,但它并不是最优的,我试图找出其他人处理这个问题的方法。现在,我为我的应用程序SplashGoogle.java和SplashAmazon.java实现了两个启动画面。我有两个相应的Manifest文件,GoogleManifest.xml和AmazonManifest.xml。每个清单都定义了一个不同的启动作为启动器意图。
当我想发布我的应用程序版本时,我将其中一个清单文件重命名为AndroidManifest.xml,导出应用程序,然后对其他Manifest执行相同操作。这是我的解决方案,因为它是我能想到的最好的,并且不知道其他方法可以做到这一点。它的工作原理是因为我的应用程序的亚马逊和谷歌市场版本之间的唯一区别是相应的启动类,一个用于检查许可,另一个用于检查许可。
在未来,我可能希望实施其他更改(或合并为只有一个启动画面),并且正在寻找一种更长久的方法来管理同一应用程序中的细微更改。
我认为,当开发人员创建付费应用程序的精简版,免费版或广告支持版时,会出现类似的问题。
附加说明:
我不确定这是否应该被视为社区维基,但如果是,请将其标记为反对关闭问题。我相信这对很多开发人员都有用。
答案 0 :(得分:3)
我首先将您现有的代码库重构为Android库项目。这很容易做到。 Be sure to read this.文档非常稀疏,但我能够使用它。请注意完全按照“在清单文件中声明库组件”一节。
因此,要重构到库中,您基本上将现有项目标记为库项目。您只需在项目设置中勾选一个框(请参阅链接)。
现在转到库,我们想要将包名更改为不同的名称。例如,如果您发布的版本包是com.mywebsite.myappname.android_market,那么我将其重命名为com.mywebsite.myappname.common_code
您可以右键单击项目,然后选择Android工具 - >重命名应用程序包。这一半对我有用。我还必须手动将代码中的所有引用重命名为我的R类manaully。您可以使用全局搜索替换来从com.mywebsite.myappname.android_market.R重命名为com.mywebsite.myappname.common_code.R
现在你的图书馆准备好了
现在是时候制作你要建造的实际项目了。
使用Android市场的软件包名称创建一个新的android项目和名称,例如com.mywebsite.myappname.android_market。按照链接上的说明将新的commons库添加为此程序包使用的库。
Android库项目的一个限制是库的清单不会合并到顶级项目的清单中。你需要手工粘贴它。另外(请参阅链接)您需要确保清单中的所有内容都使用完全限定的包名称。因此,如果您曾经有过活动名称,例如android:name =“。SplashScreenActivity”将其更改为android:name =“com.mywebsite.myappname.common_code.SplashScreenActivity”
因此,您需要手动合并所有内容,包括权限,意图,活动等。
现在只需构建顶级项目即可。 为您要构建的每个变体创建一个包装器。
您还可以让这些新的顶级项目实现不同版本之间不同的任何内容。因此,您的Android Market包装器可以实现一个启动屏幕,而您的Amazon版本则是一个不同的启动画面。或者你可以在你的普通项目中使用枚举来驱动它,同时保持两个闪屏。
另一个不错的功能是,如果提供了顶层项目中的资源,它们将覆盖库中的资源。因此,如果你想要在你的游戏中有一个亚马逊版本徽标和基于版本更改的Android Market徽标,只需使用与公用相同的图像名称,并在两个版本中放置不同的副本。
答案 1 :(得分:1)
虽然与您的问题没有直接关系,但我在创建应用程序的免费版和付费版时遇到了类似的障碍。 Android允许您将任何应用程序导出为库。您可以在Eclipse的项目属性中找到此选项。因此,通过将整个应用程序导出为库,您可以将其合并到其他应用程序中。导出库后,您可以使用库作为基础创建Amazon和Google应用程序。这将阻止您重命名XML文件以使每个应用程序进入可用状态。
图书馆很好,因为你也可以用它们打包资源。您甚至可以在客户端应用程序中添加包含相同名称的资源,这些资源将覆盖库的版本。因此,根据您的应用程序所在的市场,您可能会有不同的启动屏幕。图书馆不适合我的唯一地方包括资产。遗憾的是,未经处理的原始资产不会包含在库中的客户端应用程序中。
答案 2 :(得分:1)
我会考虑使用像 git 这样的版本控制并拥有三个分支。一个分支没有清单,这个核心分支将拥有您可以更新一次的所有公共代码。另外两个分支机构将是亚马逊,谷歌以及其他任何产品。这些分支将具有特定于应用程序的代码,清单,启动屏幕等。当您在核心分支中完成工作并想要推送更新时,您可以创建一个名为googleRelease(或其他)的核心临时分支并合并您的Google分支。
这是一个相对通用的例子,git功能强大,您可以通过各种方式处理它。