Grundlage ist die chinesische Quelle RK-SM-YF-773 V1.0.0. Genannt werden Android14 auf RK3326, RK3399, RK3562, RK356x, RK3568, RK3576 und RK3588, ohne Kernel-Version. Für ArmSoM ist dies eine Plattformreferenz: BSP, TEE/OEMCrypto, Registrierung und Produktionsschlüssel müssen passen. Keine L1-/GMS-Zertifizierung wird bestätigt. Flashen, Registrierung, Upload oder Hardwaretest wurden nicht durchgeführt. Kein englisches PDF vorhanden; Übersetzungen verwenden dieselben Originalgrafiken, teilweise bereits englisch.
1 Umfang
Widevine-DRM-Client in Gerät/SoC integrieren; GMS/AOSP und Android14-LR-Upgrades gegenüber IR-Erstversionen unterscheiden, einschließlich Prüfung und Diagnose.
2 Ökosystem
Im Fokus: CDM und OEMCrypto HAL im roten Rahmen:

Widevine-Ökosystem (Vektorgrafik der Quelle)
2.1 L1-Anforderungen
- Widevine-Level1-Sicherheitsanforderungen strikt erfüllen.
- Passendes L1-OEMCrypto; CDM mit kompatiblem OEMCrypto bauen, üblicherweise vom Chipanbieter. Gerätehersteller beziehen den Build dort.
- Gültige System ID durch Marken-/Modellregistrierung; während Integration IN_TESTING, vor Produktion RELEASED.
- Zugangsdaten:2.0 fordert Keybox an;4.0 lädt die in der Quelle „密送“ genannten Daten hoch, erstellt Cloud-Projekt und lädt Schlüssel hoch. Den unklaren Begriff anhand der Schnittstellenspezifikation prüfen.
- Integrationstests vor Freigabe abschließen.
2.2 L3-Anforderungen
Level3-Anforderungen und vorgebaute Widevine-L3-Bibliothek verwenden. Keine Familienregistrierung, Keybox oder Zertifikatsanforderung nötig. Richtige Plattform wählen: getrennte Datenbanken, nicht austauschbare Einträge. Integration Console für AOSP/CE(Linux), APFE für GMS/GAS/AAOS.
3 Android-DRM-Integration
3.1 GMS
Das für GMS angeforderte SDK enthält vendor/widevine. GAS-/AAOS-Autogeräte erhalten Software-/Dokumentzugriff vom Partnerteam. Clientcode, Tests und Geräteverwaltung sind getrennt.
3.2 AOSP
Widevine unterstützt AOSP ohne GMS direkt. Quellenablauf:

AOSP-Integrationsablauf (Vektorgrafik)
3.2.1 L1-Ablauf
- L1-OEMCrypto vom Chipanbieter beziehen.
- Console-Zugriff anfordern, Geräte registrieren und Keyboxes anfordern. Marke/Modell entsprechen laut Quelle product.ro.manufacturer / product.ro.model; Präfixe im SDK prüfen.
- CDM und Dokumentation unter
<branch>/libwvdrmengineund<branch>/libwvdrmengine/docsbeziehen, im AOSP-Baum ROOT/vendor/widevine automatisch bauen lassen. sh build_and_run_all_unit_tests.shin WIDEVINE_ROOT/libwvdrmengine/ sowie WVTS ausführen; CTS wird empfohlen.
3.2.2 L3-Ablauf
Bibliothek: vendor/widevine/libwvdrmengine/level3/*/libl3oemcrypto.cpp. Keine Familienregistrierung, Keybox oder Zertifikatsanforderung.
3.2.3 L1 aktivieren
Produktdatei device/rockchip/rk…/BoardConfig.mk:
BOARD_WIDEVINE_OEMCRYPTO_LEVEL := 1
3.2.4 GMS-Dienst (für AOSP nicht nötig)
Hier verlangt die Quelle GMS für provisioning4.0, beschreibt später aber AOSP4.0. Mit dem Integrationsweg abgleichen. Nach Konfiguration lunch im SDK-Stamm ausführen und Werte prüfen:
BUILD_WITH_GOOGLE_MARKET := true
get_build_var BOARD_WIDEVINE_OEMCRYPTO_LEVEL
get_build_var BUILD_WITH_GOOGLE_MARKET
3.2.5 Widevine-Repository
Bei Android14 IR überspringen. Für ältere Systeme mit Android14-LR-Upgrade in vendor/widevine:
cp -rf prebuilt/arm64/liboemcrypto_lr.so prebuilt/arm64/liboemcrypto.so
cp -rf prebuilt/arm/liboemcrypto_lr.so prebuilt/arm/liboemcrypto.so
Die Keybox-Bibliothek protokolliert folgenden provisioning-Wert. Nach LR-Werkzeugtausch in hardware/rockchip/keymaster4/rockchip_rkp_service wird nur default-CSR extrahiert:
"provisioning":"OEMCrypto_Keybox"
cp -rf bin/arm/rockchip_rkp_factory_extraction_tool_lr bin/arm/rockchip_rkp_factory_extraction_tool
cp -rf bin/arm64/rockchip_rkp_factory_extraction_tool_lr bin/arm64/rockchip_rkp_factory_extraction_tool
{"build_fingerprint":"rockchip/rk3562_u/...TXNlLWtleXM=","name":"default","serialno":"rk83991906"}
4 Provisioning-Anforderungen
Quellenklassifikation nach Gerät/OEMCrypto:
| Gerät | OEMCrypto | DICE | 2.0 | 3.0 | 4.0 non-DICE | 4.0 DICE |
|---|---|---|---|---|---|---|
| Neu | v18+ | Yes | - | - | - | Erforderlich(Standard) |
| Neu | v17+ | No | Erforderlich(Standard) | Optional | Optional | - |
| Neu | v17 or earlier | No | Erforderlich(Standard) | Optional | - | - |
| Bestehend | v17+ | No | Erforderlich(Standard) | Optional | - | - |
4.1 OTA auf Android14(LR)
Provisioning2.0 verwenden und L1-Keybox flashen. Das gekürzte Beispiel ist kein vollständiger echter Berechtigungsnachweis:
<?xml version="1.0"?>
<Widevine>
<NumberOfKeyboxes>1</NumberOfKeyboxes>
<Keybox DeviceID="test-001"><Key>738a1896e6c7ec9fa3079220aaaa132</Key>
<ID>0000000200...</ID><Magic>6b626f78</Magic><CRC>5d6a650a</CRC></Keybox>
</Widevine>
Mit rkpacker in kdb umwandeln und Tool1.64 flashen; vorhandene Keyboxes bleiben kompatibel. Bei Android12/13→14 oder Wiederverwendung alter APFE-SKUs Keybox-Registrierung beibehalten. Wechsel zu4.0 kann ausgelieferte Geräte wegen abweichender Authentifizierung ablehnen, obwohl neue funktionieren.
4.2 Android14 IR
Neues Android14 verwendet Provisioning4.0.

Quellengrafik: PDF-Seite 8, Abbildung 1 (chinesische Quelle)
- SoC-Anbieter entwickelt OEMCrypto-TA.
- Registriert Chipsatz bei Widevine.
- OEM registriert Gerät über Widevine/APFE.
- OEM nutzt chipbezogene UDS als Vertrauenswurzel; ein global eindeutiger128-Bit-SoC-Schlüssel erzeugt per KDF ein OEMCrypto-Schlüsselpaar.
- OEM fertigt Geräte. Fokus3 und5.
4.2.1 Registrierung
Zuerst Chipsatzregistrierung(2) bestätigen. AOSP registriert bei Widevine; GMS meist über3pl mit APFE-Produktdaten. Screenshots: Gerät wählen→Edit→CPU Make/CPU Model im roten Feld ausfüllen→Register DRM.

Quellengrafik: PDF-Seite 9, Abbildung 1 (chinesische Quelle)

Quellengrafik: PDF-Seite 9, Abbildung 2 (chinesische Quelle)

Quellengrafik: PDF-Seite 10, Abbildung 1 (chinesische Quelle)

Quellengrafik: PDF-Seite 10, Abbildung 2 (chinesische Quelle)

Quellengrafik: PDF-Seite 10, Abbildung 3 (chinesische Quelle)

Quellengrafik: PDF-Seite 10, Abbildung 4 (chinesische Quelle)
Formularbeispiel: Provisioning4.0, Key Upload, DICE No, OEM_CRYPTO_V18_5, TEE/TA-OTA Yes, individuelles OTA Yes, Rollbackschutz Yes, privilegiertes Debugging deaktiviert Yes, Audioabschaltung No. LR: Keybox/Verifier key.5.1 Digitalausgang(unspecified ohne Ausgang/HDCP) und5.2 Abschalten digitaler Videoausgänge gerätespezifisch ausfüllen, nicht HDCP_V2_3/Yes kopieren. Erfolgsbeispiel folgt.

Quellengrafik: PDF-Seite 11, Abbildung 1 (chinesische Quelle)
4.2.2 Fertigung
Seriennummer und ID Attestation vor Extraktion/Upload von Widevine-RKP-CSR schreiben. Debugging per Befehl, Produktion mit RKDevInfoWriteTool. Falls fehlend, mit mm in system/security/provisioner bauen.
rkp_factory_extraction_tool64 --output_format build+csr > /sdcard/csr.json
Nach Seriennummer/ID Attestation normal neu starten. RKP erzeugt CSR in vendor storage; erneut Loader, Attestation-Keybox flashen und CSR ins Werkzeugverzeichnis lesen. IDs66/67. default, widevine und nichtleere serialno prüfen; Beispieldaten mit…gekürzt.
#define VENDOR_CSR_SERIAL_ID 66
#define VENDOR_CSR_ID 67

Quellengrafik: PDF-Seite 12, Abbildung 1 (chinesische Quelle)
{"build_fingerprint":"rockchip/rk3562_u/...TXNlLWtleXM=","name":"default","serialno":"rk83991906"}
{"build_fingerprint":"rockchip/rk3562_u/...Vhc2Uta2V5cw==","name":"widevine","serialno":"rk83991906"}
CSR-Erzeugung wie keymint, siehe SDK RKDocs/android/Rockchip_Android_Remote_key_Provisioning_Guide. Bei L1 enthält eine Extraktion keymint und widevine; einmal hochladen.
5 Prüfung
Netz mit Google-/YouTube-Zugriff verbinden, neu starten oder Zertifikatsdownload abwarten(Schritte3/5).
5.1 Stufe
new Drminfo.apk installieren. System ID muss Registrierung entsprechen; Vendor-/Version-Unterschiede ignorieren.

Quellengrafik: PDF-Seite 14, Abbildung 1 (chinesische Quelle)

Quellengrafik: PDF-Seite 15, Abbildung 1 (chinesische Quelle)
Bei4.0 System ID statt nur Level=L1 prüfen.2147483647 bedeutet fehlendes Zertifikat: Registrierung, CSR und Netz prüfen.8158 bedeutet fehlerhaft geladenes liboemcrypto.so und L3.
5.2 Video
Markierte ExoPlayer-Demo-Einträge sollten über1Minute laufen. Formate stehen in SoC-Dateien vendor/rockchip/common/vpu/etc/media_codecs_c2_rk.xml und media_codecs_secure_rk.xml.

Quellengrafik: PDF-Seite 16, Abbildung 1 (chinesische Quelle)
6 FAQ
6.1 Muss Registrierungsfirmware identisch sein?
Nein; gleiche Plattform und Android-Version sind möglich. Mindestens Device Name, Product, CPU Make(Rockchip) und CPU Model(tatsächliches RK**) müssen passen. Quelle bezeichnet Informationen als unvollständig; Genehmigungsergebnis beachten. Eigenschaftszuordnung unten.
6.2 L1-Umgebung prüfen
DrmInfo zeigt L1; logcat prüfen:

Quellengrafik: PDF-Seite 17, Abbildung 1 (chinesische Quelle)
WVCdm: [cdm_engine.cpp(1089):IsSecurityLevelSupported] level = L1
...
WVCdm: [oemcrypto_adapter_dynamic.cpp(875):Initialize] OEMCrypto_Initialize Level 1 success. I will use level 1.
6.3 DrmInfo zeigt kein L1
- L1-Bibliotheken und Protokolle nach Start/DrmInfo prüfen. IR4.0 und LR2.0 unterscheiden sich in provisioning:
I/WVCdm: [oemcrypto_adapter_dynamic.cpp(885):Initialize] Level 1 Build Info
(v18): {"soc_vendor":"Rockchip","soc_model":"rk3562","ta_ver":"18.5.0+May 15 2024 14:48:28","uses_opk":true,"tee_os":"Optee","tee_os_ver":"3.13.0","form_factor":"tablet","implementer":"Rockchip","provisioning":"OEMCrypto_BootCertificateChain","is_factory_build":"false","fused":false,"is_debug":false}
I/WVCdm: [oemcrypto_adapter_dynamic.cpp(885):Initialize] Level 1 Build Info
(v18): {"soc_vendor":"Rockchip","soc_model":"rk3562","ta_ver":"18.5.0+May 15 2024 14:48:28","uses_opk":true,"tee_os":"Optee","tee_os_ver":"3.13.0","form_factor":"tablet","implementer":"Rockchip","provisioning":"OEMCrypto_Keybox","is_factory_build":"false","fused":false,"is_debug":false}
- Bei2.0 Keybox prüfen, bei4.0 Registrierung/Netz. Nicht-GMS registriert beiWidevine und lädt CSR hoch; GMS prüft Server:
ping remoteprovisioning.googleapis.com
Bei Zertifikatsfehlern RkpdWidevine suchen.500 bedeutet meist fehlende Registrierung oder CSR-Upload. Fehler-/Erfolgsprotokolle:
2024-04-19 10:38:14.366 2333-2406/? E/RkpdWidevine: Server request for WV certs
failed. Error: 500
2024-04-19 10:38:14.368 2333-2406/? E/RkpdWidevine: WV Provisioning failed.
java.io.IOException: Failed to request WV certs. Error: 500
at
com.android.rkpdapp.provisioner.WidevineProvisioner.sendNetworkRequest(WidevineProvisioner.java:188)
at
com.android.rkpdapp.provisioner.WidevineProvisioner.fetchWidevineCertificate(WidevineProvisioner.java:168)
at
com.android.rkpdapp.provisioner.WidevineProvisioner.provisionWidevine(WidevineProvisioner.java:144)
at
com.android.rkpdapp.provisioner.WidevineProvisioner.doWork(WidevineProvisioner.java:97)
at androidx.work.Worker$1.run(Worker.java:82)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
at java.lang.Thread.run(Thread.java:1012)
Line 45913: 2024-05-15 20:17:52.504 2947-5376/? I/RkpdWidevine: Starting WV
provisioning. Current attempt: 0
Line 46152: 2024-05-15 20:17:53.843 2947-5376/? I/RkpdWidevine: Provisioning
successful.
Falls ungelöst: Boot-/DrmInfo-logcat, serielle Logs, Registrierungsdaten/Screenshots, adb bugreport und CSR bereitstellen. Bei4.0 System ID ungleich2147483647 und passend zur Registrierung. Quelle vermischt „Nicht-GMS/APFE“; nach2.2 unterscheiden.
6.4 Ton ohne Bild/grüne oder defekte Frames
Symptom und adb bugreport aufnehmen; XML aus5.2 und passende rk***-Einträge prüfen.
6.5 Gleichzeitig2.0/4.0?
Nur ein Modell pro Gerät, OEM entscheidet. Spezifikation schützt Videoausgabe, nicht Audio; Audioschutz ist fürLevel1 nicht erforderlich.
6.6 OEMCrypto-Version
Quelle empfiehlt neueste verfügbare Version. Abv18 verlangen neue Implementierungen4.0; ältere aufv18+ aktualisierte Geräte behalten Fertigungs-Provisioning. Tabelle ist Quellenstand, keine aktuelle Garantie:
| Android | Versionsdatum | MediaDRM HIDL | CDM | OEMCrypto(new) | OEMCrypto(upgrade) |
|---|---|---|---|---|---|
| Android15.0 V+ | TBD | com.google.android.widevine.nonupdatable com.google.android.widevine.nonupdatable com.google.android.widevine.lazy udc-widevine-release |
19.0.0(APEX) | 19.1+ | 18.1 |
| Android14.0 U+ | 2023-10 | com.google.android.widevine.nonupdatable com.google.android.widevine.nonupdatable com.google.android.widevine.lazy |
18.0.0(APEX) | 18.1+ | 17.1 |
| Android13.0 T+ | 2022-08 | android.hardware.drm-service.widevine (tm-widevine-release) |
17.0.0 | 17.1 | 16.3+ |
| Android12.0 S+ | 2021-10 | android.hardware.drm@1.4 sc-widevine-release |
16.1.0 | 16.3 /16.4 | 16.3 /16.4 |
| Android11.0 R+ | 2020-09 | android.hardware.drm@1.3 rvc-widevine-release |
16.0.0 | 16.3 /16.4 | 15.x /16.3 /16.4 |
Doppelte HIDL-Einträge und Android15 „TBD“ bleiben erhalten, nicht als heutige Spezifikation aktualisiert.
6.7 Upload-Zeitpunkt
Daten vor Einschalten durch Endnutzer einzeln oder gesammelt hochladen; Aufzeichnungen für Google-Prüfung behalten.
7 Anhang: Android14-Code
Repository-Commits prüfen, fehlende Patches vonRK beziehen. Autorenangaben in technischen Commit-Daten bleiben erhalten.
vendor/widevine
commit 9f0b92744eeaa144629c6c2e0101d40a50160d7e (HEAD)
Author: callen.cai <callen.cai@rock-chips.com>
Date: Wed May 15 15:15:24 2024 +0800
widevine : Add android LR version.
commit bab2013c13fdb22c5f244d38510c998da4c245ba (rk/rk35/mid/14.0/develop,
m/rk35/mid/14.0/develop)
Author: callen.cai <callen.cai@rock-chips.com>
Date: Mon Apr 22 09:07:46 2024 +0800
widevine : update opk to v18.5.
This version support widevine RKP.
device/rockchip/common
commit 56aa6a72e6f00753614fba71edef7261509320d6
Author: callen.cai <callen.cai@rock-chips.com>
Date: Tue Apr 23 16:28:03 2024 +0800
sepolicy : add sepolicy for widevine rkp csr provisioning.
-------------------------------------------------------------
commit b336ed61eff291ee0b9170e9a6415fd248a41428
Author: callen.cai <callen.cai@rock-chips.com>
Date: Tue Dec 19 17:12:08 2023 +0800
media_drm : add PRODUCT_VENDOR_LINKER_CONFIG_FRAGMENTS configuration
for widevine L1.
frameworks/av
commit 1649daedd5a3fc8bc1a876c512fe657ee4132a80 (HEAD, tag: android-14.0-mid-rkr4, m/rk35/mid/14.0/develop, aosp/rk35/mid/14.0/develop)
Author: Robert Shih <robertshih@google.com>
Date: Wed Jul 12 12:50:41 2023 -0700
DrmRkpAdapter: only return HALs supporting get bcc
commit 0c588a79543ee1ae5a74c7a27bd4731161b8c409
Author: Robert Shih <robertshih@google.com>
Date: Mon Jul 10 11:54:57 2023 -0700
DrmRemotelyProvisionedComponent: assemble csr in adaptor
commit 72cc71abe5b8544f467e2e8e9d7f9930d0dc32e9
Author: Kyle Zhang <kelzhan@google.com>
Date: Thu Jun 15 00:16:42 2023 +0000
Create libmediadrmrkp as drm to irpc adapter library
hardware/rockchip/keymaster4
IR:
commit a6ba57b20d107ccf318fc678a1360fd963c8996e (HEAD)
Author: callen.cai <callen.cai@rock-chips.com>
Date: Mon May 13 17:06:07 2024 +0800
rkp : add sepolicy for get serial number.
commit 7a176bf1ccf45cc0bc67b5dda8b855f6cfc057f3 (tag: android-14.0-mid-rkr4,
rk/rk35/mid/14.0/develop, m/rk35/mid/14.0/develop)
Author: callen.cai <callen.cai@rock-chips.com>
Date: Tue Apr 23 16:24:16 2024 +0800
rkp : support widevine rkp csr provisioning.
LR:
commit c6b01283afafe0ce4d9bf8ba22103ee0e33606dc
Author: callen.cai <callen.cai@rock-chips.com>
Date: Sat Jun 22 10:30:35 2024 +0800
rkp : Add LR version rkp csr tools.
system/security
commit 9b8fc62d77f0d7cf5f79efdaca53c2ee31c96dc0 (HEAD, tag: android-14.0-mid-rkr4, m/rk35/mid/14.0/develop, aosp/rk35/mid/14.0/develop)
Author: Robert Shih <robertshih@google.com>
Date: Mon Jul 10 13:07:35 2023 -0700
rkp_factory_extraction_tool: append drm CSRs
commit 36356e22faf3e78f0fbb90a03a4d750b15402395
Author: Robert Shih <robertshih@google.com>
Date: Wed Jun 28 15:32:45 2023 -0700
Export rkp_factory_extraction_tool on ci
frameworks/native
Quelle verlangt diese manuelle Änderung:
diff --git a/libs/renderengine/skia/AutoBackendTexture.cpp b/libs/renderengine/skia/AutoBackendTexture.cpp
index 23c99b0796..acd7ae844b 100644
--- a/libs/renderengine/skia/AutoBackendTexture.cpp
+++ b/libs/renderengine/skia/AutoBackendTexture.cpp
@@ -44,7 +44,7 @@ AutoBackendTexture::AutoBackendTexture(GrDirectContext* context, AHardwareBuffer
isOutputBuffer);
mColorType =
GrAHardwareBufferUtils::GetSkColorTypeFromBufferFormat(desc.format);
if (!mBackendTexture.isValid() || !desc.width || !desc.height) {
- LOG_ALWAYS_FATAL("Failed to create a valid texture. [%p]:[%d,%d]
isProtected:%d "
+ ALOGE("Failed to create a valid texture. [%p]:[%d,%d] isProtected:%d "
"isWriteable:%d format:%d",
this, desc.width, desc.height, createProtectedImage,
isOutputBuffer,
desc.format);
