为了确保我的付费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
并通过此检查,但更重要的是法律的用户是否会遇到潜在的问题。
3条答案
按热度按时间xxb16uws1#
出于以下原因,您不应使用
PackageManager#getInstallerPackageName
检查应用是否从Google Play安装或用于许可目的:**1)**安装包名称可能会在以后发生变化,例如,安装包名称以前是
"com.google.android.feedback"
(参见here),现在是"com.android.vending"
。**2)**检查安装程序包的盗版原因相当于使用Base64加密密码-这只是不好的做法。
**3)**合法购买该应用的用户可以侧载APK或从其他备份应用恢复它,这些应用没有设置正确的安装程序包,并获得许可证检查错误。这很可能会导致差评。
**4)**就像你提到的,盗版者可以在安装APK时简单地设置安装程序包。
您应该使用App Licensing或切换到In-app Billing。
zf9nrax12#
虽然
getInstallerPackage("com.example.mypackagename")
做的伎俩,基本上是有点困难的“黑客”仍然利用您的付费应用程序,而实际上没有支付它,这是真的,这不是最好的方法,不让这种情况发生。你能做什么呢?
的数据
这基本上可以确保该应用程序已被使用手机的用户购买。
1.你可以做的另一件事是让你的应用程序免费并添加应用程序购买到它.在你的情况下,只是一个应用程序购买,一次性订阅.这,在我看来,是更好的解决这个问题,从两个原因:
1.它解决了你原来的问题,不让用户使用你的高级功能,除非他们真的购买它们。
1.它使您的应用程序更友好的下载。用户可以在购买之前尝试它,这在试图获得更多用户时总是有利的。
当然,这也有一个缺点:如果你的应用程序的架构不是围绕这个想法构建的,你会有很多工作要做。
1bqhqjot3#
这是更好的answer直接检查用户来自playstore或没有.但不要在此基础上阻止用户,因为有很多reasons.你可以只是验证.
所以,我在app中添加了这段代码,并在许多情况下检查了
output
。字符串
**条件1:**我直接安装应用程序从Android Studio在编码过程中(如通过adb/wire测试).
输出:
null
**条件2:**我构建
signed apk
并安装在设备中**条件3:**我在存储中备份
signed apk
并重新安装输出(同):
com.google.android.apps.nbu.files
**条件4:**我构建
signed abb
并在PlayStore
上更新输出:
com.android.vending
**条件5:**我备份了从
playstore
安装到存储中的应用程序并重新安装输出:
com.google.android.apps.nbu.files
..如果有人测试输出在其他条件下,如(输出的modded应用程序,从playstore下载//用户下载应用程序从其他商店,如amazonStore等..)然后请更新答案.