
Tài liệu này cung cấp tổng quan về khung quản lý quyền kỹ thuật số (DRM) của Android và giới thiệu các giao diện mà plugin DRM phải triển khai. Tài liệu này không mô tả các quy tắc mạnh mẽ hoặc các quy tắc tuân thủ có thể được xác định bởi sơ đồ DRM.
Khuôn khổ
Nền tảng Android cung cấp một khung DRM có thể mở rộng cho phép các ứng dụng quản lý nội dung được bảo vệ bằng quyền theo các ràng buộc giấy phép liên quan đến nội dung đó. Khung DRM hỗ trợ nhiều chương trình DRM; chương trình DRM nào mà một thiết bị hỗ trợ là tùy thuộc vào nhà sản xuất thiết bị. Khung DRM cung cấp một giao diện thống nhất cho các nhà phát triển ứng dụng và che giấu sự phức tạp của các hoạt động DRM. Khung DRM cung cấp một chế độ hoạt động nhất quán cho nội dung được bảo vệ và không được bảo vệ. Các lược đồ DRM có thể xác định các mô hình sử dụng phức tạp bằng siêu dữ liệu giấy phép. Khung DRM cung cấp sự liên kết giữa nội dung và giấy phép DRM, đồng thời xử lý việc quản lý quyền. Điều này cho phép trình phát đa phương tiện được tóm tắt khỏi nội dung được bảo vệ bằng DRM hoặc không được bảo vệ. Xem MediaDrm cho lớp để lấy các khóa giải mã các luồng phương tiện được bảo vệ.


Sự sẵn có của nội dung kỹ thuật số phong phú rất quan trọng đối với người dùng trên thiết bị di động. Để cung cấp rộng rãi nội dung của họ, các nhà phát triển Android và nhà xuất bản nội dung kỹ thuật số cần triển khai DRM nhất quán được hỗ trợ trên toàn hệ sinh thái Android. Để cung cấp nội dung kỹ thuật số đó trên các thiết bị Android và để đảm bảo rằng có ít nhất một DRM nhất quán khả dụng trên tất cả các thiết bị, Google cung cấp DRM không tính phí giấy phép trên các thiết bị Android tương thích. Plugin DRM được tích hợp với khung DRM của Android và có thể sử dụng tính năng bảo vệ được hỗ trợ bởi phần cứng để bảo mật nội dung cao cấp và thông tin đăng nhập của người dùng.
Khả năng bảo vệ nội dung được cung cấp bởi plugin DRM phụ thuộc vào khả năng bảo mật và bảo vệ nội dung của nền tảng phần cứng bên dưới. Khả năng phần cứng của thiết bị phải bao gồm khởi động an toàn phần cứng để thiết lập một chuỗi tin cậy về bảo mật và bảo vệ các khóa mật mã. Khả năng bảo vệ nội dung của thiết bị phải bao gồm bảo vệ các khung được giải mã trong thiết bị và bảo vệ nội dung thông qua cơ chế bảo vệ đầu ra đáng tin cậy. Không phải tất cả các nền tảng phần cứng đều hỗ trợ tất cả các tính năng bảo mật và bảo vệ nội dung ở trên. Bảo mật không bao giờ được triển khai ở một nơi duy nhất trong ngăn xếp, mà thay vào đó dựa vào sự tích hợp của phần cứng, phần mềm và dịch vụ. Sự kết hợp của các chức năng bảo mật phần cứng, cơ chế khởi động đáng tin cậy và một hệ điều hành an toàn biệt lập để xử lý các chức năng bảo mật là rất quan trọng để cung cấp một thiết bị an toàn.
Ngành kiến trúc
Khung DRM được thiết kế để không thể triển khai và tóm tắt các chi tiết của việc triển khai lược đồ DRM cụ thể trong một plugin DRM dành riêng cho lược đồ. Khung DRM bao gồm các API đơn giản để xử lý các hoạt động DRM phức tạp, xin giấy phép, cung cấp thiết bị, liên kết nội dung DRM và giấy phép của nó, và cuối cùng là giải mã nội dung DRM.
Khung Android DRM được triển khai theo hai lớp kiến trúc:
- Một API khung DRM, được hiển thị với các ứng dụng thông qua khung ứng dụng Android.
- Khung DRM mã gốc, cho thấy một giao diện cho các plugin DRM (tác nhân) để xử lý việc quản lý quyền và giải mã cho các chương trình DRM khác nhau.


Xem Android Media DRM và Android Media Crypto để biết thêm chi tiết.
Plugin DRM
Khi khởi động hệ thống, khung DRM quét các bản sao / dịch vụ HAL (được mô tả trong tệp .rc
) và các phần bổ trợ được phát hiện thông qua sổ đăng ký HIDL. Media DRM Server (máy chủ trung gian) tạo cả DrmHal
tượng mediadrmserver
và CryptoHal
. CryptoHal
và DrmHal
sau đó gọi các plugin với các triển khai dành riêng cho nhà cung cấp.
Các plugin nên triển khai các HAL được ràng buộc. Các HAL được liên kết sử dụng ngôn ngữ định nghĩa giao diện HAL (HIDL) , cho phép thay thế khuôn khổ mà không cần phải xây dựng lại HAL.
Các plugin được xây dựng bởi các nhà cung cấp hoặc nhà sản xuất SOC và đặt trong một phân vùng /vendor
trên thiết bị. Tất cả các thiết bị khởi chạy với Android 8.0 trở lên phải hỗ trợ HAL được ràng buộc bởi ngôn ngữ HIDL.
Thực hiện
Để triển khai các API khung DRM mới bằng một plugin:
- Thêm dịch vụ plugin vào các tệp xây dựng của thiết bị.
- Cập nhật tệp kê khai thiết bị.
- Thêm quyền SELinux.
- Tạo tệp
.rc
theo/vendor
. - Triển khai plugin.
Các API được định nghĩa trong từng phiên bản IDrmPlugin.hal
, ICryptoPlugin.hal
, IDrmFactory.hal
và ICryptoFactory.hal
PLATFORM_ROOT/hardware/interfaces/drm/VERSION/
Thêm dịch vụ plugin vào các tệp xây dựng thiết bị
Ví dụ: để thêm hỗ trợ giao diện 1.3, tệp VENDOR DEVICE /device.mk
phải bao gồm các gói android.hardware.drm@1.3-service.*
:
Phiên bản 1.0 đến 1.2 không được chấp nhận trong R / Android 11. Các thiết bị nâng cấp lên R vẫn được phép chạy phiên bản 1.0 đến 1.2. Tuy nhiên, các thiết bị mới khởi chạy với R chỉ phải chạy phiên bản 1.3.
PRODUCT_PACKAGES += \ android.hardware.drm@1.0-impl \ android.hardware.drm@1.0-service \ android.hardware.drm@1.3-service.clearkey \ android.hardware.drm@1.3-service.widevine
Cập nhật tệp kê khai thiết bị
vendor manifest.xml
cho thiết bị phải bao gồm các mục sau:
android.hardware.drm hwbinder @1.3::ICryptoFactory/clearkey @1.3::IDrmFactory/clearkey @1.3::ICryptoFactory/widevine @1.3::IDrmFactory/widevine
Ngoài ra, chúng tôi khuyên bạn nên sử dụng vintf_fragment.
Thêm quyền SELinux
- Thêm vào
VENDOR DEVICE /sepolicy/vendor/file.te
type mediadrm_vendor_data_file, file_type, data_file_type;
- Thêm vào
VENDOR DEVICE /sepolicy/vendor/file_contexts
Chúng tôi khuyên bạn nên sử dụng biểu thức chính quy để chỉ định số phiên bản để tránh thực hiện cập nhật cho các bản phát hành mới, ví dụ:
/vendor/bin/hw/android\.hardware\.drm@\[0-9]+\.[0-9]+-service\.clearkey u:object_r:hal_drm_clearkey_exec:s0
/data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0Ngoài ra, hãy cập nhật số phiên bản như hình dưới đây.
/vendor/bin/hw/android\.hardware\.drm@1\.3-service\.clearkey u:object_r:hal_drm_clearkey_exec:s0
/data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0 - Thêm vào
device/sepolicy/vendor/hal_drm_clearkey.te
allow hal_drm_clearkey mediadrm_vendor_data_file:dir create_dir_perms; allow hal_drm_clearkey mediadrm_vendor_data_file:file create_file_perms;
Tạo tệp .rc theo / nhà cung cấp
.rc
chỉ định các hành động sẽ được thực hiện khi một dịch vụ được khởi chạy.
Xem Android Init Language để biết thêm chi tiết.
Triển khai plugin
- Triển khai điểm nhập
main()
trongservice.cpp
của dịch vụ plugin. - Triển khai
ICryptoPlugin
,IDrmPlugin
,ICryptoFactory
vàIDrmFactory
. - Triển khai các API mới trong plugin.
Chi tiết plugin DRM
Các nhà cung cấp plugin DRM triển khai plugin DrmFactory
, CryptoFactory
và DRM.
DrmFactory
Lớp DrmHal
tìm kiếm các dịch vụ plugin DRM đã đăng ký và xây dựng các plugin tương ứng hỗ trợ một lược đồ tiền điện tử nhất định thông qua lớp DrmFactory
.
IDrmFactory là điểm nhập chính để tương tác với drm HAL của nhà cung cấp thông qua API createPlugin. API createPlugin được sử dụng để tạo các phiên bản IDrmPlugin. 1.3 IDrmFactory phải luôn tạo 1.2 giao diện IDrmPlugin, được trả về thông qua phương thức createPlugin 1.0.
Return<void> getSupportedCryptoSchemes(getSupportedCryptoSchemes_cb _hidl_cb);
Mới trong 1.3 IDrmFactory, getSupportedCryptoSchemes trả về danh sách các kế hoạch tiền điện tử được hỗ trợ cho phiên bản HIDL drm HAL.
Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);
Xác định xem nhà máy sản xuất plugin có thể tạo các plugin DRM hỗ trợ một lược đồ tiền điện tử nhất định, được chỉ định bởi UUID hay không.
Return<bool> isContentTypeSupported(const hidl_string &mimeType);
Xác định xem nhà máy sản xuất plugin có thể tạo các plugin DRM hỗ trợ định dạng vùng chứa phương tiện nhất định do mimeType
chỉ định hay không.
Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid, const hidl_string& appPackageName, createPlugin_cb _hidl_cb);
Tạo một plugin DRM cho lược đồ tiền điện tử do UUID chỉ định.
CryptoFactory
Lớp CryptoHal
tìm kiếm các dịch vụ plugin DRM đã đăng ký và xây dựng các plugin tương ứng hỗ trợ một sơ đồ tiền điện tử nhất định thông qua lớp CryptoFactory
.
Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>uuid);
Xác định xem nhà máy sản xuất tiền điện tử có thể tạo các plugin tiền điện tử hỗ trợ một sơ đồ tiền điện tử nhất định, được chỉ định bởi UUID hay không.
Return<void> createPlugin(const hidl_array<uint8_t, 16>uuid, const hidl_vec<uint8_t>initData, createPlugin_cb _hidl_cb)
Xác định xem nhà máy sản xuất plugin có thể tạo các plugin tiền điện tử hỗ trợ một sơ đồ tiền điện tử nhất định, được chỉ định bởi UUID hay không.
Plugin DRM
Các API được định nghĩa tronghardware/interfaces/drm/ VERSION /IDrmPlugin.hal
. IDrmPlugin.h
tương ứng có thể được tìm thấy trong Out / Soong sau khi xây dựng.