完全可行。CH341 屬於標準 USB CDC-ACM 類別,Linux 核心內建 ch341.ko 模組。Android 核心基於 Linux,只需交叉編譯對應版本的模組並載入,即可在應用層透過 /dev/ttyUSB* 節點讀寫串口資料。
CONFIG_USB_SERIAL=yCONFIG_USB_SERIAL_CH341=y (或 CONFIG_USB_SERIAL_CH341=m 為模組)/proc/config.gz 反推配置下載對應 tag。export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-android-
export PATH=/path/to/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin:$PATH
cd kernel_source
make O=out DEFCONFIG=your_device_defconfig
make O=out menuconfig # 勾選 CH341 為 M
make O=out modules_prepare
make O=out M=drivers/usb/serial modules # 產生 ch341.ko
adb root
adb remount
adb push out/drivers/usb/serial/ch341.ko /vendor/lib/modules/
adb shell insmod /vendor/lib/modules/ch341.ko
adb shell ls -l /dev/ttyUSB* # 應出現 ttyUSB0
adb shell dmesg | grep ch341 # 核心日誌確認 probe 成功
android-serialport-api 或原生 JNI 開啟 /dev/ttyUSB0,設定波特率、資料位、停止位、奇偶校驗後收發資料。| 現象 | 原因 | 解決 |
|---|---|---|
| insmod 失敗 "Exec format error" | 核心版本/配置/工具鏈不匹配 | 嚴格對齊 uname -r、/proc/config.gz、GCC 版本 |
| 無 /dev/ttyUSB0 | 核心未啟用 USB_SERIAL 或 ueventd 權限 | 檢查 CONFIG_USB_SERIAL_CH341、ueventd.rc 加入 /dev/ttyUSB* 0660 system system |
| 讀寫無資料 | CH341 需特殊初始化命令 | 參考廠商 Linux 驅動源碼 ch341_open() 裡的 control transfer 流程 |
UsbManager + UsbDeviceConnection 實現 CDC-ACM 協議,無需 Root、無需核心模組,適合大多數 App 開發。implementation 'com.github.felHR85:UsbSerial:6.1.0'Windows 上可用 WSL2 (Ubuntu) 或 VirtualBox 跑 Linux 編譯環境,避免 Cygwin/MSYS2 工具鏈坑。Eclipse/IntelliJ 僅用於 App 層開發,核心編譯完全在 Linux 終端機進行。
