Dokumen ini memberikan ringkasan framework manajemen hak digital (DRM) Android dan memperkenalkan antarmuka yang harus diterapkan plugin DRM. Dokumen ini tidak menjelaskan aturan keandalan atau aturan kepatuhan yang dapat ditentukan oleh skema DRM.
Kerangka kerja
Platform Android menyediakan framework DRM yang dapat diperluas yang memungkinkan aplikasi mengelola konten yang dilindungi hak sesuai dengan batasan lisensi yang terkait dengan konten. Framework DRM mendukung banyak skema DRM; skema DRM yang didukung oleh perangkat bergantung pada produsen perangkat. Framework DRM menyediakan antarmuka terpadu untuk developer aplikasi dan menyembunyikan kompleksitas operasi DRM. Framework DRM menyediakan mode operasi yang konsisten untuk konten yang dilindungi dan tidak dilindungi. Skema DRM dapat menentukan model penggunaan yang kompleks berdasarkan metadata lisensi. Framework DRM menyediakan asosiasi antara konten dan lisensi DRM, serta menangani pengelolaan hak. Hal ini memungkinkan pemutar media dipisahkan dari konten yang dilindungi DRM atau tidak dilindungi. Lihat MediaDrm untuk class guna mendapatkan kunci untuk mendekripsi streaming media yang dilindungi.
Ketersediaan konten digital yang lengkap penting bagi pengguna di perangkat seluler. Agar konten mereka tersedia secara luas, developer Android dan penayang konten digital memerlukan penerapan DRM yang konsisten dan didukung di seluruh ekosistem Android. Untuk menyediakan konten digital tersebut di perangkat Android dan memastikan bahwa ada setidaknya satu DRM yang konsisten di semua perangkat, Google menyediakan DRM tanpa biaya lisensi di perangkat Android yang kompatibel. Plugin DRM terintegrasi dengan framework DRM Android dan dapat menggunakan perlindungan yang didukung hardware untuk mengamankan konten premium dan kredensial pengguna.
Perlindungan konten yang disediakan oleh plugin DRM bergantung pada keamanan dan kemampuan perlindungan konten dari platform hardware yang mendasarinya. Kemampuan hardware perangkat harus menyertakan booting aman hardware untuk membuat rantai kepercayaan keamanan dan perlindungan kunci kriptografis. Kemampuan perlindungan konten perangkat harus mencakup perlindungan frame yang didekripsi di perangkat dan perlindungan konten melalui mekanisme perlindungan output tepercaya. Tidak semua platform hardware mendukung semua fitur keamanan dan perlindungan konten di atas. Keamanan tidak pernah diterapkan di satu tempat dalam stack, tetapi bergantung pada integrasi hardware, software, dan layanan. Kombinasi fungsi keamanan hardware, mekanisme booting tepercaya, dan OS aman yang terisolasi untuk menangani fungsi keamanan sangat penting untuk menyediakan perangkat yang aman.
Arsitektur
Framework DRM dirancang agar tidak bergantung pada implementasi dan memisahkan detail implementasi skema DRM tertentu dalam plugin DRM khusus skema. Framework DRM menyertakan API sederhana untuk menangani operasi DRM yang kompleks, memperoleh lisensi, menyediakan perangkat, mengaitkan konten DRM dan lisensinya, dan terakhir mendekripsi konten DRM.
Framework DRM Android diterapkan dalam dua lapisan arsitektur:
- API framework DRM, yang diekspos ke aplikasi melalui framework aplikasi Android.
- Framework DRM kode native, yang mengekspos antarmuka untuk plugin DRM (agen) guna menangani pengelolaan hak dan dekripsi untuk berbagai skema DRM.
Lihat Android Media DRM dan Android Media Crypto untuk mengetahui detail selengkapnya.
Plugin DRM
Saat memulai sistem, framework DRM akan memindai instance/layanan HAL (dijelaskan dalam file .rc
)
dan plugin akan ditemukan. Server DRM Media (mediadrmserver
) membuat
objek CryptoHal
dan DrmHal
.
CryptoHal
dan DrmHal
kemudian memanggil plugin dengan implementasi khusus
vendor.
Plugin harus menerapkan HAL yang dibinderisasi. HAL yang di-binderkan menggunakan Android Interface Definition Language (AIDL), yang memungkinkan framework diganti tanpa harus mem-build ulang HAL.
Plugin dibuat oleh vendor atau pembuat SOC dan ditempatkan di partisi /vendor
di
perangkat. Semua perangkat yang diluncurkan dengan Android 13 atau yang lebih tinggi harus mendukung HAL binderized yang ditulis
dalam bahasa AIDL.
Implementasi
Rilis perangkat GMS dan AOSP untuk Android 13 harus menggunakan antarmuka AIDL.
Untuk menerapkan API framework DRM baru dengan plugin:
- Tambahkan layanan plugin ke file build perangkat.
- Perbarui manifes perangkat.
- Menambahkan izin SELinux.
- Buat file
.rc
di/vendor
. - Implementasikan plugin.
API ditentukan di setiap versi IDrmPlugin.aidl
,
ICryptoPlugin.aidl
, IDrmFactory.aidl
,
dan ICryptoFactory.aidl
aidl/PLATFORM_ROOT/hardware/interfaces/drm/
Menambahkan layanan plugin ke file build perangkat
Misalnya, untuk menambahkan dukungan antarmuka AIDL,
file VENDOR DEVICE/device.mk
harus menyertakan
paket android.hardware.drm-service.*
:
PRODUCT_PACKAGES += \ android.hardware.drm-service.clearkey \ android.hardware.drm-service.widevine
Memperbarui manifes perangkat
File vendor manifest.xml
untuk perangkat harus menyertakan entri berikut:
<hal format="aidl"> <name>android.hardware.drm</name> <version>STABLE AIDL VERSION</version> <fqname>ICryptoFactory/clearkey</fqname> <fqname>IDrmFactory/clearkey</fqname> <fqname>ICryptoFactory/widevine</fqname> <fqname>IDrmFactory/widevine</fqname> </hal>
VERSI AIDL STABIL adalah nomor versi setiap rilis AIDL API (misalnya, 1, 2). Atau, sebaiknya gunakan vintf_fragments.
Menambahkan izin SELinux
- Tambahkan ke
VENDOR DEVICE/sepolicy/vendor/file.te
type mediadrm_vendor_data_file, file_type, data_file_type;
- Tambahkan ke
VENDOR DEVICE/sepolicy/vendor/file_contexts
/vendor/bin/hw/android\.hardware\.drm-service\.clearkey u:object_r:hal_drm_clearkey_exec:s0
/data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0 - Tambahkan ke
device/sepolicy/vendor/hal_drm_clearkey.te
vndbinder_use(hal_drm_clearkey) allow hal_drm_clearkey servicemanager:binder { call transfer }; allow hal_drm_clearkey hal_drm_service:service_manager add; allow hal_drm_clearkey { appdomain -isolated_app }:fd use; get_prop(ramdump, public_vendor_default_prop)
Membuat file RC di bagian /vendor
File .rc
menentukan tindakan yang akan diambil saat layanan diluncurkan.
Lihat Bahasa Android Init untuk mengetahui detailnya.
Mengimplementasikan plugin
- Terapkan titik entri
main()
diservice.cpp
layanan plugin. - Implementasikan
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
, danIDrmFactory
. - Implementasikan API baru dalam plugin.
Detail plugin DRM
Vendor plugin DRM menerapkan plugin DrmFactory
, CryptoFactory
, dan DRM.
DrmFactory
Class DrmHal
menelusuri layanan plugin DRM terdaftar dan membuat
plugin yang sesuai yang mendukung skema kripto tertentu melalui class
DrmFactory
.
IDrmFactory adalah titik entri utama untuk berinteraksi dengan drm HAL vendor melalui createPlugin API. createPlugin API digunakan untuk membuat instance IDrmPlugin.
::ndk::ScopedAStatus getSupportedCryptoSchemes( std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);
getsupportedCryptoSchemes menampilkan daftar skema kripto yang didukung untuk instance AIDL drm HAL.
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, const std::string& in_mimeType, ::aidl::android::hardware::drm::SecurityLevel in_securityLevel, bool* _aidl_return);
Menentukan apakah factory plugin dapat membuat plugin DRM yang mendukung skema kripto tertentu, yang ditentukan oleh UUID.
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
Menentukan apakah factory plugin dapat membuat plugin DRM yang mendukung
format penampung media tertentu yang ditentukan oleh mimeType
.
::ndk::ScopedAStatus createPlugin( const ::aidl::android::hardware::drm::Uuid& in_uuid, const std::string& in_appPackageName, std::shared_ptr<::aidl::android::hardware::drm::IDrmPlugin>* _aidl_return);
Membuat plugin DRM untuk skema kripto yang ditentukan oleh UUID.
CryptoFactory
Class CryptoHal
akan menelusuri layanan plugin DRM terdaftar dan membuat
plugin yang sesuai yang mendukung skema kripto tertentu melalui class
CryptoFactory
.
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, bool* _aidl_return);
Menentukan apakah factory kripto dapat membuat plugin kripto yang mendukung skema kripto tertentu, yang ditentukan oleh UUID.
::ndk::ScopedAStatus createPlugin( const ::aidl::android::hardware::drm::Uuid& in_uuid, const std::vector<uint8_t>& in_initData, std::shared_ptr<::aidl::android::hardware::drm::ICryptoPlugin>* _aidl_return);
Menentukan apakah factory plugin dapat membuat plugin kripto yang mendukung skema kripto tertentu, yang ditentukan oleh UUID.
API plugin DRM
API ditentukan dihardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/
VERSION/android/hardware/drm/IDrmPlugin.aidl
. File
IDrmPlugin.h
yang sesuai dapat ditemukan di out/Soong setelah build.