20

I want to create a PRO version of my application for Android and was wondering how to structure my repository.

For know I have a trunk and feature branches. I'd like to put a pro version in another branch but maybe there is a better way? For example, maybe I should create two branches - one for free version, the other for pro?

Pro version will have additional features and will be ads-free, so eg. I don't want to include AdMob libraries in the pro version.

Do you have any experience or suggestions as to what would be the best way to structure the repository in this case?

EDIT: I think I've found the best solution (for my app) in this thread: http://groups.google.com/group/android-developers/browse_thread/thread/4ad3d67f735f16d7/948b4f9eee2490a3

The trick discussed there is about having another application that only serves the purpose of unlocking PRO functionality in the actual application. The unlocking app is paid in the market and the actual app merely checks for the existence of it on the device.

4

4 回答 4

15

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

我使用 git 作为我的存储库。创建和维护分支非常容易。我有我的主“专业”存储库和一个“免费”分支。我对主人进行了所有代码更改。我的“免费”分支仅因触发“免费”行为的任何更改而有所不同。每当我完成对代码的更改时,我都会将其提交到 master 分支,然后切换到 free 分支并使用“rebase”命令将其赶上 master。

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

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

于 2010-03-29T18:55:29.993 回答
11

I would suggest not maintaining two branches, but have either runtime or compile time switches to disable the PRO functionality for the free version. You could even remove not required DLL's when building.

Maintaining two branches means fixing problems in two places, which will become more of a problem as the branches inevitably diverge.

于 2010-03-27T11:28:28.053 回答
7

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

  1. 在 com.app.free 的项目属性中,检查“Is Library”是否为真(在更改此选项之前,您必须至少编译过一次项目,否则您会收到错误消息,指出无法编译库项目,如果您确实收到此错误取消检查,编译,然后重新检查。
  2. 创建新项目 com.app.pro
  3. 在项目的 android 部分的项目设置中添加 com.app.free 项目作为库
  4. 在 com.app.pro 中创建新类 MyApplication 并扩展 Application
  5. 覆盖 onCreate() 注意:对于那些复制/粘贴者来说,这与活动的 onCreate(Bundle savedInstanceState) 包不同。您必须删除 Bundle 参数,因为这是一个应用程序而不是一个活动。
  6. 然后添加或设置将在验证方法中读取的静态变量以验证许可证。例如:IS_PRO = 真;然后验证方法读取变量并在 IS_PRO 为真时返回真。
  7. 将清单内容从 com.app.free 复制到 com.app.pro
  8. 将 android:name="MyApplication" 添加到 com.app.pro 清单中的应用程序标记
  9. 在所有活动的名称属性前附加 com.app.free。(这使应用程序知道您的活动可以在免费版本的库包中找到) EX: android:name=".MainActivity" => android:name="com.app.free.MainActivity"
  10. 现在编译,你有一个专业版

此方法假定您使用的是全局验证方法。例如,我创建了一个类,将用户连接到我的域上托管的数据库,该数据库确定用户首次安装应用程序的时间。对于任何仅限专业人士的活动,我会检查 LicenseClass.isValidLicense(),它比较日期并在小于所需天数时返回 true。在 isValidLicense() 函数中,我检查 Application.IS_PRO 是否设置为 true,如果是则返回 true。

因此,现在您可以进行尽可能多的更改,无论多么频繁,您所要做的就是重新编译两者。唯一要记住的是,您在 com.app.free 清单中所做的任何更改都必须反映在 pro 中。但对于任何应用程序都是如此,因为 android 应用程序要求您声明无论如何要使用哪些活动。

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

缺点:到目前为止,我发现的唯一缺点是您不能对资源变量使用 switch 语句,因为它们不再是常量。因此,当您将项目用作库时,例如,如果您在专业版中声明了同名的变量,您在 strings.xml 文件中创建的任何变量都会自动覆盖。对我来说,这不是一个缺点,因为我不喜欢在 java 中使用 switch 状态,因为它们限制你只能打开 int 类型并且它们需要常量值。这意味着在 java 中我通常需要我们 if ... else 语句。另外,如果您将光标放在 switch 关键字上并按 Ctrl+1 然后单击 convert to if else,Eclipse 实际上会帮助转换 switch 语句。此外,我发现覆盖资源非常有用,因为您可以执行诸如更改 app_name from " xml 包含说 100 个字符串变量,但在专业版中您需要或想要更改的只是 app_name 只需重新创建 res/values/string.xml (不复制)并添加 app_name 变量。现在免费版中的 app_name 变量将被覆盖,这意味着专业版中的 string.xml 文件只需要包含 1 变量而不是 100,因为它是唯一更改的变量。十分简单。:-) xml 包含说 100 个字符串变量,但在专业版中您需要或想要更改的只是 app_name 只需重新创建 res/values/string.xml (不复制)并添加 app_name 变量。现在免费版中的 app_name 变量将被覆盖,这意味着专业版中的 string.xml 文件只需要包含 1 变量而不是 100,因为它是唯一更改的变量。十分简单。:-)

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

于 2012-02-10T02:01:43.637 回答
1

有一个版本public static final boolean IS_PRO将决定免费/专业行为。

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

我不会费心从付费版本中删除未使用的库。如果这样做,则必须手动执行此操作。

于 2010-03-27T11:55:02.063 回答