拥有付费和免费版Android应用的最佳方式

DaB*_*ter 61 android

我已经在Android电子市场上有一个免费的应用程序,但我想添加一个具有更好功能的付费版本.我不能上传相同的一些更改的常量来解锁这些功能,因为市场告诉我,我已经在市场上有一个带有该包名称的应用程序.

这样做最干净的方法是什么?

Dan*_*icz 49

Android SDK正式解决了共享或公共代码库的问题,称为库项目.

http://developer.android.com/tools/projects/index.html

基本上,共享代码被定义为库项目,然后付费和免费版本只是eclipse工作台中的两个不同项目,两者都参考上述库项目.

在构建时,库项目将与您的任一版本合并,这是您想要的.

Android SDK示例源代码包含一个名为TicTacToe的项目,它将帮助您开始使用库项目.

祝好运.

丹尼尔

  • 我已经将这个解决方案用于我的应用程序的付费和免费版本,问题是我已经失去了调试源代码的能力,就像我以前一样.我已经将库链接到源代码,我可以在调试模式下看到源文件,但是我看不到变量值,有什么解决方法吗? (3认同)
  • 库项目允许您共享代码,而不是数据.在两个应用之间共享数据是另一个主题.实现内容提供商可以成为满足您需求的解决方案(等等). (2认同)

Lev*_*son 28

存在几种方法,但在您自己尝试之前,通常不会看到缺点.以下是我的经历:

  1. 解锁应用程序.这很容易实现,创建一个充当许可证的新应用程序:您的原始应用程序应检查解锁器应用程序的签名是否与您的应用程序的签名相匹配(如果是,解锁器在设备上可用,否则为否); 如果没有安装,你的解锁器应该提示下载你的免费应用程序,否则启动它并删除它的启动器图标.

    优点:易于实现,只需维护一个代码库.
    缺点:据说用户有时会对这个模型感到困惑,他们根本不明白为什么他们有两个启动器图标,或者他们刚刚下载了什么.删除启动器图标很麻烦,只有在重启设备时才能看到更改.此外,您似乎无法使用Google的许可API(LVL),因为您的免费应用无法代表您的付费解锁应用发出许可请求.对后者的任何解决方法都会导致糟糕的用户体验.

  2. 在应用程序内购买.如果你的代码中有IAP,这很容易实现,否则需要相当长的时间才能把事情做好.

    优点:维护和购买流程只有一个代码库非常方便.
    缺点:据说用户担心他们的购买是否"持久",这意味着如果他们以后将应用程序安装到其他设备或重新安装它们,他们是否仍然可以使用专业功能时会感到困惑.

  3. 带有共享库项目的免费和付费版本.这不应该是一个难以编码的事情,并且似乎是一个逻辑决定,让单个代码库包含大部分应用程序逻辑并仅维护差异.

    优点:用户对此模型的困惑较少,但他们可能担心如果他们开始使用付费版本,他们的偏好是否会丢失.
    缺点:就我的经验而言,Java/Eclipse在图书馆方面并不是很友好.正确设置项目需要一些时间,但是仍然会混淆整个工作如何工作,将什么放入清单,资源会发生什么等等.您将面临构建错误配置项目的问题,构建问题找不到资源(库项目不会"看到"已经引用的资源,因此您必须逐个编辑引用).此外,此模型不支持资产文件,这意味着您必须使用符号链接,复制或其他魔法来做一些技巧,这些技巧只会增加您的"单个代码库"项目已经变成的可怕混乱.当你的项目最终构建时,你必须保持手指交叉以使整个事情按预期工作,为缺少的图像和隐藏的错误做好准备.当然,您需要为用户提供一种便捷的方式,在首次启动时将其首选项迁移到付费版本.

  4. 带有独立代码库和源代码控制的免费和付费版本.乍一看,这似乎也是一个好主意,因为一个不错的源控制系统可以减轻你的负担,但是......

    优点:相同3.
    缺点:你将保留两个不同的代码库,除了合并/分支地狱之外别无其他这是预料之中的.应用程序包名称应该不同,因此您可能需要区分每个文件,以保持清洁.当然,您需要为用户提供一种便捷的方式,在首次启动时将其首选项迁移到付费版本.

  5. 带有脚本的免费和付费版本,这些脚本来自另一个.这听起来像是一个肮脏的黑客,但你肯定知道它的工作原理.

    优点:与3相同,您只需维护一个代码库.
    缺点:创建脚本需要一些时间(确保重命名文件夹,替换包,应用程序和项目名称)并且必须小心地在必要时不时更新脚本(这不会发生如果免费和付费版本之间没有太多差异).当然,您需要为用户提供一种便捷的方式,在首次启动时将其首选项迁移到付费版本.

没有解决方案是完美的,但如果您即将开始实施其中一种可能性,上述内容可以帮助您指明正确的方向.


Lah*_*ima 24

使用Gradle构建系统,您现在可以拥有不同的产品口味,每个口味都有自己的包名称.以下是一个示例gradle脚本,具有相同应用程序的免费和专业版.

apply plugin: 'com.android.application'

android {
    compileSdkVersion 19
    buildToolsVersion "19.1"

    defaultConfig {
        applicationId "com.example.my.app"
    }

    productFlavors {
        free {
            applicationId "com.example.my.app"
            minSdkVersion 15
            targetSdkVersion 23
            versionCode 12
            versionName '12'
        }
        pro {
            applicationId "com.example.my.app.pro"
            minSdkVersion 15
            targetSdkVersion 23
            versionCode 4
            versionName '4'
        }
    }
Run Code Online (Sandbox Code Playgroud)

Rclass仍将在指定的包名中生成,AndroidManifest.xml因此在切换flavor时不需要更改单行代码.

您可以从Build Variants可从Android Studio左下角访问的窗格切换风味.此外,当你想生成一个签名的APK时,android studio会问你想要构建APK的风格.

此外,您可以为每种风味提供不同的资源.例如,您可以在目录pro中创建src目录.目录结构应该与main目录类似.(例如:如果您想为专业版提供不同的启动器图标,您可以将其放入src\pro\res\drawable.这将替换位于其中的免费图标src\main\res\drawable,当您切换到pro风味时).

如果你创建一个上面描述的strings.xmlin pro资源目录,main strings.xml和pro strings.xml将合并在一起strings.xml构建一个最终版本时获得一个final pro.如果free和pro xml中都存在某个字符串键,则字符串值将从pro xml中获取.

如果您需要在代码中检查当前版本是专业版还是免费版,您可以使用如下方法.

public boolean isPro() {
    return context.getPackageName().equals("com.example.my.app.pro");
}
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,请参阅

  • 如果使用gradle构建,这是迄今为止最好的解决方案. (3认同)

use*_*990 15

一个源代码两个应用程序(Eclipse)

有市场管理与两种形式呈现的应用程序,可能与两者之间只有一个比特的差异经常发生的问题(paidFor =真;)也许图标也不同.

此方法使用Mihai在http://blog.javia.org/android-package-name/中解释的包名称的描述,其中强调了用于管理源代码的包名称与用于发布源代码的包名称之间的区别.在Android电子市场上的apk.在这个例子中的两个发布的包名com.acme.superprogram和com.acme.superprogrampaid,Java源代码包的名字是com.acme.superprogram.

在清单中,列出了活动并将其命名为.ActivityName.Mike Wallace在他最近的演讲中指出,前面的点很重要,可以用完全合格的包替换.例如,"com.acme.superprogram.DialogManager"可以替换manifest.xml文本中的".DialogManager".

第1步是使用java源代码管理包名称(com.acme.superprogram)替换所有活动android:name条目和这些完全限定的包名称.

然后可以更改Manifest Package名称...

在Eclipse中,这会强制重新编译,并在gen文件夹中创建新的R.java.这是有点棘手的地方; 有两个文件夹com.acme.superprogram和com.acme.superprogrampaid,只有一个文件夹有R.java.只需将R.java复制到另一个文件夹中,以便程序可以解析R.layout.xyz项.

当您更改包中

我在几个应用程序上尝试过它.我在模拟器和2.1手机上都一起跑,他们都在Android Market上.

  • 两个软件包之间只有一点差异(一个paidFor标志)危险吗?您基本上是在免费版本中赠送完整代码,在代码开头有一个标志,即使代码被混淆,也很容易识别和更改? (2认同)