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

Rom*_*lov 7 android piracy google-play

为了确保我的付费 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)
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jar*_*ler 9

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

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

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

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

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


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

  • “安装程序包名称将来可能会更改”这个常量怎么样?GooglePlayServicesUtilLight.GOOGLE_PLAY_STORE_PACKAGE (7认同)

DDs*_*six 6

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

你能做什么呢?

许可证如何运作

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

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

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