
Bu sayfada, Android dijital hak yönetimi (DRM) çerçevesine genel bir bakış sunulmakta ve DRM eklentisinin uygulamak zorunda olduğu arayüzler tanıtılmaktadır. Bu sayfada, DRM şeması tarafından tanımlanabilecek sağlamlık kuralları veya uygunluk kuralları açıklanmaz.
Framework
Android platformu, uygulamaların hak korumalı içeriği içerikle ilişkili lisans kısıtlamalarına göre yönetmesine olanak tanıyan genişletilebilir bir DRM çerçevesi sağlar. DRM çerçevesi birçok DRM şemasını destekler. Bir cihazın hangi DRM şemalarını destekleyeceğini cihaz üreticisi belirler. DRM çerçevesi, uygulama geliştiricilere birleşik bir arayüz sağlar ve DRM işlemlerinin karmaşıklığını gizler. DRM çerçevesi, korumalı ve korumasız içerikler için tutarlı bir çalışma modu sağlar. DRM şemaları, lisans meta verilerine göre karmaşık kullanım modelleri tanımlayabilir. DRM çerçevesi, DRM içeriği ile lisans arasında ilişki sağlar ve hak yönetimini yönetir. Bu sayede medya oynatıcının DRM korumalı veya korumasız içerikten soyutlanması sağlanır. Korunan medya akışlarının şifresini çözmek için anahtar elde etmek üzere sınıf için MediaDrm'e bakın.
Şekil 1'de Android 11'den önceki DRM donanım ayıklama katmanı, Şekil 2'de ise Android 11 ve sonraki sürümlerdeki katman gösterilmektedir:
Şekil 1. Android 11'den önceki DRM donanım soyutlama katmanı.
Şekil 2. Android 11'den itibaren DRM donanım soyutlama katmanı.
Zengin dijital içeriklerin sunulması, mobil cihaz kullanıcıları için önemlidir. Android geliştiricilerinin ve dijital içerik yayıncılarının, içeriklerini geniş bir kitleye sunmak için Android ekosisteminde desteklenen tutarlı bir DRM uygulamasına ihtiyacı vardır. Google, bu dijital içeriği Android cihazlarda kullanıma sunmak ve tüm cihazlarda en az bir tutarlı DRM'nin bulunduğundan emin olmak için uyumlu Android cihazlarda lisans ücreti olmadan DRM sağlar. DRM eklentisi, Android DRM çerçevesine entegre edilmiştir ve birinci sınıf içeriği ve kullanıcı kimlik bilgilerini korumak için donanım destekli korumayı kullanabilir.
DRM eklentisi tarafından sağlanan içerik koruması, temel donanım platformunun güvenlik ve içerik koruma özelliklerine bağlıdır. Cihazın donanım özellikleri, şifreleme anahtarlarının güvenliği ve korunması için bir güven zinciri oluşturmak üzere donanımla güvenli başlatmayı içermelidir. Cihazın içerik koruma özellikleri, cihazdaki şifresi çözülmüş karelerin korunmasını ve güvenilir bir çıkış koruma mekanizması aracılığıyla içerik korumasını içermelidir. Yukarıdaki güvenlik ve içerik koruma özelliklerinin tümünü bazı donanım platformları desteklemez. Güvenlik hiçbir zaman yığının tek bir yerine uygulanmaz. Bunun yerine donanım, yazılım ve hizmetlerin entegrasyonuna dayanır. Donanım güvenlik işlevleri, güvenilir bir başlatma mekanizması ve güvenlik işlevlerini yürütmek için izole edilmiş güvenli bir işletim sisteminin bir arada kullanılması, güvenli bir cihaz sunmak için çok önemlidir.
Mimari
DRM çerçevesi, uygulamadan bağımsız olacak şekilde tasarlanmıştır ve belirli bir DRM şeması uygulamasının ayrıntılarını şemaya özel bir DRM eklentisinde soyutlar. DRM çerçevesi, karmaşık DRM işlemlerini gerçekleştirmek, lisans edinmek, cihazı temel hazırlığı yapmak, DRM içeriğini ve lisansını ilişkilendirmek ve son olarak DRM içeriğinin şifresini çözmek için basit API'ler içerir.
Android DRM çerçevesi iki mimari katmanda uygulanır:
- Android uygulama çerçevesi aracılığıyla uygulamalara sunulan bir DRM çerçevesi API'si
- Çeşitli DRM şemalarında hak yönetimini ve şifre çözmeyi yönetmek için DRM eklentileri (araçlar) için bir arayüz sunan doğal kod DRM çerçevesi
Şekil 3'te Android 11'den önceki DRM çerçevesi, Şekil 4'te ise Android 11 ve sonraki sürümlerdeki çerçeve gösterilmektedir:
Şekil 3. Android 11'den önceki DRM çerçevesi.
Şekil 4. Android 11'den itibaren DRM çerçevesi.
Daha fazla bilgi için MediaDrm ve MediaCrypto başlıklarına bakın.
DRM eklentileri
DRM çerçevesi, sistem başlatılırken HAL örneklerini ve hizmetlerini (.rc
dosyalarında açıklanır) tarar ve eklentileri keşfeder. Medya DRM sunucusu (mediadrmserver
), hem CryptoHal
hem de DrmHal
nesneleri oluşturur.
Ardından CryptoHal
ve DrmHal
, tedarikçiye özel uygulamalarla eklentileri çağırır.
Eklentiler, bağlayıcı HAL'leri uygulamalıdır. Bağlayıcılı HAL'ler, Android Arayüz Tanımlama Dili'ni (AIDL) kullanır. Bu sayede, HAL'leri yeniden oluşturmak zorunda kalmadan çerçevenin değiştirilmesi sağlanır.
Eklentiler, tedarikçi firmalar veya SOC üreticileri tarafından oluşturulur ve cihazdaki bir /vendor
bölümüne yerleştirilir. Android 13 veya sonraki sürümlerin yüklü olduğu tüm cihazlar, AIDL dilinde yazılmış bağlayıcı HAL'leri desteklemelidir.
Uygulama
Yeni DRM çerçevesi API'lerini bir eklenti aracılığıyla uygulamak için:
- Cihazın derleme dosyalarına eklenti hizmeti ekleyin.
- Cihaz manifest dosyasını güncelleyin.
- SELinux izinleri ekleyin.
/vendor
altında bir.rc
dosyası oluşturun.- Eklentiyi uygulayın.
API'ler IDrmPlugin.aidl
, ICryptoPlugin.aidl
, IDrmFactory.aidl
ve ICryptoFactory.aidl
'ın her sürümünde tanımlanır.
aidl/PLATFORM_ROOT/hardware/interfaces/drm/
Cihaz derleme dosyalarına eklenti hizmeti ekleme
Örneğin, AIDL arayüzü desteği eklemek için VENDOR DEVICE/device.mk
dosyasında şu android.hardware.drm-service.*
paketleri bulunmalıdır:
PRODUCT_PACKAGES += \ android.hardware.drm-service.clearkey \ android.hardware.drm-service.widevine
Cihaz manifest dosyasını güncelleme
Cihazın vendor manifest.xml
dosyası aşağıdaki girişleri içermelidir:
<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>
Kararlı AIDL sürümü, her AIDL API sürümünün sürüm numarasıdır (örneğin, 1, 2).
Alternatif olarak vintf_fragments
kullanmanızı öneririz.
SELinux izinleri ekleme
VENDOR DEVICE/sepolicy/vendor/file.te
'e izin ekleme:
type mediadrm_vendor_data_file, file_type, data_file_type;
VENDOR DEVICE/sepolicy/vendor/file_contexts
:
adresine izin ekleme/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:s0device/sepolicy/vendor/hal_drm_clearkey.te
:
adresine izin eklemevndbinder_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)
/vendor altında bir RC dosyası oluşturun.
.rc
dosyası, bir hizmet başlatıldığında yapılacak işlemleri belirtir.
Ayrıntılar için Android İlk Dil başlıklı makaleye bakın.
Eklentiyi uygulama
- Eklenti hizmetinin
service.cpp
bölümündemain()
giriş noktasını uygulayın. ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
veIDrmFactory
özelliklerini uygulayın.- Yeni API'leri eklentiye uygulayın.
DRM eklentisi ayrıntıları
DRM eklentisi tedarikçileri DrmFactory
, CryptoFactory
ve DRM eklentisini uygular.
DrmFactory sınıfı
DrmHal
sınıfı, kayıtlı DRM eklenti hizmetlerini arar ve DrmFactory
sınıfı aracılığıyla belirli bir şifreleme şemasını destekleyen ilgili eklentileri oluşturur.
IDrmFactory
, createPlugin
yöntemi aracılığıyla bir tedarikçinin DRM HAL'iyle etkileşime geçmenin ana giriş noktasıdır. IDrmPlugin
örnekleri oluşturmak için bu yöntemi kullanın.
::ndk::ScopedAStatus getSupportedCryptoSchemes( std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);
getSupportedCryptoSchemes
, AIDL DRM HAL örneği için desteklenen kriptografi şemalarını döndürür. Bu sıra, eklenti fabrikasının UUID ile belirtilen belirli bir kripto şemasını destekleyen DRM eklentileri oluşturup oluşturamayacağını belirler:
::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);
Bu sıra, eklenti fabrikasının mimeType
tarafından belirtilen belirli bir medya kapsayıcı biçimini destekleyen DRM eklentileri oluşturup oluşturamayacağını belirler:
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
Bu sıra, UUID ile belirtilen şifreleme şeması için bir DRM eklentisi oluşturur:
::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);
CryptoFactory sınıfı
CryptoHal
sınıfı, kayıtlı DRM eklenti hizmetlerini arar ve CryptoFactory
sınıfı aracılığıyla belirli bir şifreleme şemasını destekleyen ilgili eklentileri oluşturur.
Bu sıra, kripto fabrikasının UUID ile belirtilen belirli bir kripto şemasını destekleyen kripto eklentileri oluşturup oluşturamayacağını belirler:
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, bool* _aidl_return);
Bu sıra, eklenti fabrikasının UUID ile belirtilen belirli bir kripto şemasını destekleyen kripto eklentileri oluşturup oluşturamayacağını belirler:
::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);
DRM eklentisi API'leri
API'lerhardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/
VERSION/android/hardware/drm/IDrmPlugin.aidl
adresinde tanımlanmıştır. İlgili IDrmPlugin.h
dosyasını derlemeden sonra out/Soong
içinde bulabilirsiniz.