7

为了确保我的付费 android 应用程序是从商店合法安装的,我这样写:

String installer = getPackageManager().getInstallerPackageName(
        "com.example.myapp");

if (installer == null) {
    // app was illegally downloaded from unknown source. 
    // dear user, please re-install it from market
} 
else {
    // app was probably installed legally
    // (also it's good to check actual installer name)
}

可以吗?从市场合法购买和安装的应用程序是否有可能获得空的安装程序包名称并通过此测试?

我了解用户可以运行adb -i com.fake.installer myapp.apk并通过此检查,但更重要的是合法用户是否会遇到潜在问题。

4

2 回答 2

10

出于以下原因,您不应使用PackageManager#getInstallerPackageName检查应用程序是否从 Google Play 安装或用于许可目的:

1)安装程序包名称将来可能会更改。例如,安装程序包名称过去是"com.google.android.feedback"(参见此处),现在是"com.android.vending".

2)出于盗版原因检查安装程序包名等同于使用 Base64 加密密码——这只是一种不好的做法。

3)合法购买该应用程序的用户可以侧载 APK 或从另一个未设置正确安装程序包名称的备份应用程序中恢复它,并获得许可证检查错误。这很可能会导致差评。

4)就像你提到的,盗版可以在安装APK时简单地设置安装程序包名。


您应该使用App Licensing或切换到In-app Billing

于 2016-03-30T04:19:52.273 回答
6

虽然getInstallerPackage("com.example.mypackagename")做到了这一点,并且对于“黑客”来说,在没有实际付费的情况下仍然使用您的付费应用程序基本上有点困难,但确实这不是不让这种情况发生的最佳方法。

你能做些什么呢?

许可证的工作原理

这基本上确保了该应用程序已被使用手机的用户购买。

  • 您可以做的另一件事是让您的应用程序免费并添加应用程序购买。在您的情况下,只需 ONE in app 购买,一次性订阅。在我看来,这是解决这个问题的更好方法,原因有两个:
    1. 它解决了您最初的问题,不让用户使用您的高级功能,除非他们实际购买它们。
    2. 它使您的应用程序更易于下载。用户可以在购买之前先试用,这在尝试获得更多用户时总是一个加分项。

当然,这样做有一个缺点:如果您的应用程序架构不是围绕这个想法构建的,那么您需要做很多工作。不过,我认为这完全值得。

于 2016-03-31T10:56:48.190 回答