開発者コンソール

Android用のDRM


Android用のDRM

DRM(デジタル著作権管理、より一般的には、ライセンス検証)は、アプリの不正なコピーや配布に関する開発者の懸念に対処することを目的としています。アプリにDRMを実装する場合、アプリを購入したユーザーのみがDRMを認証済みデバイスにインストールできるようにします。

ライセンスチェックについて

DRM APIを使用すると、ユーザーにコンテンツのライセンスが付与されているかどうかを確認できます。Amazonアプリストアクライアントは、アプリのローカルキャッシュで適切なコンテンツライセンスを探します。ライセンスがローカルキャッシュで見つかると、それがレスポンスで返されます(したがって、ユーザーがオフラインでもアプリは実行されます)。 ライセンスがキャッシュに存在しない場合、AmazonアプリストアクライアントはAmazonアプリストアを呼び出してコンテンツライセンスを取得します。

DRM APIを使用してライセンスチェックを開始し、Amazonが返すライセンスのステータスに基づいてユーザーを承認または拒否するロジックを適用する必要があります。

Appstore SDKにおけるDRM

以前のバージョンでは、Android APKをAmazonアプリストアにアップロードする際、[APKファイル] タブの [Amazon DRMを適用しますか?][はい] または [いいえ] を選択することができました(以下のスクリーンショットを参照)。

ここで [はい] を選択した場合、アプリにDRMを適用するためのコードでAPKが自動的にラップされていました。

新しいAppstore SDKでは、申請後のAPKにこのラッパーが追加されなくなりました。この質問は開発者コンソールに表示されなくなります。最新バージョンのAppstore SDKをAPKに統合する場合は、既存のDRMライブラリを使用してください。旧バージョンのAppstore SDKを使用している場合はDRM機能を使用できないため、この値はデフォルトで [いいえ] になります。

警告メッセージ

アップロードしたAPKが旧バージョンのAppstore SDKを使用している場合、またはSDKをまったく使用していない場合は、次の警告が表示されます。

DRMサンプルアプリ

シンプルな統合でDRM APIコードを紹介するDRMのサンプルアプリとチュートリアルが用意されています。

アプリへのDRMの実装

アプリにDRMを実装するには、次の手順を実行します。

  1. Appstore SDKを統合する手順に従って、Appstore SDKをAndroidプロジェクトに追加します。
  2. verifyLicense()を呼び出して、ライセンス検証を開始します。このメソッドは、LicensingServiceクラスで公開されます。入力として、次の2つのパラメータを取ります。

    • ApplicationContext
    • LicensingListenerの実装

    アプリが起動したら、ライセンス検証を開始します。ライセンス検証は、次のいずれかの方法で開始できます。

    • MainActivityonCreate()メソッド
    • Applicationクラスのカスタム実装のonCreate()

    以下に例を示します。

    LicensingService.verifyLicense(this.getApplicationContext(), new LicensingCallback());
    
  3. LicensingListenerを実装します。

    LicensingListenerは、onLicenseCommandResponse(final LicenseResponse licenseResponse)という単一のメソッドを定義します。このメソッドは、AmazonアプリストアからverifyLicense呼び出しの結果を受け取った後、Appstore SDKによって呼び出されます。LicenseResponseで、verifyLicense呼び出しのステータスが返されます。レスポンスでは、次のいずれかのステータスが返されます。

    • LICENSED
    • NOT_LICENSED
    • ERROR_VERIFICATION
    • ERROR_INVALID_LICENSING_KEYS
    • EXPIRED
    • UNKNOWN_ERROR

    それぞれのステータスと理由については、ライセンスステータスを参照してください。

    LicensingListenerインターフェイスの基本的な実装は次のようになります(このコードは、返されたライセンスのステータスを記録するだけです)。

    public class LicensingCallback implements com.amazon.drm.LicensingListener {
      public void onLicenseCommandResponse(final LicenseResponse licenseResponse) {
             final LicenseResponse.RequestStatus status = licenseResponse.getRequestStatus();
             Log.d(TAG, "onLicenseCommandResponse: RequestStatus (" + status + ")");
             switch (status) {
                   case LICENSED:
                        Log.d(TAG, "onLicenseCommandResponse: LICENSED");
                        break;
                   case NOT_LICENSED:
                         Log.d(TAG, "onLicenseCommandResponse: NOT_LICENSED");
                         break;
                   case ERROR_VERIFICATION:
                         Log.d(TAG, "onLicenseCommandResponse: ERROR_VERIFICATION");
                         break;
                   case ERROR_INVALID_LICENSING_KEYS:
                         Log.d(TAG, "onLicenseCommandResponse: ERROR_INVALID_LICENSING_KEYS");
                         break;
                   case EXPIRED:
                         Log.d(TAG, "onLicenseCommandResponse: EXPIRED");
                         break;
                   case UNKNOWN_ERROR:
                         Log.d(TAG, "onLicenseCommandResponse: ERROR");
    } } }
    

ライセンスステータス

verifyLicense()を呼び出すと、次の表に定義されているいずれかのライセンスステータスがライセンスサービスから返されます。

ライセンスステータス 説明
LICENSED ユーザーは有効なライセンスを保有している。
NOT_LICENSED ユーザーは有効なライセンスを保有していない。このユーザーには、アプリを使用する権利がありません。
ERROR_VERIFICATION ライセンスの検証中にエラーが発生した。検証エラーの理由として、次の原因が考えられます。
  • アプリのメタデータ(チェックサム、署名、パッケージ名など)をAmazonが検証できなかった。
  • 「Appstore SDK」に送信されたライセンス(それ自体が「なりすまし」である可能性もあります)が転送中に改ざんされている。
ERROR_INVALID_LICENSING_KEYS ユーザーはライセンスキーを保有しているが、有効ではない。ライセンスキーが無効である理由として、次の原因が考えられます。
  • アプリにパブリックキーを追加しなかったか、または追加先のフォルダが正しくない。
  • 追加されたパブリックキーが、Amazonが保有する対応するプライベートキーと一致しない。
EXPIRED

ユーザーのライセンスの有効期限が切れ、現在は無効になっている。ライセンスの有効期間は60日間です。30日後から、Amazonアプリストアは24時間ごとにライセンスの更新を試みます。

ユーザーのオフライン期間が60日を超えた場合は、有効期限が切れる前にAmazonアプリストアがライセンスを更新することはできません。ライセンスの有効期限が切れた場合、それ以降ユーザーはアプリを起動できなくなります。

ライセンスの有効期限が切れる理由としては、ほかにも次の原因が考えられます。

  • ユーザーが注文の取り消しをリクエストした。
  • Amazonアプリストアが楽観的に(支払いトランザクションが確定する前に)ユーザーの注文を履行したものの、その後請求に失敗したためにライセンスが取り消された。

UNKNOWN_ERROR このステータスは、Amazon側の内部エラーを示します。

DRMライブラリの難読化

Appstore SDKライブラリのほとんどは、(JARにパッケージ化される前に)既に難読化されています。ただし、一部の開発者向けクラスは難読化されていません。次のDRMライブラリクラスは難読化されていません。

  • LicensingListener
  • LicensingService
  • LicenseResponse
  • RequestId

これらのクラスが難読化されないようにするには、ProGuardファイルに適切な参照を追加してクラスを除外します(ProGuardを使用してコードを難読化している場合)。