Можно ли проверить легальность установки платного приложения для Android, проверив getInstallerPackageName?
Чтобы убедиться, что мое платное 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 ответа
Вы не должны использовать PackageManager#getInstallerPackageName
проверить, установлено ли приложение из Google Play или для целей лицензирования по следующим причинам:
1) Установщик packagename может измениться в будущем. Например, имя установочного пакета должно быть "com.google.android.feedback"
(см. здесь) и теперь это "com.android.vending"
,
2) Проверка названия пакета установщика в целях пиратства эквивалентна использованию Base64 для шифрования паролей - это просто плохая практика.
3) Пользователи, которые законно приобрели приложение, могут загрузить APK или восстановить его из другого приложения резервного копирования, которое не установило правильное имя пакета установщика и получило ошибку проверки лицензии. Это, скорее всего, приведет к плохим отзывам.
4) Как вы упомянули, пираты могут просто установить имя пакета установщика при установке APK.
Вам следует использовать лицензирование приложений или перейти на биллинг внутри приложения.
В то время как getInstallerPackage("com.example.mypackagename")
делает хиты и, в принципе, "хакерам" немного сложнее использовать платное приложение, не платя за него, это правда, что это не лучший способ не допустить этого.
Что вы можете сделать вместо этого?
- Вы можете добавить лицензию в свое приложение.
Это в основном гарантирует, что приложение было куплено пользователем с помощью телефона.
- Еще одна вещь, которую вы можете сделать, это сделать ваше приложение бесплатным и добавить в него покупки. В вашем случае, просто ОДИН в покупке приложения, одноразовая подписка. Это, на мой взгляд, лучшее решение этой проблемы по двум причинам:
- Он решает вашу первоначальную проблему, не позволяя пользователям использовать ваши премиальные функции, если они на самом деле их не покупают.
- Это делает ваше приложение более удобным для загрузки. Пользователи могут попробовать его, прежде чем купить, и это всегда является плюсом при попытке привлечь больше пользователей.
Конечно, есть и обратная сторона: у вас много работы, если архитектура вашего приложения не построена на этой идее. Тем не менее, я думаю, что это того стоит.
Это лучший ответ , чтобы напрямую проверить, заходят ли пользователи из игрового магазина или нет. Но не блокируйте пользователей на этом основании, поскольку на то есть много причин . Вы можете просто проверить.
Итак, я добавляю этот код в приложение и проверяю
output
во многих условиях.
// The package name of the app that has installed your app
final String installer = context.getPackageManager().getInstallerPackageName(context.getPackageName());
Условие 1: я устанавливаю приложение напрямую из Android Studio во время кодирования (например, тестирование через adb/wire).
Выход:
null
Условие 2: я собираю и устанавливаю на устройство
Условие 3: я делаю резервную копию
signed apk
в хранилище и переустановите егоВыход (тот же):
Условие 4: Я строю
signed abb
и обновитьPlayStore
Выход:
com.android.vending
Условие 5: я делаю резервную копию приложения, установленного с
playstore
в хранилище и переустановите егоВыход:
com.google.android.apps.nbu.files
..если кто-нибудь тестирует выходные данные в других условиях, например (вывод модифицированного приложения, которое загружается из игрового магазина // пользователи загружают приложение из других магазинов, таких как amazonStore и т. д.), тогда обновите ответ.