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サンプルアプリ
シンプルな統合のDRM APIコードを示すDRMサンプルアプリとチュートリアルが用意されています。
アプリへのDRMの実装
アプリにDRMを実装するには、次の手順を実行します。
-
Appstore SDKの統合の手順に従って、Appstore SDKをAndroidプロジェクトに追加します。
- アプリのマニフェストファイルを更新します。
-
マニフェストに
ResponseReceiver
のエントリを追加します。次のコード例は、DRM用のAndroidManifest.xmlファイルにResponseReceiver
を追加する方法を示しています。アプリがAndroid 12以降を対象としている場合は、次の例に示すように、MainActivity
とResponseReceiver
でandroid: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>
-
アプリが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>
-
-
verifyLicense()
を呼び出して、ライセンス検証を開始します。このメソッドは、LicensingService
クラスで公開されます。入力として、次の2つのパラメータを取ります。ApplicationContext
LicensingListener
の実装
アプリが起動したら、ライセンス検証を開始します。ライセンス検証は、次のいずれかの方法で開始できます。
MainActivity
のonCreate()
メソッドApplication
クラスのカスタム実装のonCreate()
以下に例を示します。
LicensingService.verifyLicense(getApplicationContext(), new LicenseVerificationCallback(this));
ヒント:LicensingService
クラスには、アプリがSANDBOX
とPRODUCTION
のどちらのモードで実行されているかを特定するためのgetAppstoreSDKMode()
メソッドが用意されています。これは、アプリをサンドボックスモードにする必要があるAmazon App Testerでアプリをテストする際に役立ちます。このgetAppstoreSDKMode()
メソッドでは、verifyLicense()
の呼び出しが事前に行われていない場合、UNKNOWN
が返されます。 -
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"); } } }
ヒント: DRMサンプルアプリに実装例が用意されています。
ライセンスステータス
verifyLicense()
を呼び出すと、次の表に定義されているいずれかのライセンスステータスがライセンスサービスから返されます。
ライセンスステータス | 説明 |
---|---|
LICENSED |
ユーザーは有効なライセンスを保有している。 |
NOT_LICENSED |
ユーザーは有効なライセンスを保有していない。このユーザーには、アプリを使用する権利がありません。 |
ERROR_VERIFICATION |
ライセンスの検証中にエラーが発生した。検証エラーの理由として、次の原因が考えられます。
|
ERROR_INVALID_LICENSING_KEYS |
ユーザーはライセンスキーを保有しているが、有効ではない。ライセンスキーが無効である理由として、次の原因が考えられます。
|
EXPIRED |
ユーザーのライセンスの有効期限が切れ、現在は無効になっている。ライセンスの有効期間は60日間です。30日後から、Amazonアプリストアは24時間ごとにライセンスの更新を試みます。 ユーザーのオフライン期間が60日を超えた場合は、有効期限が切れる前にAmazonアプリストアがライセンスを更新することはできません。ライセンスの有効期限が切れた場合、それ以降ユーザーはアプリを起動できなくなります。 ライセンスの有効期限が切れる理由としては、ほかにも次の原因が考えられます。
|
UNKNOWN_ERROR |
このステータスは、Amazon側の内部エラーを示します。 |
DRMライブラリの難読化
Appstore SDKライブラリのほとんどは、(JARにパッケージ化される前に)既に難読化されています。ただし、一部の開発者向けクラスは難読化されていません。次のDRMライブラリクラスは難読化されていません。
LicensingListener
LicensingService
LicenseResponse
RequestId
これらのクラスが難読化されないようにするには、ProGuardファイルに適切な参照を追加してクラスを除外します(ProGuardを使用してコードを難読化している場合)。
Last updated: 2024年12月4日