開発者コンソール

Android用のDRM

Android用のDRM

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

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

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

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

Appstore SDKにおけるDRM

以前は、Android APKをAmazonアプリストアにアップロードする際、[Amazon DRMを適用しますか?][はい] または [いいえ] を選択できるオプションが用意されていました。ここで [はい] を選択すると、アプリにDRMが追加されていました。

Appstore SDKを使用すると、このオプションは開発者コンソールに表示されません。APKにDRMを追加する場合は、DRM API(Appstore SDKの一部として提供)を使用して、ライセンスチェック機能をアプリに組み込みます。

Appstore SDKにアップグレードしておらず、以前のIAP SDKを使用している(またはIAPを使用していない)場合は、APKをアップロードすると、[<APK名>へのDRMの適用をAmazonに許可しますか?] というオプションが表示されます。

警告メッセージ

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

アプリファイルがDRM統合を含まない古いバージョンのSDKを使用しています。上記のDRM設定を選択してください。コードにDRMサポートを追加したい場合は、Appstore SDKを使用してください。

DRMサンプルアプリ

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

アプリへのDRMの実装

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

  1. Appstore SDKの統合の手順に従って、Appstore SDKをAndroidプロジェクトに追加します。

  2. アプリのマニフェストファイルを更新します。
    1. マニフェストにResponseReceiverのエントリを追加します。次のコード例は、DRM用のAndroidManifest.xmlファイルにResponseReceiverを追加する方法を示しています。アプリがAndroid 12以降を対象としている場合は、次の例に示すように、MainActivityResponseReceiverandroid:exportedを明示的にtrueに設定する必要があります。

        <application>
        ...
           <activity android:label="@string/app_name" android:name="com.amazon.sample.drm.MainActivity" 
                       android:exported="true">
                 <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                 </intent-filter>
           </activity>
      
           <receiver android:name = "com.amazon.device.drm.ResponseReceiver" android:exported="true" 
                       android:permission = "com.amazon.drm.Permission.NOTIFY" >
                 <intent-filter>
                    <action android:name = "com.amazon.drm.NOTIFY" />
                 </intent-filter>
           </receiver>
        ...
        </application>
      
    2. アプリがAndroid APIレベル30以上を対象としている場合は、アプリから照会する必要のあるパッケージのリストをAndroidManifest.xmlに定義する必要があります。Amazon App TesterとAmazonアプリストアを照会できるようにするには、マニフェストファイルに次のコードを追加します。

        <manifest>
        ...
           <queries>
              <package android:name="com.amazon.sdktestclient" />
              <package android:name="com.amazon.venezia" />
           </queries>
        </manifest>
      
  3. verifyLicense()を呼び出して、ライセンス検証を開始します。このメソッドは、LicensingServiceクラスで公開されます。入力として、次の2つのパラメータを取ります。

    • ApplicationContext
    • LicensingListenerの実装

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

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

    以下に例を示します。

    LicensingService.verifyLicense(getApplicationContext(), new LicenseVerificationCallback(this));
    
  4. 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 LicenseVerificationCallback implements com.amazon.device.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を使用してコードを難読化している場合)。


Last updated: 2024年12月4日