我知道开发免费和付费版本的应用程序的最佳方法是拥有一个包含程序主要部分的库项目。然后,免费和付费项目将使用此库项目。这允许免费和付费项目拥有不同的资源。
但是,我的问题是我们如何限制免费应用程序中的功能(或为付费应用程序扩展它)?例如,我的免费应用程序只能访问数据库表中的最新行,而付费应用程序可以访问所有行。
执行此操作的一种方法是在资源中设置一个布尔标志,您可以将其设置为true(对于付费)和false(免费)。在运行时,库项目检查布尔标志并相应地改变行为。但是,这似乎很容易破解任何潜在的攻击。还有更好的方法吗?
使用一个免费应用程序更容易完成,然后使用应用内结算来解锁专业版功能吗?
答案 0 :(得分:4)
恕我直言,Java / Android在这种情况下并不容易。理想情况下,您应该拥有一个代码库,并且能够随意编译付费或免费版本。免费版本将禁用关键方法/类,因此没有人可以修改数据库或xml以启用应用程序的完整功能。
执行此操作的一种方法是使用条件编译,Java也不支持。但是,有一些Ant任务可以做到这一点,例如http://prebop.sourceforge.net/doc.html。您可以在代码中添加如下内容:
/* $if paid_version$ */
public void paid_method() {
}
/* $endif$ */
如果您正在构建的ant目标没有定义pay_version变量,则上面的代码将被删除。
如何设置prebop是另一个主题altogther,它很复杂但值得拥有一个代码库。
2013年5月更新:基于Gradle的新Android构建系统可让您轻松构建付费和免费APK。有关“构建变体”的主题,请参阅Android Tools网站。简而言之,您可以像这样构建源:
/src/main/
/src/paid/
/src/free/
所有共享代码都位于/src/main
,付费代码位于/src/paid
,免费代码位于/src/free
。构建系统将为您创建付费和免费的APK。但是,仍然缺少的一个功能是能够在源本身中进行条件编译。在撰写本文时,Gradle构建工具仍处于测试状态,因此希望这将在最终版本中添加。
答案 1 :(得分:2)
永远不要在Res或SharedPrefs中保存任何指定是否支付了应用程序的标志。有根电话可以访问这些并可以修改它们。 我也有这个问题,写了两个单独的应用程序(复制付费的一个,删除了一些方法,添加了广告等)。这是最简单的解决方案。
答案 2 :(得分:2)
IMO从单一来源创建多个应用发布的最佳方法 以使用库项目。
我最近尝试了这个,它看起来效果很好。虽然我没有尝试将基于此的代码发布到Google Play,但我创建了单独的应用程序,这些应用程序可以在测试设备上同时运行,并带有自己的图标。
由于Android上的单独应用程序必须各自具有不同的程序包名称,因此配置单独行为的最简单方法是在库中测试该程序包名称,以查看它当前是在免费版本还是付费版本中运行。该测试可以在库项目中定义的自定义应用程序派生对象中进行;可以通过调用getPackageName()来获取包名称。
您的免费和付费应用至少可能只需要AndroidManifest.xml文件和一些资源(例如,区分免费付费的应用程序图标)。
在两个应用程序中的每个应用程序的清单中,您将希望application元素将其android.name属性设置为自定义Application派生类的完整路径(如库中所定义)。当然,您需要将清单元素本身的package =属性设置为一个独特的包,其结尾类似于.free或.paid,用于相应的应用程序。然后清单中的活动对象可以有一个android:name属性,该属性设置为库中正确的Activity派生类(使用完整路径)。
启用付费功能的代码将简单地调用在自定义Application对象中测试包的方法,解析包名称,并在此基础上决定付费版本或免费版本是否正在运行,然后启用或禁用相应的付费功能。
有一个非常有用的例子(虽然有些陈旧,但仍然相关)有完整的代码,在这里: