
Bu sayfada, Android dijital hak yönetimi (DRM) çerçevesine genel bir bakış sunulmakta ve DRM eklentisinin uygulaması gereken arayüzler tanıtılmaktadır. Bu sayfada, bir DRM şeması tarafından tanımlanabilecek sağlamlık kuralları veya uygunluk kuralları açıklanmamaktadır.
Framework
Android platformu, uygulamaların haklarla korunan 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. Cihaz üreticisi, cihazın hangi DRM şemalarını destekleyeceğini belirler. DRM çerçevesi, uygulama geliştiriciler için 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 verileriyle karmaşık kullanım modelleri tanımlayabilir. DRM çerçevesi, DRM içeriği ile lisans arasındaki ilişkiyi sağlar ve hak yönetimini gerçekleştirir. Bu, medya oynatıcının DRM korumalı veya korumasız içerikten soyutlanmasını sağlar. Korunan medya akışlarının şifresini çözmek için anahtar elde etme sınıfı hakkında bilgi edinmek üzere MediaDrm sayfasına bakın.
Şekil 1'de Android 11'den önceki DRM donanım çıkarma katmanı, Şekil 2'de ise Android 11 ve sonraki sürümlerdeki katman gösterilmektedir:
1. şekil. Android 11'den önceki DRM donanım soyutlama katmanı.
Şekil 2. Android 11'den itibaren DRM donanım soyutlama katmanı.
Zengin dijital içeriğin kullanılabilirliği, mobil cihaz kullanıcıları için önemlidir. Android geliştiricilerin ve dijital içerik yayıncılarının içeriklerini geniş kitlelere sunabilmeleri için Android ekosisteminde desteklenen tutarlı bir DRM uygulamasına ihtiyaçları vardır. Bu dijital içeriğin Android cihazlarda kullanılabilmesi ve tüm cihazlarda tutarlı en az bir DRM'nin bulunması için Google, uyumlu Android cihazlarda lisans ücreti olmadan DRM sağlar. DRM eklentisi, Android DRM çerçevesiyle entegre edilmiştir ve premium içerikleri ve kullanıcı kimlik bilgilerini güvenceye almak 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, güvenlik ve şifreleme anahtarlarının korunması için güven zinciri oluşturmak üzere donanım güvenli başlatma özelliğini içermelidir. Cihazın içerik koruma özellikleri, cihazdaki şifresi çözülmüş çerçevelerin korunmasını ve güvenilir bir çıkış koruma mekanizması aracılığıyla içerik korumasını içermelidir. Tüm donanım platformları, yukarıdaki güvenlik ve içerik koruma özelliklerinin tamamını desteklemez. Güvenlik, yığında hiçbir zaman tek bir yerde 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 işlemek için yalıtılmış güvenli bir işletim sisteminin birleşimi, güvenli bir cihaz sağlamak için kritik öneme sahiptir.
Mimari
DRM çerçevesi, uygulamadan bağımsız olacak şekilde tasarlanmıştır ve belirli DRM şeması uygulamasının ayrıntılarını şemaya özgü bir DRM eklentisinde özetler. DRM çerçevesi, karmaşık DRM işlemlerini yönetmek, lisans almak, cihazı sağlamak, 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ı için hak yönetimi ve şifre çözme işlemlerini gerçekleştirmek üzere DRM eklentileri (aracıları) için bir arayüz sunan yerel 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:
3.Şekil Android 11'den önceki DRM çerçevesi.
Şekil 4. Android 11'de DRM çerçevesi başlatılıyor.
Daha fazla bilgi için MediaDrm ve MediaCrypto konularına bakın.
DRM eklentileri
DRM çerçevesi, sistem başlatılırken HAL örneklerini ve hizmetlerini (.rc
dosyalarında açıklanmıştır) tarar ve eklentileri keşfeder. Medya DRM sunucusu (mediadrmserver
), hem CryptoHal
hem de DrmHal
nesnelerini oluşturur.
CryptoHal
ve DrmHal
, ardından tedarikçiye özel uygulamalarla eklentileri çağırır.
Eklentiler, binderized HAL'leri uygulamalıdır. Binder'a dönüştürülmüş HAL'ler, Android Arayüz Tanımlama Dili (AIDL)'yi kullanır. Bu dil, HAL'leri yeniden oluşturmaya gerek kalmadan çerçevenin değiştirilmesine olanak tanır.
Eklentiler, satıcılar veya SOC üreticileri tarafından oluşturulur ve cihazdaki /vendor
bölümüne yerleştirilir. Android 13 veya sonraki sürümlerle kullanıma sunulan tüm cihazlar, AIDL dilinde yazılmış bağlayıcı HAL'leri desteklemelidir.
Uygulama
Yeni DRM çerçeveleri API'lerini bir eklentiyle uygulamak için:
- Eklenti hizmetini cihazın derleme dosyalarına ekleyin.
- Cihaz manifest dosyasını güncelleyin.
- SELinux izinlerini ekleyin.
/vendor
altında.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/
Eklenti hizmetini cihaz derleme dosyalarına ekleme
Örneğin, AIDL arayüzü desteği eklemek için VENDOR DEVICE/device.mk
dosyasında 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üncelleyin
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
için izin ekleyin:
type mediadrm_vendor_data_file, file_type, data_file_type;
VENDOR DEVICE/sepolicy/vendor/file_contexts
için izin ekleyin:
/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
için izin ekleyin:
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)
/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 Init Language başlıklı makaleye bakın.
Eklentiyi uygulama
- Eklenti hizmetinin
main()
bölümündeservice.cpp
giriş noktasını uygulayın. ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
veIDrmFactory
'ü uygulayın.- Yeni API'leri eklentide uygulayın.
DRM eklentisi ayrıntıları
DRM eklentisi sağlayıcıları 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 kripto şemasını destekleyen ilgili eklentileri oluşturur.
IDrmFactory
, createPlugin
yöntemiyle bir satıcının DRM HAL'siyle etkileşim kurmak için kullanılan 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 kripto şemalarının bir listesini 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 kripto ş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 kripto ş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 bir 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
içinde tanımlanır. İlgili IDrmPlugin.h
dosyası, derlemeden sonra out/Soong
içinde bulunabilir.