2016-03-18 1 views
4

Pour vous assurer que mon application Android a été payé légalement installé du magasin, j'écris ceci:Est-il acceptable de vérifier la légalité de l'installation de l'application Android payante en vérifiant getInstallerPackageName?

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) 
} 

Est-il ok? Y a-t-il une chance que l'application légalement achetée et installée sur le marché obtienne un nom de paquet d'installation vide et échoue à ce test?

Je comprends que l'utilisateur peut exécuter adb -i com.fake.installer myapp.apk et passer cette vérification, mais il est plus important si utilisateurs juridiques auront des problèmes potentiels ou non.

Répondre

3

Vous ne devriez pas utiliser PackageManager#getInstallerPackageName pour vérifier si l'application a été installée sur Google Play ou à des fins de licence pour les raisons suivantes:

1) Le packagename installateur peut changer à l'avenir. Par exemple, le nom du package de l'installateur est "com.google.android.feedback" (voir here) et maintenant il est "com.android.vending".

2) Vérification de l'installation packagename pour des raisons de piratage équivaut à utiliser pour chiffrer les mots de passe Base64 - il est tout simplement une mauvaise pratique. Les utilisateurs qui ont légalement acheté l'application peuvent télécharger le fichier APK ou le restaurer à partir d'une autre application de sauvegarde qui ne définit pas le bon nom d'installation du programme d'installation et obtient une erreur de vérification de licence. Cela conduira probablement à de mauvaises critiques.

4) Comme vous l'avez mentionné, les pirates peuvent simplement définir le nom de fichier du programme d'installation lors de l'installation du fichier APK.


Vous devez utiliser App Licensing ou de passer à In-app Billing.

+0

Cette dernière modification suggérant que le PO devrait utiliser l'application de licence ou la facturation via l'application est à peu près ma réponse que j'ai posté plus tôt. "Assez juste" de vous :) – DDsix

3

Alors que getInstallerPackage("com.example.mypackagename") fait l'affaire et est fondamentalement un peu plus difficile pour les «pirates» de toujours utiliser votre application payante sans réellement payer pour cela, il est vrai que ce n'est pas la meilleure méthode pour ne pas laisser cela se produire.

Que pouvez-vous faire à la place?

How license works

Cela garantit essentiellement que l'application a été acheté par l'utilisateur à l'aide du téléphone.

  • Une autre chose que vous pouvez faire est de rendre votre application gratuite et d'y ajouter des achats intégrés. Dans votre cas, juste un achat in-app, un abonnement unique. Ceci, à mon avis, est la meilleure solution à ce problème, pour deux raisons:
    1. Il résout votre problème d'origine, ne laissant pas les utilisateurs utiliser vos fonctionnalités premium à moins qu'ils ne les achètent réellement.
    2. Cela rend votre application plus conviviale à télécharger.Les utilisateurs peuvent l'essayer avant de l'acheter, et c'est toujours un plus quand vous essayez d'obtenir plus d'utilisateurs.

Bien sûr, il y a un inconvénient à ceci, vous avez beaucoup de travail si l'architecture de votre application n'a pas été construit autour de cette idée. Cependant, je pense que ça en vaut vraiment la peine.