第十四板块:Android 硬件抽象与安全加固 | 第三十四篇:Hardware Composer (HWC) 与 显示安全(HDCP)

第十四板块:Android 硬件抽象与安全加固 | 第三十四篇:Hardware Composer (HWC) 与 显示安全(HDCP)

所属板块:第十四板块 --- Android 硬件抽象与安全加固

前置知识:第三十三篇中的 Verified Boot、TrustZone/TEE、Kernel DRM 子系统、SurfaceFlinger 合成机制

本篇定位 :这是 Android 系统连接硅片与现实光影的最后一道闸门 。如果说 GPU 是画师,那么 Hardware Composer (HWC) 就是 画廊的策展人 ,决定哪幅画该挂在墙上;而 HDCP 则是 防窃取的保险柜 。本篇将彻底拆解 HWC HAL 的接口契约SurfaceFlinger 与 HWC 的协商机制(Validate/Present)Overlay Plane 的硬件叠加原理HDCP 1.4/2.3 的密钥交换与加密流 。我们将深入 HAL 接口定义Kernel DRM 驱动HDCP 认证协议,揭示 Android 如何在毫秒级时间内完成多图层的硬件合成,并确保高价值内容(如 DRM 视频)不被窃取。全程无 UI 适配技巧、无显示优化建议,仅保留硬件显示架构的底层定义与安全规范。


1. 核心结论先行(Thesis Statement)

Android 的显示系统是一个基于硬件能力的委托式合成模型

  • HWC 的本质硬件能力的代言人 。它不是一个执行者,而是一个决策者 。SurfaceFlinger 将图层(Layers)交给 HWC,HWC 根据硬件限制(Overlay Plane 数量、缩放能力、格式支持)决定哪些图层由 Display Controller 直接叠加 ,哪些必须由 GPU 预先合成
  • Overlay 的本质零拷贝的物理叠加。Display Controller 可以直接从不同内存地址读取图层数据,无需 GPU 进行像素拷贝,极大节省功耗。
  • HDCP 的本质链路加密协议 。它在 Source(手机)Sink(显示器/TV) 之间建立一个加密隧道。即使攻击者截获了 HDMI 线缆上的物理信号,也无法解密出原始像素数据。
  • 安全通道(Secure Path)的本质从 TEE 到显示控制器的端到端隔离。确保 DRM 内容从不进入普通世界的内存,直接在安全世界中解密并显示。

2. HWC 架构全景图

2.1 从 SurfaceFlinger 到屏幕

#mermaid-svg-SaIJlfSJZgj91BH5{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SaIJlfSJZgj91BH5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SaIJlfSJZgj91BH5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SaIJlfSJZgj91BH5 .error-icon{fill:#552222;}#mermaid-svg-SaIJlfSJZgj91BH5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SaIJlfSJZgj91BH5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SaIJlfSJZgj91BH5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SaIJlfSJZgj91BH5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SaIJlfSJZgj91BH5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SaIJlfSJZgj91BH5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SaIJlfSJZgj91BH5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SaIJlfSJZgj91BH5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SaIJlfSJZgj91BH5 .marker.cross{stroke:#333333;}#mermaid-svg-SaIJlfSJZgj91BH5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SaIJlfSJZgj91BH5 p{margin:0;}#mermaid-svg-SaIJlfSJZgj91BH5 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-SaIJlfSJZgj91BH5 .cluster-label text{fill:#333;}#mermaid-svg-SaIJlfSJZgj91BH5 .cluster-label span{color:#333;}#mermaid-svg-SaIJlfSJZgj91BH5 .cluster-label span p{background-color:transparent;}#mermaid-svg-SaIJlfSJZgj91BH5 .label text,#mermaid-svg-SaIJlfSJZgj91BH5 span{fill:#333;color:#333;}#mermaid-svg-SaIJlfSJZgj91BH5 .node rect,#mermaid-svg-SaIJlfSJZgj91BH5 .node circle,#mermaid-svg-SaIJlfSJZgj91BH5 .node ellipse,#mermaid-svg-SaIJlfSJZgj91BH5 .node polygon,#mermaid-svg-SaIJlfSJZgj91BH5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-SaIJlfSJZgj91BH5 .rough-node .label text,#mermaid-svg-SaIJlfSJZgj91BH5 .node .label text,#mermaid-svg-SaIJlfSJZgj91BH5 .image-shape .label,#mermaid-svg-SaIJlfSJZgj91BH5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-SaIJlfSJZgj91BH5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-SaIJlfSJZgj91BH5 .rough-node .label,#mermaid-svg-SaIJlfSJZgj91BH5 .node .label,#mermaid-svg-SaIJlfSJZgj91BH5 .image-shape .label,#mermaid-svg-SaIJlfSJZgj91BH5 .icon-shape .label{text-align:center;}#mermaid-svg-SaIJlfSJZgj91BH5 .node.clickable{cursor:pointer;}#mermaid-svg-SaIJlfSJZgj91BH5 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-SaIJlfSJZgj91BH5 .arrowheadPath{fill:#333333;}#mermaid-svg-SaIJlfSJZgj91BH5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-SaIJlfSJZgj91BH5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-SaIJlfSJZgj91BH5 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SaIJlfSJZgj91BH5 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-SaIJlfSJZgj91BH5 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SaIJlfSJZgj91BH5 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-SaIJlfSJZgj91BH5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-SaIJlfSJZgj91BH5 .cluster text{fill:#333;}#mermaid-svg-SaIJlfSJZgj91BH5 .cluster span{color:#333;}#mermaid-svg-SaIJlfSJZgj91BH5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-SaIJlfSJZgj91BH5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-SaIJlfSJZgj91BH5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-SaIJlfSJZgj91BH5 .icon-shape,#mermaid-svg-SaIJlfSJZgj91BH5 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SaIJlfSJZgj91BH5 .icon-shape p,#mermaid-svg-SaIJlfSJZgj91BH5 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-SaIJlfSJZgj91BH5 .icon-shape .label rect,#mermaid-svg-SaIJlfSJZgj91BH5 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SaIJlfSJZgj91BH5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-SaIJlfSJZgj91BH5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-SaIJlfSJZgj91BH5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 显示硬件
Linux 内核
Hardware Composer (HAL)
SurfaceFlinger (System Server)
分配图层
Layer Features (Buffer, Transform, Blend)
validateDisplay()
presentDisplay()
IComposer (HIDL)
合成策略引擎
图层分配器
DRM/KMS 驱动
CRTC (扫描输出)
Plane 0 (Overlay)
Plane 1 (Overlay)
Plane 2 (GPU FB)
硬件混合器 (Blender)
HDMI/TV
LCD 面板

2.2 核心组件职责表

组件 层级 职责 学术定义
SurfaceFlinger Framework 图层收集者 收集所有应用提交的 Buffer,构建 Layer 列表,交给 HWC。
HWC HAL HAL 策略决策者 实现 IComposer 接口,决定合成路径。
Overlay Plane Hardware 物理叠加层 显示控制器支持的独立图层通道,支持直接内存访问。
DRM/KMS Kernel 驱动接口 Direct Rendering Manager / Kernel Mode Setting,配置 CRTC 和 Plane。
HDCP Hardware 加密模块 集成在 HDMI 控制器中的加密引擎。

3. HWC 的合成策略:Overlay vs GPU

3.1 协商机制(Validate/Present)

SurfaceFlinger 与 HWC 的交互是两步走的。

第一步:Validate (验证)

  1. SurfaceFlinger 准备好 Layer 列表(包含 Buffer 地址、宽高、Alpha、Transform)。
  2. 调用 validateDisplay() 发给 HWC。
  3. HWC 决策
    • Case A: 硬件支持 4 个 Overlay Plane,现在有 3 个图层。HWC 返回:全部用 Overlay(0个 GPU 合成)。
    • Case B: 硬件支持 2 个 Overlay Plane,现在有 4 个图层。HWC 返回:需要 GPU 合成 2 个图层,剩下 2 个用 Overlay。
  4. SurfaceFlinger 根据 HWC 的决策,调整合成计划。

第二步:Present (呈现)

  1. SurfaceFlinger 将需要 GPU 合成的图层合并成一个 FrameBuffer。
  2. 调用 presentDisplay(),将 FrameBuffer 和 Overlay 图层的 Buffer 交给 HWC。
  3. HWC 配置硬件寄存器,启动显示。

3.2 Overlay 的优势与限制

特性 Overlay 合成 GPU 合成
功耗 极低 (仅内存读取) (需要计算、读写内存)
延迟 (硬件直出) (需要等待 GPU 渲染)
数量限制 (通常 2-4 个) (理论上无限)
变换能力 弱 (仅缩放/旋转) (任意特效、模糊)

学术定义

  • 带宽(Bandwidth):Overlay 只需要读取各图层数据一次;GPU 合成需要读取 N 次,写入 1 次,带宽消耗大得多。

4. HDCP 显示安全机制

4.1 HDCP 的工作原理

HDCP (High-bandwidth Digital Content Protection) 旨在防止数字内容在传输过程中被复制。

学术定义

  • Authentication (认证):Source 和 Sink 交换密钥,验证对方是否是合法的 HDCP 设备。
  • Encryption (加密):认证通过后,Source 使用会话密钥对像素数据进行加密,然后通过 HDMI 发送。
  • Repeater (中继器):如果中间有 AV 功放,它需要逐级认证上游和下游设备。

4.2 HDCP 版本对比

版本 密钥长度 支持分辨率 学术定义
HDCP 1.4 56-bit 1080p 较弱,已被破解。
HDCP 2.3 3072-bit RSA 4K/8K 强加密,支持 Locality Check(地理位置检查,防止远距离攻击)。

4.3 安全通道(Secure Path)与 TEE

对于 Widevine L1 等高安全级别内容,仅靠 HDCP 不够,还需要 Secure Path
#mermaid-svg-0V6q78RbZFSnQXQg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-0V6q78RbZFSnQXQg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0V6q78RbZFSnQXQg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0V6q78RbZFSnQXQg .error-icon{fill:#552222;}#mermaid-svg-0V6q78RbZFSnQXQg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0V6q78RbZFSnQXQg .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0V6q78RbZFSnQXQg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0V6q78RbZFSnQXQg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0V6q78RbZFSnQXQg .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0V6q78RbZFSnQXQg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0V6q78RbZFSnQXQg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0V6q78RbZFSnQXQg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0V6q78RbZFSnQXQg .marker.cross{stroke:#333333;}#mermaid-svg-0V6q78RbZFSnQXQg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0V6q78RbZFSnQXQg p{margin:0;}#mermaid-svg-0V6q78RbZFSnQXQg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-0V6q78RbZFSnQXQg .cluster-label text{fill:#333;}#mermaid-svg-0V6q78RbZFSnQXQg .cluster-label span{color:#333;}#mermaid-svg-0V6q78RbZFSnQXQg .cluster-label span p{background-color:transparent;}#mermaid-svg-0V6q78RbZFSnQXQg .label text,#mermaid-svg-0V6q78RbZFSnQXQg span{fill:#333;color:#333;}#mermaid-svg-0V6q78RbZFSnQXQg .node rect,#mermaid-svg-0V6q78RbZFSnQXQg .node circle,#mermaid-svg-0V6q78RbZFSnQXQg .node ellipse,#mermaid-svg-0V6q78RbZFSnQXQg .node polygon,#mermaid-svg-0V6q78RbZFSnQXQg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0V6q78RbZFSnQXQg .rough-node .label text,#mermaid-svg-0V6q78RbZFSnQXQg .node .label text,#mermaid-svg-0V6q78RbZFSnQXQg .image-shape .label,#mermaid-svg-0V6q78RbZFSnQXQg .icon-shape .label{text-anchor:middle;}#mermaid-svg-0V6q78RbZFSnQXQg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-0V6q78RbZFSnQXQg .rough-node .label,#mermaid-svg-0V6q78RbZFSnQXQg .node .label,#mermaid-svg-0V6q78RbZFSnQXQg .image-shape .label,#mermaid-svg-0V6q78RbZFSnQXQg .icon-shape .label{text-align:center;}#mermaid-svg-0V6q78RbZFSnQXQg .node.clickable{cursor:pointer;}#mermaid-svg-0V6q78RbZFSnQXQg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-0V6q78RbZFSnQXQg .arrowheadPath{fill:#333333;}#mermaid-svg-0V6q78RbZFSnQXQg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0V6q78RbZFSnQXQg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0V6q78RbZFSnQXQg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0V6q78RbZFSnQXQg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-0V6q78RbZFSnQXQg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0V6q78RbZFSnQXQg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-0V6q78RbZFSnQXQg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0V6q78RbZFSnQXQg .cluster text{fill:#333;}#mermaid-svg-0V6q78RbZFSnQXQg .cluster span{color:#333;}#mermaid-svg-0V6q78RbZFSnQXQg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-0V6q78RbZFSnQXQg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-0V6q78RbZFSnQXQg rect.text{fill:none;stroke-width:0;}#mermaid-svg-0V6q78RbZFSnQXQg .icon-shape,#mermaid-svg-0V6q78RbZFSnQXQg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0V6q78RbZFSnQXQg .icon-shape p,#mermaid-svg-0V6q78RbZFSnQXQg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-0V6q78RbZFSnQXQg .icon-shape .label rect,#mermaid-svg-0V6q78RbZFSnQXQg .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0V6q78RbZFSnQXQg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-0V6q78RbZFSnQXQg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-0V6q78RbZFSnQXQg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 显示硬件
安全世界 (TrustZone)
解密后的像素
直接传输 (不经 Normal 世界)
加密流
普通世界
SurfaceFlinger
GPU
视频解码器 (硬解)
安全 FrameBuffer
HWC
HDCP 模块
HDMI 线缆

学术定义

  • Secure Path:视频在 TEE 中解密后,数据直接流向显示控制器,不经过 Android 内核或用户空间。即使系统被 Root,也无法截获明文像素。

5. 关键源码深度解析

5.1 HWC HAL 接口定义 (HIDL)

cpp 复制代码
// hardware/interfaces/graphics/composer/2.1/IComposer.hal
interface IComposer {
    // 创建显示设备
    createVirtualDisplay(...) generates (Error error, Display display);

    // 验证显示配置
    validateDisplay(Display display) generates (Error error, ConfigChanges changes);

    // 呈现显示
    presentDisplay(Display display) generates (Error error);
};

// hardware/interfaces/graphics/composer/2.1/types.hal
struct Layer {
    BufferHandle buffer;      // 图层 Buffer
    Rect displayFrame;        // 显示区域
    Rect sourceCrop;          // 裁剪区域
    float alpha;              // 透明度
    BlendMode blendMode;      // 混合模式
};

5.2 SurfaceFlinger 的 HWC 调用

cpp 复制代码
// frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer.cpp
bool HWComposer::validate(HwcDisplayId displayId) {
    // 1. 准备 Layer 列表
    std::vector<HwcLayer> layers;
    for (auto& layer : mCurrentLayers) {
        layers.push_back(layer.toHwcLayer());
    }

    // 2. 调用 HWC HAL
    auto error = mComposer->validateDisplay(displayId, layers);

    // 3. 解析 HWC 的反馈
    if (error == Error::NOT_VALIDATED) {
        // HWC 要求 GPU 合成
        mForceGpuComposition = true;
    }
    return error == Error::NONE;
}

5.3 HDCP 认证流程

c 复制代码
// 内核驱动中的 HDCP 认证
int hdcp_authenticate(struct hdcp_device *dev) {
    // 1. 读取 Sink 的 Bksv (KSV)
    hdcp_read_ksv(dev, &sink_ksv);

    // 2. 计算 R0/Ri
    hdcp_compute_r0(dev, sink_ksv);

    // 3. 交换 An/Aksv
    hdcp_exchange_an_aksv(dev);

    // 4. 验证 R0' == R0
    if (hdcp_verify_r0(dev) != SUCCESS) {
        return -EACCES; // 认证失败
    }
    // 5. 启动加密
    hdcp_enable_encryption(dev);
    return 0;
}

6. 显示安全的常见误区

误区 学术解释
截图能拿到 DRM 内容 错误。DRM 内容走 Secure Path,SurfaceFlinger 根本拿不到明文 Buffer,截图只能是黑屏或花屏。
HDCP 防止屏幕录制 不准确。HDCP 防止的是线缆输出被窃听,不防止设备内部的屏幕录制(但 DRM 会禁止内部录制)。
HWC 总是比 GPU 快 不一定。如果图层过多导致 Overlay 耗尽,HWC 会退化成 GPU 合成,甚至更慢(因为多了 IPC 开销)。
Root 后可以绕过 HDCP 困难。HDCP 密钥通常存储在 TEE 或硬件熔丝中,Root 无法读取。

7. 本篇总结(Knowledge Closure)

关键点 纯学术定义
HWC 的本质 硬件合成策略决策者,通过 Overlay 实现零拷贝显示。
Overlay Plane 显示控制器的物理叠加通道,是低功耗显示的核心。
HDCP 链路层加密协议,保护数字内容在传输过程中的安全。
Secure Path 从 TEE 到显示控制器的端到端隔离,确保高价值内容不落地。
Validate/Present HWC 与 SurfaceFlinger 的两阶段协商契约。

8. 第十四板块结语

至此,第十四板块:Android 硬件抽象与安全加固 已全部完结。

我们从 BootROM 的信任根 出发,深入 AVB 的签名验证 ,探索 TrustZone 的硬件隔离 ,最终抵达 HWC 的显示合成与 HDCP 的内容保护

我们揭示了 Android 硬件安全的核心逻辑:用硬件能力定义软件边界,用密码学保护数据流动,用物理隔离构建安全堡垒。

下一篇预告第十五板块:Android 系统调试与逆向工程 | 第三十五篇:ART 虚拟机内部机制与 OAT 文件格式

相关推荐
KIO no way1 小时前
AI内容编排是什么_聊聊CSDN_AI数字营销背后的分发逻辑
android·人工智能
故渊at1 小时前
第十四板块:Android 硬件抽象与安全加固 | 第三十三篇:Verified Boot 与 硬件信任链(Trusty TEE)
android·安全·信任链·verified
Tangyuewei2 小时前
我用 AI 辅助开发了一个发型 App,然后打包成了 APK
android·人工智能·ai编程
程序课代表2 小时前
Android源码分析挖掘(二) fork大师zygote进程
android·zygote
帅次2 小时前
Android 16(API Level 36)Activity 启动流程源码级解析
android·framework·源码解析·activity启动流程·android 16
努力的lpp2 小时前
渗透主流工具完整参数手册(sqlmap、Nmap、Hydra、Dirsearch、Xray)
javascript·网络协议·测试工具·安全·http·工具
CJH(本人账号)2 小时前
上线仅72小时被强制下架:Claude Fable 5 的短命
人工智能·安全·语言模型
chian-ocean2 小时前
Microi吾码:从零到服装ERP:低代码打造企业级系统的实战之旅
android·低代码·rxjava
kang0x02 小时前
将一个通用 DAG 探索引擎迁移到 Flocks:CTF 回归测试全记录
安全