เอกสารนี้ให้ภาพรวมของเฟรมเวิร์กการจัดการสิทธิ์ดิจิทัล (DRM) ของ Android และแนะนำอินเทอร์เฟซที่ปลั๊กอิน DRM ต้องใช้ เอกสารนี้ไม่ได้อธิบายกฎด้านประสิทธิภาพหรือกฎการปฏิบัติตามข้อกำหนดที่อาจกำหนดโดยรูปแบบ DRM
เฟรมเวิร์ก
แพลตฟอร์ม Android มีเฟรมเวิร์ก DRM ที่ขยายได้ ซึ่งช่วยให้แอปจัดการเนื้อหาที่ได้รับการคุ้มครองสิทธิ์ตามข้อจำกัดของใบอนุญาตที่เชื่อมโยงกับเนื้อหาได้ เฟรมเวิร์ก DRM รองรับรูปแบบ DRM หลายรูปแบบ อุปกรณ์จะรองรับรูปแบบ DRM ใดบ้างขึ้นอยู่กับผู้ผลิตอุปกรณ์ เฟรมเวิร์ก DRM มีอินเทอร์เฟซที่รวมเป็นหนึ่งเดียวสำหรับนักพัฒนาแอปพลิเคชันและซ่อนความซับซ้อนของการดำเนินการ DRM เฟรมเวิร์ก DRM มีโหมดการทํางานที่สอดคล้องกันสําหรับเนื้อหาที่ได้รับการคุ้มครองและไม่ได้รับการคุ้มครอง รูปแบบ DRM สามารถกำหนดรูปแบบการใช้งานที่ซับซ้อนตามข้อมูลเมตาของใบอนุญาต เฟรมเวิร์ก DRM จะเชื่อมโยงเนื้อหา DRM กับใบอนุญาต รวมถึงจัดการการจัดการสิทธิ์ ซึ่งช่วยให้โปรแกรมเล่นสื่อแยกออกจากเนื้อหาที่ได้รับการคุ้มครองโดย DRM หรือเนื้อหาที่ไม่ได้รับการคุ้มครองได้ ดู MediaDrm สำหรับชั้นเรียนเพื่อรับคีย์สำหรับการถอดรหัสสตรีมสื่อที่ได้รับการป้องกัน
ความพร้อมใช้งานของเนื้อหาดิจิทัลที่สมบูรณ์เป็นสิ่งสำคัญสำหรับผู้ใช้อุปกรณ์เคลื่อนที่ หากต้องการทำให้เนื้อหาพร้อมใช้งานในวงกว้าง นักพัฒนาซอฟต์แวร์ Android และผู้เผยแพร่เนื้อหาดิจิทัลจะต้องมีการติดตั้งใช้งาน DRM ที่สอดคล้องกันในระบบที่รองรับในระบบนิเวศของ Android Google ให้บริการ DRM โดยไม่มีค่าธรรมเนียมใบอนุญาตในอุปกรณ์ Android ที่เข้ากันได้ เพื่อให้เนื้อหาดิจิทัลพร้อมใช้งานในอุปกรณ์ Android และเพื่อให้มี DRM ที่สอดคล้องกันอย่างน้อย 1 รายการในอุปกรณ์ทุกเครื่อง ปลั๊กอิน DRM ผสานรวมกับเฟรมเวิร์ก DRM ของ Android และใช้การป้องกันที่รองรับฮาร์ดแวร์เพื่อรักษาความปลอดภัยให้กับเนื้อหาพรีเมียมและข้อมูลเข้าสู่ระบบของผู้ใช้
การป้องกันเนื้อหาที่ได้จากปลั๊กอิน DRM จะขึ้นอยู่กับความปลอดภัยและความสามารถของแพลตฟอร์มฮาร์ดแวร์พื้นฐานในการปกป้องเนื้อหา ความสามารถของฮาร์ดแวร์ของอุปกรณ์ควรมีการเปิดเครื่องที่ปลอดภัยระดับฮาร์ดแวร์เพื่อสร้างชุดความน่าเชื่อถือของความปลอดภัยและการป้องกันคีย์การเข้ารหัส ความสามารถด้านการป้องกันเนื้อหาของอุปกรณ์ควรรวมถึงการป้องกันเฟรมที่ถอดรหัสแล้วในอุปกรณ์และการป้องกันเนื้อหาผ่านกลไกการป้องกันเอาต์พุตที่เชื่อถือได้ แพลตฟอร์มฮาร์ดแวร์บางแพลตฟอร์มอาจไม่รองรับฟีเจอร์ด้านความปลอดภัยและการป้องกันเนื้อหาข้างต้นทั้งหมด การรักษาความปลอดภัยไม่ได้ติดตั้งใช้งานที่จุดใดจุดหนึ่งในสแต็ก แต่อาศัยการผสานรวมฮาร์ดแวร์ ซอฟต์แวร์ และบริการ การใช้ฟังก์ชันความปลอดภัยของฮาร์ดแวร์ กลไกการบูตที่เชื่อถือได้ และระบบปฏิบัติการที่ปลอดภัยและแยกส่วนเพื่อจัดการฟังก์ชันด้านความปลอดภัยเป็นสิ่งสำคัญอย่างยิ่งต่อการสร้างอุปกรณ์ที่ปลอดภัย
สถาปัตยกรรม
เฟรมเวิร์ก DRM ได้รับการออกแบบมาให้ใช้งานได้กับทุกแพลตฟอร์ม และแยกรายละเอียดการใช้งานรูปแบบ DRM ที่เฉพาะเจาะจงไว้ในปลั๊กอิน DRM สำหรับรูปแบบนั้นๆ เฟรมเวิร์ก DRM มี API ง่ายๆ สำหรับจัดการการดำเนินการ DRM ที่ซับซ้อน รับใบอนุญาต จัดสรรอุปกรณ์ เชื่อมโยงเนื้อหา DRM กับใบอนุญาต และสุดท้ายก็ถอดรหัสเนื้อหา DRM
เฟรมเวิร์ก DRM ของ Android ติดตั้งใช้งานในเลเยอร์สถาปัตยกรรม 2 เลเยอร์ ได้แก่
- API เฟรมเวิร์ก DRM ที่แสดงต่อแอปผ่านเฟรมเวิร์กแอปพลิเคชันของ Android
- เฟรมเวิร์ก DRM โค้ดเนทีฟที่แสดงอินเทอร์เฟซสำหรับปลั๊กอิน DRM (ตัวแทน) เพื่อจัดการการจัดการสิทธิ์และการถอดรหัสสำหรับรูปแบบ DRM ต่างๆ
ดูรายละเอียดเพิ่มเติมได้ที่ Android Media DRM และ Android Media Crypto
ปลั๊กอิน DRM
เมื่อระบบเริ่มต้น เฟรมเวิร์ก DRM จะสแกนหาอินสแตนซ์/บริการ HAL (อธิบายไว้ในไฟล์ .rc
) และค้นพบปลั๊กอิน เซิร์ฟเวอร์ Media DRM (mediadrmserver
) จะสร้างทั้งออบเจ็กต์ CryptoHal
และ DrmHal
จากนั้น CryptoHal
และ DrmHal
จะเรียกใช้ปลั๊กอินที่มีการติดตั้งใช้งานเฉพาะผู้ให้บริการ
ปลั๊กอินควรใช้ HAL แบบ Binderized HAL แบบ Binderized ใช้ Android Interface Definition Language (AIDL) ซึ่งช่วยให้คุณแทนที่เฟรมเวิร์กได้โดยไม่ต้องสร้าง HAL ขึ้นมาใหม่
ผู้ให้บริการหรือผู้ผลิต SOC จะสร้างปลั๊กอินและใส่ไว้ในพาร์ติชัน /vendor
บนอุปกรณ์ อุปกรณ์ทั้งหมดที่เปิดตัวด้วย Android 13 ขึ้นไปต้องรองรับ HAL ที่มีการเชื่อมโยงซึ่งเขียนในภาษา AIDL
การใช้งาน
อุปกรณ์ที่เปิดตัว GMS และ AOSP สำหรับ Android 13 ต้องใช้อินเทอร์เฟซ AIDL
วิธีติดตั้งใช้งาน API เฟรมเวิร์ก DRM ใหม่ด้วยปลั๊กอิน
- เพิ่มบริการปลั๊กอินลงในไฟล์บิลด์ของอุปกรณ์
- อัปเดตไฟล์ Manifest ของอุปกรณ์
- เพิ่มสิทธิ์ SELinux
- สร้างไฟล์
.rc
ใน/vendor
- ใช้ปลั๊กอิน
API ได้รับการกําหนดไว้ใน IDrmPlugin.aidl
,
ICryptoPlugin.aidl
, IDrmFactory.aidl
และ ICryptoFactory.aidl
แต่ละเวอร์ชัน
aidl/PLATFORM_ROOT/hardware/interfaces/drm/
เพิ่มบริการปลั๊กอินลงในไฟล์บิลด์ของอุปกรณ์
ตัวอย่างเช่น หากต้องการเพิ่มการรองรับอินเทอร์เฟซ AIDL ไฟล์ VENDOR DEVICE/device.mk
ต้องมีแพ็กเกจ android.hardware.drm-service.*
ต่อไปนี้
PRODUCT_PACKAGES += \ android.hardware.drm-service.clearkey \ android.hardware.drm-service.widevine
อัปเดตไฟล์ Manifest ของอุปกรณ์
ไฟล์ vendor manifest.xml
สำหรับอุปกรณ์ต้องมีรายการต่อไปนี้
<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>
เวอร์ชัน AIDL ที่เสถียรคือหมายเลขเวอร์ชันของ AIDL API แต่ละรุ่น (เช่น 1, 2) หรือเราขอแนะนำให้ใช้ vintf_fragments
เพิ่มสิทธิ์ SELinux
- เพิ่มลงใน
VENDOR DEVICE/sepolicy/vendor/file.te
type mediadrm_vendor_data_file, file_type, data_file_type;
- เพิ่มใน
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 - เพิ่มใน
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)
สร้างไฟล์ RC ภายใต้ /vendor
ไฟล์ .rc
จะระบุการดำเนินการที่จะทำเมื่อเปิดบริการ
ดูรายละเอียดได้ที่ภาษาเริ่มต้นของ Android
ติดตั้งปลั๊กอิน
- ใช้จุดแรกเข้า
main()
ในservice.cpp
ของบริการปลั๊กอิน - ใช้
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
และIDrmFactory
- ใช้ API ใหม่ในปลั๊กอิน
รายละเอียดปลั๊กอิน DRM
ผู้ให้บริการปลั๊กอิน DRM นำ DrmFactory
, CryptoFactory
และปลั๊กอิน DRM ไปใช้
DrmFactory
คลาส DrmHal
จะค้นหาบริการปลั๊กอิน DRM ที่ลงทะเบียนไว้และสร้างปลั๊กอินที่เกี่ยวข้องซึ่งรองรับรูปแบบการเข้ารหัสที่ระบุผ่านคลาส DrmFactory
IDrmFactory คือจุดแรกเข้าหลักสำหรับการโต้ตอบกับ HAL drm ของผู้ให้บริการผ่าน createPlugin API createPlugin API ใช้ในการสร้างอินสแตนซ์ IDrmPlugin
::ndk::ScopedAStatus getSupportedCryptoSchemes( std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);
getSupportedCryptoSchemes จะแสดงรายการรูปแบบการเข้ารหัสที่รองรับสําหรับอินสแตนซ์ 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);
กำหนดว่าโรงงานปลั๊กอินสามารถสร้างปลั๊กอิน DRM ที่รองรับรูปแบบการเข้ารหัสที่กำหนดซึ่งระบุโดย UUID ได้หรือไม่
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
ระบุว่าโรงงานปลั๊กอินสามารถสร้างปลั๊กอิน DRM ที่รองรับรูปแบบคอนเทนเนอร์สื่อที่ระบุโดย 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);
สร้างปลั๊กอิน DRM สำหรับรูปแบบคริปโตที่ระบุโดย UUID
CryptoFactory
คลาส CryptoHal
จะค้นหาบริการปลั๊กอิน DRM ที่ลงทะเบียนไว้และสร้างปลั๊กอินที่เกี่ยวข้องซึ่งรองรับรูปแบบการเข้ารหัสที่ระบุผ่านคลาส CryptoFactory
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, bool* _aidl_return);
ระบุว่า Crypto Factory สร้างปลั๊กอินการเข้ารหัสที่รองรับรูปแบบการเข้ารหัสที่ระบุโดย 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);
ตรวจสอบว่าโรงงานปลั๊กอินสามารถสร้างปลั๊กอิน Crypto ที่รองรับ Crypto Scheme ที่ระบุโดย UUID หรือไม่
API ของปลั๊กอิน DRM
API เหล่านี้จะกำหนดไว้ในhardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/
VERSION/android/hardware/drm/IDrmPlugin.aidl
ไฟล์ IDrmPlugin.h
ที่เกี่ยวข้องจะอยู่ใน out/Soong หลังจากการบิลด์