![ไอคอน Android DRM HAL](https://source.android.google.cn/static/docs/core/media/images/ape_fwk_hal_drm.png?authuser=2&hl=th)
เอกสารนี้ให้ภาพรวมของกรอบงานการจัดการสิทธิ์ดิจิทัล (DRM) ของ Android และแนะนำอินเทอร์เฟซที่ปลั๊กอิน DRM ต้องใช้ เอกสารนี้ไม่ได้อธิบายกฎความเข้มงวดหรือกฎการปฏิบัติตามที่อาจกำหนดโดยแผน DRM
กรอบ
แพลตฟอร์ม Android จัดเตรียมกรอบงาน DRM ที่ขยายได้ซึ่งช่วยให้แอปจัดการเนื้อหาที่ได้รับการคุ้มครองสิทธิ์ตามข้อจำกัดใบอนุญาตที่เกี่ยวข้องกับเนื้อหา กรอบงาน DRM รองรับแผน DRM มากมาย รูปแบบ DRM ที่อุปกรณ์รองรับนั้นขึ้นอยู่กับผู้ผลิตอุปกรณ์ กรอบงาน DRM มอบอินเทอร์เฟซแบบรวมสำหรับนักพัฒนาแอปพลิเคชัน และซ่อนความซับซ้อนของการดำเนินการ DRM กรอบงาน DRM มอบโหมดการทำงานที่สอดคล้องกันสำหรับเนื้อหาที่มีการป้องกันและไม่ได้รับการป้องกัน แบบแผน DRM สามารถกำหนดรูปแบบการใช้งานที่ซับซ้อนตามข้อมูลเมตาของใบอนุญาต กรอบงาน DRM ให้การเชื่อมโยงระหว่างเนื้อหา DRM และใบอนุญาต และจัดการการจัดการสิทธิ์ ซึ่งช่วยให้สามารถแยกเครื่องเล่นสื่อออกจากเนื้อหาที่มีการป้องกันหรือไม่มีการป้องกันโดย DRM ดู MediaDrm สำหรับคลาสเพื่อรับคีย์สำหรับการถอดรหัสสตรีมสื่อที่ได้รับการป้องกัน
![ระบบปฏิบัติการ Android DRM HAL](https://source.android.google.cn/static/docs/core/media/images/ape_fwk_drm.png?authuser=2&hl=th)
![Android DRM HAL โพสต์ R](https://source.android.google.cn/static/docs/core/media/images/aidl-ape_fwk_drm_postQ.png?authuser=2&hl=th)
ความพร้อมใช้งานของเนื้อหาดิจิทัลที่หลากหลายเป็นสิ่งสำคัญสำหรับผู้ใช้อุปกรณ์พกพา เพื่อให้เนื้อหาพร้อมใช้งานในวงกว้าง นักพัฒนา Android และผู้เผยแพร่เนื้อหาดิจิทัลจำเป็นต้องมีการใช้งาน DRM ที่สอดคล้องกันซึ่งสนับสนุนทั่วทั้งระบบนิเวศของ Android เพื่อให้เนื้อหาดิจิทัลนั้นพร้อมใช้งานบนอุปกรณ์ Android และเพื่อให้แน่ใจว่ามี DRM ที่สอดคล้องกันอย่างน้อยหนึ่งรายการในอุปกรณ์ทั้งหมด Google จึงมอบ DRM โดยไม่มีค่าธรรมเนียมใบอนุญาตบนอุปกรณ์ Android ที่ใช้งานร่วมกันได้ ปลั๊กอิน DRM ถูกรวมเข้ากับเฟรมเวิร์ก DRM ของ Android และสามารถใช้การป้องกันที่สนับสนุนด้วยฮาร์ดแวร์เพื่อรักษาความปลอดภัยเนื้อหาระดับพรีเมียมและข้อมูลรับรองผู้ใช้
การป้องกันเนื้อหาที่มีให้โดยปลั๊กอิน DRM ขึ้นอยู่กับความปลอดภัยและความสามารถในการป้องกันเนื้อหาของแพลตฟอร์มฮาร์ดแวร์พื้นฐาน ความสามารถด้านฮาร์ดแวร์ของอุปกรณ์ควรรวมถึงการบูตที่ปลอดภัยด้วยฮาร์ดแวร์เพื่อสร้างห่วงโซ่ความน่าเชื่อถือด้านความปลอดภัยและการป้องกันคีย์การเข้ารหัส ความสามารถในการป้องกันเนื้อหาของอุปกรณ์ควรรวมถึงการป้องกันเฟรมที่ถอดรหัสในอุปกรณ์และการป้องกันเนื้อหาผ่านกลไกการป้องกันเอาต์พุตที่เชื่อถือได้ แพลตฟอร์มฮาร์ดแวร์บางแพลตฟอร์มไม่รองรับคุณสมบัติความปลอดภัยและการป้องกันเนื้อหาข้างต้นทั้งหมด การรักษาความปลอดภัยไม่เคยถูกนำมาใช้ในที่เดียวในสแต็ก แต่อาศัยการบูรณาการฮาร์ดแวร์ ซอฟต์แวร์ และบริการแทน การผสมผสานระหว่างฟังก์ชันการรักษาความปลอดภัยของฮาร์ดแวร์ กลไกการบูตที่เชื่อถือได้ และระบบปฏิบัติการที่ปลอดภัยแบบแยกส่วนสำหรับจัดการฟังก์ชันความปลอดภัยถือเป็นสิ่งสำคัญในการจัดหาอุปกรณ์ที่ปลอดภัย
สถาปัตยกรรม
กรอบงาน DRM ได้รับการออกแบบมาเพื่อให้ใช้งานได้โดยไม่เชื่อเรื่องพระเจ้าและสรุปรายละเอียดของการใช้งานรูปแบบ DRM เฉพาะในปลั๊กอิน DRM เฉพาะรูปแบบ กรอบงาน DRM มี API ง่ายๆ ในการจัดการการดำเนินงาน DRM ที่ซับซ้อน รับใบอนุญาต จัดเตรียมอุปกรณ์ เชื่อมโยงเนื้อหา DRM และใบอนุญาต และสุดท้ายถอดรหัสเนื้อหา DRM
กรอบงาน Android DRM ถูกนำมาใช้ในสถาปัตยกรรมสองชั้น:
- API เฟรมเวิร์ก DRM ซึ่งเปิดเผยต่อแอปผ่านเฟรมเวิร์กแอปพลิเคชัน Android
- เฟรมเวิร์ก DRM โค้ดแบบเนทีฟ ซึ่งเปิดเผยอินเทอร์เฟซสำหรับปลั๊กอิน DRM (ตัวแทน) เพื่อจัดการการจัดการสิทธิ์และการถอดรหัสสำหรับแผน DRM ต่างๆ
![กรอบงาน DRM ของ Android](https://source.android.google.cn/static/docs/shared-images/ape_fwk_drm_2.png?authuser=2&hl=th)
![กรอบงาน DRM ของ Android](https://source.android.google.cn/static/docs/core/media/images/ape_fwk_drm_2_postO.png?authuser=2&hl=th)
ดู Android Media DRM และ Android Media Crypto สำหรับรายละเอียดเพิ่มเติม
ปลั๊กอิน DRM
เมื่อเริ่มต้นระบบ กรอบงาน DRM จะสแกนหาอินสแตนซ์/บริการ HAL (อธิบายไว้ในไฟล์ .rc
) และค้นพบปลั๊กอิน Media DRM Server ( mediadrmserver
) สร้างทั้งวัตถุ CryptoHal
และ DrmHal
จากนั้น CryptoHal
และ DrmHal
จะเรียกใช้ปลั๊กอินพร้อมกับการใช้งานเฉพาะของผู้ขาย
ปลั๊กอินควรใช้ HAL ที่ถูกผูกไว้ Binderized HAL ใช้ Android Interface Definition Language (AIDL) ซึ่งช่วยให้สามารถเปลี่ยนเฟรมเวิร์กได้โดยไม่ต้องสร้าง HAL ใหม่
ปลั๊กอินถูกสร้างขึ้นโดยผู้จำหน่ายหรือผู้สร้าง SOC และใส่ไว้ในพาร์ติชัน /vendor
บนอุปกรณ์ อุปกรณ์ทั้งหมดที่เปิดตัวด้วย Android 13 ขึ้นไปจะต้องรองรับ HAL ที่ถูกผูกไว้ซึ่งเขียนด้วยภาษา AIDL
การนำไปปฏิบัติ
อุปกรณ์ GMS และ AOSP ที่เปิดตัวสำหรับ Android 13 ต้องใช้อินเทอร์เฟซ AIDL
หากต้องการใช้ API เฟรมเวิร์ก DRM ใหม่โดยใช้ปลั๊กอิน:
- เพิ่มบริการปลั๊กอินให้กับไฟล์บิลด์ของอุปกรณ์
- อัปเดตรายการอุปกรณ์
- เพิ่มสิทธิ์ 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
อัปเดตรายการอุปกรณ์
ไฟล์ 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>
STABLE AIDL VERSION คือหมายเลขเวอร์ชันของ 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 เป็นจุดเริ่มต้นหลักสำหรับการโต้ตอบกับ drm HAL ของผู้จำหน่ายผ่าน 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 สามารถสร้างปลั๊กอิน crypto ที่รองรับโครงการ crypto ที่กำหนดหรือไม่ ซึ่งระบุโดย 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);
กำหนดว่าโรงงานปลั๊กอินสามารถสร้างปลั๊กอินเข้ารหัสลับที่รองรับรูปแบบการเข้ารหัสที่กำหนดหรือไม่ ซึ่งระบุโดย UUID
API ปลั๊กอิน DRM
API ถูกกำหนดไว้ในhardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/ VERSION /android/hardware/drm/IDrmPlugin.aidl
ไฟล์ IDrmPlugin.h
ที่เกี่ยวข้องสามารถพบได้ใน out/Soong หลังจาก build