2

我知道开发免费和付费版本的应用程序的最佳方式是拥有一个包含程序主要部分的库项目。然后免费和付费项目将使用这个库项目。这允许免费和付费项目拥有不同的资源。

但是,我的问题是我们如何限制免费应用程序中的功能(或为付费应用程序扩展它)?例如,我的免费应用程序只能访问数据库表中的最新行,而付费应用程序可以访问所有行。

一种方法是在资源中设置一个布尔标志,将付费设置为 ​​true,免费设置为 ​​false。在运行时,库项目检查布尔标志并相应地改变行为。然而,这似乎很容易被黑客入侵以应对任何潜在的攻击。有没有更好的方法?

使用一个免费的应用程序然后使用应用内计费来解锁专业功能会更容易吗?

4

3 回答 3

4

恕我直言,Java/Android 在这种情况下并不容易。理想情况下,您应该拥有一个代码库,并且能够随意编译付费或免费版本。免费版本将禁用关键方法/类,因此没有人可以修改数据库或 xml 来启用应用程序的全部功能。

一种方法是使用条件编译,Java 也不支持。但是,有一些 Ant 任务可以做到这一点,例如http://prebop.sourceforge.net/doc.html。您可以在代码中添加如下内容:

/* $if paid_version$ */
public void paid_method() {

}
/* $endif$ */

如果您正在构建的 ant 目标没有定义变量paid_version,上述代码将被删除。

如何设置 prebop 是另一个话题,它很复杂,但值得拥有一个单一的代码库。

2013 年 5 月更新:基于 Gradle 的新 Android 构建系统使构建付费和免费 APK 稍微容易一些。有关“构建变体”的主题,请参阅Android 工具网站。简而言之,您可以像这样构建您的源代码:

/src/main/
/src/paid/
/src/free/

所有共享代码驻留在 中/src/main,付费代码驻留,/src/paid免费代码驻留/src/free。构建系统将为您创建付费和免费 APK。但是,仍然缺少的一项功能是在源代码本身中进行条件编译的能力。在撰写本文时,Gradle 构建工具仍处于 beta 状态,因此希望它会在最终版本中添加。

于 2012-06-22T14:53:43.593 回答
2

永远不要在 Res 或 SharedPrefs 中保存任何用于指定应用程序是否已付费的标志。有根电话可以访问这些并可以修改它们。我也遇到了这个问题,写了两个单独的应用程序(复制了付费的应用程序并删除了一些方法,添加了广告等)。这是最简单的解决方案。

于 2012-06-22T14:36:51.107 回答
2

IMO 从单一来源创建多个应用程序版本的最佳方法使用库项目。

我最近尝试过这个,它似乎工作得很好。尽管我没有尝试将基于此的代码发布到 Google Play,但我已经创建了单独的应用程序,它们可以在测试设备上同时运行,并带有自己的图标。

由于 Android 上的单独应用程序必须各自具有不同的包名称,因此配置单独行为的最简单方法是在库中测试该包名称,以查看它当前是在免费版本还是付费版本中运行。该测试可以在库项目中定义的自定义应用程序派生对象中进行;可以通过调用 getPackageName() 获取包名。

您的免费和付费应用程序至少可能只需要一个 AndroidManifest.xml 文件和一些资源(例如,区分免费和付费的应用程序图标)。

在两个应用程序的清单中,您将希望应用程序元素的 android.name 属性设置为自定义应用程序派生类(如库中定义)的完整路径。当然,您会希望将清单元素本身的 package= 属性设置为一个不同的包,该包以 .free 或 .paid 之类的结尾,用于相应的应用程序。然后清单中的活动对象可以有一个 android:name 属性,该属性设置为库中正确的 Activity 派生类(使用完整路径)。

然后,启用付费功能的代码将简单地调用自定义应用程序对象中测试包的方法,解析包名称,并在此基础上决定是否运行付费或免费版本,然后启用或禁用付费功能因此。

有一个非常有用的例子(虽然有点老,但仍然相关)完整的代码,在这里:

https://github.com/donnfelker/FullAndLiteVersionSharedLibrary/blob/master/FooLibrary/src/com/example/foolibrary/FooLibraryApplication.java

于 2012-06-27T03:57:37.433 回答