Можно ли проверить легальность установки платного приложения для 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") делает хиты и, в принципе, "хакерам" немного сложнее использовать платное приложение, не платя за него, это правда, что это не лучший способ не допустить этого.

Что вы можете сделать вместо этого?

Как работает лицензия

Это в основном гарантирует, что приложение было куплено пользователем с помощью телефона.

  • Еще одна вещь, которую вы можете сделать, это сделать ваше приложение бесплатным и добавить в него покупки. В вашем случае, просто ОДИН в покупке приложения, одноразовая подписка. Это, на мой взгляд, лучшее решение этой проблемы по двум причинам:
    1. Он решает вашу первоначальную проблему, не позволяя пользователям использовать ваши премиальные функции, если они на самом деле их не покупают.
    2. Это делает ваше приложение более удобным для загрузки. Пользователи могут попробовать его, прежде чем купить, и это всегда является плюсом при попытке привлечь больше пользователей.

Конечно, есть и обратная сторона: у вас много работы, если архитектура вашего приложения не построена на этой идее. Тем не менее, я думаю, что это того стоит.

Это лучший ответ , чтобы напрямую проверить, заходят ли пользователи из игрового магазина или нет. Но не блокируйте пользователей на этом основании, поскольку на то есть много причин . Вы можете просто проверить.

Итак, я добавляю этот код в приложение и проверяю 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 и т. д.), тогда обновите ответ.

Другие вопросы по тегам