
摘要在 Android 16 GKI 2.0 平台上为 RK3588 适配双 Realtek 蓝牙芯片(RTL8922AE + RTL8822CE)时,遇到了rtk_btusb内核驱动全局单实例架构导致的严重问题:vendor 库识别到正确的 PID 却向错误的芯片发送了固件,引发蓝牙进程反复崩溃。本文从故障现象入手,逆向追踪内核驱动与用户态 vendor 库之间的控制流,定位单实例全局变量的串号根因,提出最小侵入的双实例改造方案并完整实施,涵盖内核驱动重构、用户态 HAL 双实例化(vendor 库 → 1.0-impl → 1.1-service → 独立 rc)、SELinux 策略适配和 Soong 构建系统集成。文章涵盖分析过程、架构设计、全链路关键代码修改、时序对比和踩坑经验,适合在做 Realtek 多蓝牙、Android 内核驱动实例化、HIDL HAL 多实例或 USB 字符设备重构的开发者参考。关键词:Android 16、RK3588、Realtek Bluetooth、rtk_btusb、双蓝牙、字符设备、双实例、内核驱动一、问题现象平台搭载两颗 Realtek 蓝牙芯片:RTL8922AE(主):USB0bda:d922,WiFi+BT comboRTL8822CE(副):USB0bda:c822,WiFi+BT combo两颗芯片硬件连接正常,均能被 USB 枚举。但系统启动后蓝牙反复崩溃:Bluetooth crashed 7 times 06-06 13:08:07.374 ← CRASH 06-06 13:08:09.832 ← CRASH 06-06 13:08:14.122 ← CRASH ... state: OFF (never reaches ON)Logcat 中 vendor 库的关键日志透露出异常:bt_hwcfg_usb: pid = 0xc822, vid = 0x0bda ← 拿到了 8822CE 的 PID bt_hwcfg_usb: BT fw file: rtl8822c_fw ← 按 8822CE 加载固件 bt_hwcfg_usb: Load FW OK ← 固件"下载成功" bt_hwcfg_usb: lmp_subversion = 0x8922 ← 芯片却报告是 8922! bt_hwcfg_usb: dump_usb_chip_name: 8922AU bt_hwcfg_usb: Warm BT controller startup with updated lmp → reset_controller × 3 → 超时放弃两条矛盾的信息同时出现:vendor 库认为自己在操作 8822CE,但芯片反馈自己是 8922。这不是固件问题,而是固件被发到了错误的芯片。二、根因分析2.1 链路架构梳理Realtek 蓝牙在 Android 上的控制链路不是标准 HCI,而是私有栈:┌──────────────┐ ┌──────────────────┐ ┌─────────────────────┐ │ libbt-vendor │ │ /dev/rtkbt_dev │ │ rtk_btusb.ko │ │ -realtek.so │◄──►│ (字符设备) │◄──►│ (内核驱动) │ │ │ │ │ │ │ │ 固件表匹配 │ │ ioctl: │ │ ghdev (单实例) │ │ PID→fw配置 │ │ GET_USB_INFO │ │ usb_info (全局变量) │ │ HCI 通信 │ │ DOWN_FW_CFG │ │ probe 顺序依赖 │ │ │ │ DWFW_CMPLT │ │ │ └──────────────┘ └──────────────────┘ └─────────────────────┘vendor 库通过GET_USB_INFOioctl 获取内核侧枚举到的 USB PID/VID,在自己的固件映射表中匹配对应的固件文件名,然后通过DOWN_FW_CFGioctl 触发内核下载固件。2.2 单实例架构的三个全局变量rtk_btusb.c中存在三个关键的全局单例:// 第 61-62 行:全局 usb_info,每次 probe 覆盖staticuint32_tusb_info;// 第 456 行:全局 HCI 设备指针,只保留第一个成功注册的设备structhci_dev*ghdev=NULL;// 第 451 行:全局字符设备,服务于唯一的 ghdev#defineBT_CHAR_DEVICE_NAME"rtkbt_dev"2.3 串号时序分析两颗芯片的 USB 枚举有时间差,驱动 probe 按 USB 端口顺序触发:libbt-vendorusb_info 全局ghdev 全局btusb_probe()USB 子系统libbt-vendorusb_info 全局ghdev 全局btusb_probe()USB 子系统