为了确保我的付费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
并通过此检查,但如果合法用户遇到潜在问题,则更为重要。
答案 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")
可以解决这个问题,但对于黑客来说基本上有点困难。仍然可以使用您的付费应用而无需实际支付,确实不是让这种情况发生的最佳方法。
你能做什么呢?
这基本上确保了用户使用手机购买了应用程序。
当然,这有一个缺点:如果您的应用程序的架构不是围绕这个想法构建的,那么您需要做很多工作。但是,我认为这完全值得。