หน้านี้ให้ภาพรวมของเฟรมเวิร์กการจัดการสิทธิ์ดิจิทัล (DRM) ของ Android และแนะนำอินเทอร์เฟซที่ปลั๊กอิน DRM ต้องใช้ หน้านี้ไม่ได้อธิบายกฎความทนทานหรือกฎการปฏิบัติตามข้อกำหนดที่อาจกำหนดโดยรูปแบบ DRM
Framework
แพลตฟอร์ม Android มีเฟรมเวิร์ก DRM ที่ขยายได้ ซึ่งช่วยให้แอปจัดการเนื้อหาที่ได้รับการคุ้มครองสิทธิ์ตามข้อจำกัดของใบอนุญาตที่เชื่อมโยงกับเนื้อหาได้ เฟรมเวิร์ก DRM รองรับรูปแบบ DRM หลายรูปแบบ โดยผู้ผลิตอุปกรณ์จะเป็นผู้กำหนดว่าอุปกรณ์จะรองรับรูปแบบ DRM ใดบ้าง เฟรมเวิร์ก DRM มีอินเทอร์เฟซแบบรวมสำหรับนักพัฒนาแอป และซ่อนความซับซ้อนของการดำเนินการ DRM เฟรมเวิร์ก DRM มีโหมดการทำงานที่สอดคล้องกันสำหรับเนื้อหาที่ได้รับการคุ้มครองและไม่ได้รับการคุ้มครอง รูปแบบ DRM สามารถกำหนดโมเดลการใช้งานที่ซับซ้อนได้ด้วยข้อมูลเมตาของใบอนุญาต เฟรมเวิร์ก DRM จะสร้างการเชื่อมโยงระหว่างเนื้อหา DRM กับใบอนุญาต และจัดการการจัดการสิทธิ์ ซึ่งช่วยให้เครื่องเล่นสื่อแยกออกจากเนื้อหาที่ได้รับการคุ้มครองด้วย DRM หรือไม่ได้รับการคุ้มครองได้ ดูคลาส MediaDrm เพื่อรับคีย์สำหรับถอดรหัสสตรีมสื่อที่ได้รับการคุ้มครอง
รูปที่ 1 แสดงระดับชั้นการจัดการฮาร์ดแวร์โดยตรงของ DRM ก่อน Android 11 และรูปที่ 2 แสดงระดับชั้นใน Android 11 ขึ้นไป

รูปที่ 1 ระดับชั้นการจัดการฮาร์ดแวร์โดยตรงของ DRM ก่อน Android 11

รูปที่ 2 ระดับชั้นการจัดการฮาร์ดแวร์โดยตรงของ DRM ตั้งแต่ Android 11 เป็นต้นไป
ความพร้อมใช้งานของเนื้อหาดิจิทัลที่สมบูรณ์มีความสำคัญต่อผู้ใช้ในอุปกรณ์เคลื่อนที่ นักพัฒนาแอป 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 ต่างๆ
รูปที่ 3 แสดงเฟรมเวิร์ก DRM ก่อน Android 11 และรูปที่ 4 แสดงเฟรมเวิร์กใน Android 11 ขึ้นไป

รูปที่ 3 เฟรมเวิร์ก DRM ก่อน Android 11

รูปที่ 4 เฟรมเวิร์ก DRM ตั้งแต่ Android 11 เป็นต้นไป
ดูรายละเอียดเพิ่มเติมได้ที่ MediaDrm และ MediaCrypto
ปลั๊กอิน DRM
เมื่อเริ่มต้นระบบ เฟรมเวิร์ก DRM จะสแกนหาอินสแตนซ์และบริการ HAL (อธิบายไว้ในไฟล์ .rc
)
และค้นหาปลั๊กอิน เซิร์ฟเวอร์ Media DRM (mediadrmserver) จะสร้างออบเจ็กต์ CryptoHal และ DrmHal
จากนั้น CryptoHal และ DrmHal จะเรียกปลั๊กอินด้วยการใช้งานที่เฉพาะเจาะจงของผู้ให้บริการ
ปลั๊กอินควรใช้ HAL ที่ผูกกับ Binder HAL ที่ผูกกับ Binder ใช้ ภาษาที่ใช้นิยามอินเทอร์เฟซสำหรับ Android (AIDL), ซึ่งช่วยให้สามารถแทนที่เฟรมเวิร์กได้โดยไม่ต้องสร้าง HAL ใหม่
ผู้ให้บริการหรือผู้ผลิต SOC เป็นผู้สร้างปลั๊กอินและวางไว้ในพาร์ติชัน /vendor ในอุปกรณ์ อุปกรณ์ทั้งหมดที่เปิดตัวด้วย Android 13 ขึ้นไปต้องรองรับ HAL ที่ผูกกับ Binder ซึ่งเขียนด้วยภาษา 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 จะระบุการดำเนินการที่จะเกิดขึ้นเมื่อเปิดใช้บริการ
ดูรายละเอียดได้ที่ ภาษา Init ของ Android
ใช้งานปลั๊กอิน
- ใช้งานจุดเริ่มต้น
main()ในservice.cppของบริการปลั๊กอิน - ใช้งาน
ICryptoPlugin,IDrmPlugin,ICryptoFactoryและIDrmFactory - ใช้งาน API ใหม่ในปลั๊กอิน
รายละเอียดปลั๊กอิน DRM
ผู้ให้บริการปลั๊กอิน DRM จะใช้งาน DrmFactory, CryptoFactory และปลั๊กอิน DRM
คลาส DrmFactory
คลาส DrmHal จะค้นหาบริการปลั๊กอิน DRM ที่ลงทะเบียนไว้ และสร้างปลั๊กอินที่เกี่ยวข้องซึ่งรองรับรูปแบบการเข้ารหัสที่กำหนดผ่านคลาส DrmFactory
IDrmFactory เป็นจุดเริ่มต้นหลักสำหรับการโต้ตอบกับ DRM HAL ของผู้ให้บริการ
ผ่านเมธอด createPlugin ใช้เมธอดนี้เพื่อสร้าง
IDrmPlugin อินสแตนซ์
::ndk::ScopedAStatus getSupportedCryptoSchemes( std::vector<::aidl::android::hardware::drm::Uuid>* _aidl_return);
getSupportedCryptoSchemes จะแสดงรายการรูปแบบการเข้ารหัสที่รองรับ
สำหรับอินสแตนซ์ AIDL DRM HAL ลำดับนี้จะกำหนดว่าโรงงานปลั๊กอินสามารถสร้าง
ปลั๊กอิน DRM ที่รองรับรูปแบบการเข้ารหัสที่กำหนด ซึ่งระบุโดย UUID ได้หรือไม่
::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 ที่รองรับรูปแบบคอนเทนเนอร์สื่อที่กำหนด ซึ่งระบุโดย mimeType ได้หรือไม่
::ndk::ScopedAStatus isContentTypeSupported(const std::string& in_mimeType, bool* _aidl_return);
ลำดับนี้จะสร้างปลั๊กอิน DRM สำหรับรูปแบบการเข้ารหัสที่ระบุโดย UUID
::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
คลาส CryptoHal จะค้นหาบริการปลั๊กอิน DRM ที่ลงทะเบียนไว้ และสร้างปลั๊กอินที่เกี่ยวข้องซึ่งรองรับรูปแบบการเข้ารหัสที่กำหนดผ่านคลาส CryptoFactory
ลำดับนี้จะกำหนดว่าโรงงานการเข้ารหัสสามารถสร้างปลั๊กอินการเข้ารหัสที่รองรับรูปแบบการเข้ารหัสที่กำหนด ซึ่งระบุโดย UUID ได้หรือไม่
::ndk::ScopedAStatus isCryptoSchemeSupported( const ::aidl::android::hardware::drm::Uuid& in_uuid, bool* _aidl_return);
ลำดับนี้จะกำหนดว่าโรงงานปลั๊กอินสามารถสร้างปลั๊กอินการเข้ารหัสที่รองรับรูปแบบการเข้ารหัสที่กำหนด ซึ่งระบุโดย 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);
API ปลั๊กอิน DRM
API ได้รับการกำหนดไว้ในhardware/interfaces/drm/aidl/aidl_api/android.hardware.drm/
VERSION/android/hardware/drm/IDrmPlugin.aidl คุณจะพบไฟล์ IDrmPlugin.h ที่เกี่ยวข้องใน out/Soong หลังจากบิลด์