通过检查getInstallerPackageName来检查安装付费Android应用程序的合法性是否可以?

时间:2016-03-18 11:36:17

标签: android google-play piracy

为了确保我的付费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并通过此检查,但如果合法用户遇到潜在问题,则更为重要。

2 个答案:

答案 0 :(得分:3)

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

1)安装程序包名称以后可能会更改。例如,安装程序包名称使用"com.google.android.feedback"(请参阅here),现在为"com.android.vending"

2)检查安装程序packagename是否存在盗版原因等同于使用Base64加密密码 - 这只是不好的做法。

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

4)正如您所提到的,盗版者可以在安装APK时设置安装程序包名称。

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

答案 1 :(得分:3)

虽然getInstallerPackage("com.example.mypackagename")可以解决这个问题,但对于黑客来说基本上有点困难。仍然可以使用您的付费应用而无需实际支付,确实不是让这种情况发生的最佳方法。

你能做什么呢?

How license works

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

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

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