维护应用程序的免费版和专业版

时间:2010-03-27 11:20:30

标签: android versioning maintainability

我想为我的Android应用程序创建一个PRO版本,并想知道如何构建我的存储库。

知道我有一个主干和功能分支。我想把专业版放在另一个分支中,但也许有更好的方法?例如,也许我应该创建两个分支 - 一个用于免费版本,另一个用于专业版?

专业版将具有其他功能,并且无广告,例如。我不想在专业版中包含AdMob库。

在这种情况下,您对构建存储库的最佳方法有什么经验或建议吗?

编辑: 我想我已经在这个主题中找到了最适合我应用的解决方案:http://groups.google.com/group/android-developers/browse_thread/thread/4ad3d67f735f16d7/948b4f9eee2490a3

这里讨论的技巧是关于另一个应用程序,它只用于解锁实际应用程序中的PRO功能。解锁应用程序在市场上支付,实际应用程序仅检查设备上是否存在它。

4 个答案:

答案 0 :(得分:15)

我知道你已经做出了决定,但我有另一个可能对其他人有帮助的建议。

我在我的存储库中使用git。创建和维护分支非常容易。我有我的主“专业”存储库和一个“免费”分支。我对主服务器进行了所有代码更改。我的“自由”分支只是因触发“自由”行为的任何变化而不同。 每当我完成对代码的更改时,我将其提交给主分支,然后切换到自由分支并使用“rebase”命令将其与主代码进行匹配。

它回滚使其表现为“免费”版本的更改,应用我对master进行的更改,然后重新应用“free”更改。

我不需要维护两个版本。我不必记得切换一些开关,或来回做出相同的改变。它非常漂亮,我喜欢它比触发专业行为的第二个应用程序更好,因为我可以删除相关版本不需要的库。

答案 1 :(得分:11)

我建议不要维护两个分支,但要有运行时或编译时间开关来禁用免费版本的PRO功能。您甚至可以在构建时删除不需要的DLL。

维持两个分支意味着在两个地方解决问题,这将成为一个问题,因为分支不可避免地分歧。

答案 2 :(得分:7)

我在eclipse中找到了一种简单的方法。一旦我发现它,我感到非常惊讶。

  1. 在com.app.free的项目属性中,将“Is Library”检查为true(在更改之前必须至少编译一次项目,否则会出现错误,说明无法编译库项目,如果你得到的话这个错误只是取消检查,编译,然后重新检查。
  2. 创建新项目com.app.pro
  3. 在项目的android部分的项目设置中将com.app.free项目添加为库
  4. 在com.app.pro中创建新类MyApplication并扩展Application
  5. 覆盖onCreate()注意:对于那些复制/粘贴者,这与活动的onCreate(Bundle savedInstanceState)捆绑包不同。您必须删除Bundle参数,因为这是一个应用程序而非活动。
  6. 然后添加或设置将在验证方法中读取的静态变量以验证许可证。 EX:IS_PRO = true;然后验证方法读取变量,如果IS_PRO为真,则返回true。
  7. 将清单内容从com.app.free复制到com.app.pro
  8. 将android:name =“MyApplication”添加到com.app.pro清单
  9. 中的应用程序标记
  10. 在所有活动的name属性前面添加com.app.free。 (这使得应用程序知道您的活动可以在库包中找到,这是免费版本)EX:android:name =“。MainActivity”=>机器人:名称= “com.app.free.MainActivity”
  11. 现在编译,你有一个专业版
  12. 此方法假定您使用的是全局验证方法。例如,我创建了一个类,将用户连接到我的域上托管的数据库,该类确定用户何时首次安装应用程序。对于任何专业活动,我检查LicenseClass.isValidLicense(),它比较日期,如果小于所需的天数,则返回true。在isValidLicense()函数中,我检查Application.IS_PRO是否设置为true,如果是,则返回true。

    所以现在你可以经常进行尽可能多的更改,而你所要做的就是重新编译两者。唯一需要记住的是,你在com.app.free清单中所做的更改必须反映在专业版中。但是任何应用程序都是如此,因为Android应用程序要求您声明要使用哪些活动,无论如何。

    注意:您可以删除在项目创建时自动生成的所有资产和资源(不要删除res文件夹本身),因为它们不会被使用。此外,唯一需要的类文件是步骤3中的MyApplication文件。这意味着您也可以删除自动生成的MainActivity.class,因为它也从未使用过。您还可以删除专业版中使用的任何标签。 EX:我有一个BuyPro活动,如果验证失败则会打开。由于验证在专业版中永远不会失败,因此不需要。当然,所有这些删除都是可选的,只是让你知道我学到了什么。

    缺点:到目前为止我发现的唯一一个问题是你不能将switch语句与资源变量一起使用,因为它们不再是常量。因此,当您将项目用作库时,如果在专业版中声明了同名变量,则会自动覆盖您在strings.xml文件中创建的任何变量。对我来说,这不是骗局,因为我不喜欢在java中使用switch状态,因为它们限制你只需要切换int类型而且它们需要常量值。这意味着在java中我通常不管怎么说...其他的staments。如果您将光标放在开关关键字上并按Ctrl + 1然后单击转换为if else,Eclipse实际上将帮助转换switch语句。此外,我发现资源被覆盖是非常有用的,因为你可以做一些事情,比如将app_name从“app free”更改为“app pro”,或者上传一个新的drawable来说明应用程序图标,只需在该位置创建新版本它存在于免费的应用程序中。 EX:如果res / values / string.xml包含100个字符串变量,但是你需要或想要在专业版中更改的是app_name,只需重新创建res / values / string.xml(NOT copy)并添加app_name变量。现在将覆盖免费版本中的app_name变量,这意味着pro版本中的string.xml文件只需要包含1变量而不是100,因为它是唯一更改的变量。十分简单。 : - )

    编辑:我发现eclipse不允许你导出.apk用于库,因此你必须在免费版本中将其作为库添加到专业版中后取消选中“Is Library”选项。据我所知,这样做的唯一原因是eclipse不会警告你关于switch语句的问题。除此之外它似乎工作正常。

答案 3 :(得分:1)

使用public static final boolean IS_PRO的单个版本可以确定免费/专业行为。

编辑:
包装的东西。比如说,你的所有课程都在com.myapp.android.free下 然后,在AndroidManifest.xml中,您为付费版本声明package = "com.myapp.android",为免费版本声明package="com.myapp.android.free"
如果您使用活动,服务等的全名,则无需更改任何其他内容。

我不打算从付费版本中删除未使用的库。如果你这样做,你必须手动完成。