ライセンスの概要

Google Play ライセンス機能とは、信頼できる Google Play ライセンス サーバーにアプリからクエリを実行して、現在のデバイスのユーザーにそのアプリのライセンスが付与されているかどうかを判断できる、ネットワークベースのサービスです。このライセンス サービスでは、Google Play ライセンス サーバーの機能に基づいて、そのユーザーにアプリ使用のライセンスが付与されているかどうかが判断されます。Google Play では、そのユーザーがアプリの購入者として記録されていれば、ライセンスが付与されているとみなします。

アプリから、Google Play クライアント アプリがホストするサービスにリクエストすることで、リクエストが開始されます。Google Play アプリでは、ライセンス サーバーへのリクエストの送信と、結果の受信が行われます。その結果は、Google Play アプリからリクエスト元のアプリに送信されます。アプリでは、必要に応じて以後の使用を許可または拒否できます。

注: アプリのバージョンがクローズドまたはオープンのテストトラックにある場合、そのアプリのダウンロードとインストールを許可されているすべてのユーザーは、ライセンスを付与されているとみなされます。詳細については、テストトラックを使用して、ユーザーから初期段階の貴重なフィードバックを得るをご覧ください。

図 1. アプリからの License Verification Library と Google Play クライアント(Google Play サーバーとの通信を処理するクライアント)を介したライセンス チェックの開始

注: 以前は、公開前のドラフト版をアップロードしてアプリをテストできました。この機能はサポートされなくなったため、代わりに、クローズド テスト トラックまたはオープンテスト トラックにアプリを公開する必要があります。 詳しくは、ドラフト版アプリのサポートの終了についての説明をご覧ください。

正しくユーザーを識別してライセンス ステータスを判断するには、ライセンス サーバーにアプリとユーザーに関する情報が必要です。この情報は、アプリと Google Play クライアントの連携により収集され、Google Play クライアントからサーバーに渡されます。

Android SDK には、アプリにライセンス機能を追加するためのダウンロード可能なライブラリ ソース(Google Market Licensing パッケージ)が用意されています。License Verification Library(LVL)は、アプリに追加可能なライブラリで、Google Play ライセンス サービスとのライセンス関連のすべての通信を処理します。アプリに LVL を追加すれば、メソッドの呼び出しと、ステータス応答を受け取るコールバックの実装を行うだけで、現在のユーザーのライセンス ステータスを判断できるようになります。

アプリでは、ライセンス サーバーに直接クエリを行う代わりに、リモート IPC 経由で Google Play クライアントを呼び出すことで、ライセンス リクエストを開始します。ライセンス リクエストでは、次の処理が行われます。

  • アプリは、アプリのパッケージ名、後でサーバーからの応答を検証するために使用するノンス、応答を非同期に受け取るためのコールバックを提供します。
  • Google Play クライアントは、ユーザーとデバイスに関する必要な情報(デバイスのメイン Google アカウントのユーザー名、IMSI など)を収集します。その後、アプリの代理として、ライセンス チェック リクエストをサーバーに送信します。
  • Google Play サーバーは、利用可能なすべての情報に基づいてリクエストを評価し、十分に信頼できるレベルのユーザー ID の確立を試みます。その後、このユーザー ID をアプリの購入記録と照合し、ライセンス応答を返します。この応答は、Google Play クライアントから IPC コールバックを介してアプリに返されます。

アプリでライセンス チェックを行うタイミングと頻度は選択できます。また、応答の処理方法、署名付き応答データの検証方法、アクセス制御の適用方法も自由に選択できます。

ライセンス チェック中に、アプリでネットワーク接続を管理したり、Android プラットフォームのライセンス関連 API を使用したりすることはありません。

ライセンス応答の安全性

個々のライセンス クエリの完全性を確保するため、ライセンス応答データには、Google Play サーバーとパブリッシャーとの間でしか共有されない RSA 鍵ペアを使用してサーバーが署名します。

ライセンス サービスにより、アプリごとに 1 つのライセンス用鍵ペアが生成され、Play Console の対象アプリの [サービスと API] ページにその公開鍵が公開されます。アプリのソースコードには、公開鍵を Play Console からコピーして埋め込む必要があります。秘密鍵はサーバー内部に保持され、パブリッシャーのアカウントで公開するアプリのライセンス応答への署名に使われます。

アプリで署名付き応答を受信すると、コードに埋め込まれた公開鍵を使用してデータが検証されます。ライセンス サービスに公開鍵暗号を使用することで、応答の改ざんやなりすましをアプリで検出できます。

Licensing Verification Library

Android SDK には、Google Market Licensing パッケージというダウンロード可能パッケージが用意されており、License Verification Library(LVL)はこれに含まれています。LVL を使用することで、アプリにライセンス機能を追加するプロセスを大幅に簡素化でき、アプリをより安全かつ堅牢に実装できます。LVL が提供する内部クラスで、ライセンス クエリの標準操作(Google Play クライアントと通信してライセンス リクエストを開始する、応答の確認と検証を行うなど)のほとんどを処理できます。また、カスタムコードを組み込むためのインターフェースも公開されており、必要に応じて、アプリでこれを使用してライセンス ポリシーの定義やアクセスの管理を行うことができます。LVL の主なインターフェースは次のとおりです。

Policy
実装では、サーバーから受信したライセンス応答と利用可能なその他すべてのデータ(アプリに関連付けられているバックエンド サーバーからのデータなど)に基づいて、アプリへのアクセスを許可するかどうかを決定します。ライセンス応答のさまざまなフィールドを評価し、必要に応じて他の制約を適用できます。また、ライセンス チェックでネットワーク エラーなどのエラーが発生した場合の処理も管理できます。
LicenseCheckerCallback
実装では、Policy オブジェクトによるライセンス応答の処理結果に基づいて、アプリへのアクセスを管理します。ライセンス結果を UI に表示したり、ユーザーにアプリを購入するよう促したり(現在ライセンスが付与されていない場合)するなど、必要に応じてアクセスを管理できます。

Policy を容易に使えるようにするため、LVL には次の 2 種類の完全な Policy 実装が用意されています。これらは、そのまま使用することも、ニーズに合うよう変更して使用することもできます。

ServerManagedPolicy
柔軟な Policy。デバイスがオフラインの場合(飛行機内にいるときなど)には、ライセンス サーバーから提供された設定を使用して応答のキャッシュ保存やアプリへのアクセスを管理します。ほとんどのアプリで ServerManagedPolicy を使用することを強くおすすめします。
StrictPolicy
制限付きの Policy は、レスポンス データをキャッシュに保存せず、ライセンス付与済みというレスポンスがサーバーから返された場合にのみアプリへのアクセスを許可します。

LVL は、Android SDK のダウンロード可能パッケージとして入手できます。このパッケージには、LVL そのものに加え、サンプルアプリも含まれます。サンプルアプリは、ライブラリとアプリを統合する方法、アプリで応答データ、UI 操作、エラー状態を管理する方法を示します。

LVL ソースは単一の Android ライブラリ プロジェクトとして提供されます。つまり、ライブラリ ソース一式として管理し、複数のアプリ間で共有できます。SDK を通じて包括的なテスト環境も利用できるため、物理デバイスを使用できない場合でも、アプリに実装するライセンス機能を開発して公開前にテストできます。

要件と制限事項

Google Play ライセンス機能は、Google Play で公開するアプリに対して、ライセンス管理を適用するためのものです。Google Play で公開しないアプリや、Google Play クライアントを搭載していないデバイスで実行されるアプリについては、アクセスを制御できるよう設計されていません。

以下に、アプリへのライセンス機能の実装で留意すべき点を示します。

  • アプリでこのサービスを使用できるのは、ホストデバイスに Google Play クライアントがインストールされ、Android 1.5(API レベル 3)以上が搭載されている場合のみです。
  • ライセンス チェックを完了するには、ネットワーク経由でライセンス サーバーにアクセスできる必要があります。ただし、ライセンスのキャッシュ保存機能を実装することで、ネットワーク接続がないときでもアプリへのアクセスを管理できます。
  • アプリのライセンス管理のセキュリティは、最終的には実装そのものの設計に依存します。このサービスには、ライセンス チェックを安全に行うための構成要素が用意されていますが、ライセンスの実際の適用と処理はデベロッパーが担います。これより先にあるドキュメントに記載されたおすすめの方法を採用することで、実装の安全性を高めることができます。
  • アプリにライセンス機能を追加しても、Google Play を搭載していないデバイスでは、アプリの機能は変わりません。
  • 無料アプリにライセンス管理を実装できるのは、APK 拡張ファイルを提供するためにこのサービスを使用する場合のみです。

コピー防止機能の後継

Google Play ライセンス機能は、アプリへのアクセスを制御するための柔軟で安全なメカニズムです。これは、以前 Google Play で提供されていたコピー防止メカニズム(サポートされなくなりました)の実質的な代わりになると同時に、アプリのより広範な配布を可能にするものです。

Google Play ライセンス機能を使用することで、Google Play にアクセスできるすべてのデバイスに適用可能なライセンスベースのモデルに移行できます。アクセスは、ホストデバイスの特性ではなく、Google Play 上のアプリ(アプリの公開鍵を使用)と、そのアプリ用に定義したライセンス ポリシーによって決まります。アプリは任意のデバイスの任意のストレージ(SD カードを含む)にインストール、管理できます。

どのような不正使用も完全に防止できるライセンスの仕組みはありませんが、このライセンス サービスを使用すれば、対応するすべてのデバイス(ロック状態、ロック解除状態にかかわらず)で、通常の形態でのほぼすべての使用を制御できます。

アプリへのライセンス機能の追加を開始するには、ライセンス機能追加のためのセットアップに進みます。