RK3576+Android15+Linux6.1调试EM05 4G模块全记录:从底层到上层的踩坑与破局 电子说
在嵌入式 Android 开发中,4G 模块的调试往往是 “牵一发而动全身” 的关键环节 —— 既要搞定底层驱动与内核适配,又要打通上层框架与 RIL(Radio Interface Layer)服务。最近我们在 RK3576 开发板 + Android15 系统 + Linux6.1 内核 环境下调试EM05 4G 模块 时,就遇到了从“RIL 起不来” 到 “库缺失” 再到 “上层功能未开” 的一系列问题。今天就把完整的调试流程、踩过的坑和解决方案整理出来,希望能给做类似开发的同学避坑!
在开始前,先把核心环境信息列清楚,避免大家因环境差异导致问题复现偏差:
•硬件:RK3576 开发板 + EM05 4G 模块
•系统:Android 15(上层框架)
•内核:Linux 6.1(底层驱动)
•关键依赖:Quectel_Android_RIL_Driver_V4.2.1
刚上电调试时,发现 4G 模组完全没反应,执行service ril-daemon指令无任何输出—— 核心的 RIL(无线接口层)服务根本没起来。

RIL 服务依赖rild可执行文件,其默认路径是vendor/bin/hw/rild。进入该路径查看,果然没有rild文件——系统编译时压根没把 rild 编进去!
需要在代码中添加rild的编译配置,具体是:
在hardwarerilrild目录下补充Android.mk文件,通过该.mk 文件将rild编译进系统。重新编译后,vendor/bin/hw/rild路径下成功生成rild文件。
好不容易搞定 rild,运行后又报错 —— 链接库缺失!这一步遇到了两个典型的库问题,我们逐个解决。
执行/vendor/bin/hw/rild验证时,终端报错:
|
CANNOT LINK EXECUTABLE "/vendor/bin/hw/rild": library "android.hardware.radio.config-V2-ndk.so" not found: needed by /vendor/lib64/libril.so in namespace
|
显然,libril.so依赖的一系列android.hardware.radio相关 NDK 库没加进去。
修改hardware/ril/rild/Android.mk文件,在LOCAL_SHARED_LIBRARIES中补充缺失的 NDK 库,具体添加内容如下:
|
--- a/hardware/ril/rild/Android.mk
+++ b/hardware/ril/rild/Android.mk
@ -14,6 +14, 16 @@ LOCAL_SHARED_LIBRARIES :=
liblog
libril
+LOCAL_SHARED_LIBRARIES += android.hardware.radio.config-V2-ndk
+LOCAL_SHARED_LIBRARIES += android.hardware.radio.data-V2-ndk
+LOCAL_SHARED_LIBRARIES += android.hardware.radio.messaging-V2-ndk
+LOCAL_SHARED_LIBRARIES += android.hardware.radio.modem-V2-ndk
+LOCAL_SHARED_LIBRARIES += android.hardware.radio.network-V2-ndk
+LOCAL_SHARED_LIBRARIES += android.hardware.radio.sim-V2-ndk
+LOCAL_SHARED_LIBRARIES += android.hardware.radio.voice-V2-ndk
+LOCAL_SHARED_LIBRARIES += android.hardware.radio-V2-ndk
|
添加后重新编译,将生成的库文件直接push到vendor/lib64/路径下。

解决 NDK 库后,查看 Logcat 又出现新报错(关键词:dlopen failed: library "libnetutils.so" not found):
|
1547): dlopen failed: dlopen failed: library "libnetutils.so" not found: needed by /vendor/lib64/quectel_ril/libreference-ril.so in namespace (default)
1826): dlopen failed: dlopen failed: library "libnetutils.so" not found: needed by vendor/lib64/quectel_ril/libreference-ril.so in namespace (default)
|
用find命令查找文件位置,发现libnetutils.so其实存在,路径是./system/lib64/libnetutils.so,但libreference-ril.so在vendor目录下,访问不到system目录的库。
直接将/system/lib64/libnetutils.so移动到/vendor/lib64/路径下(与libreference-ril.so同目录)。
这一步操作后,底层 RIL 链路终于打通!从 Log 中能看到 AT 指令交互(比如查询服务小区的AT+QENG="servingcell"):

底层打通后,查看系统 Log 发现一个关键问题:没有 RILJ(RIL Java 层)初始化相关操作—— 上层根本不知道要启用 4G 功能!
Android 系统默认可能关闭了移动数据和电信功能,需要手动开启配置。
分两步修改上层配置:
修改overlay/frameworks/base/core/res/res/values/config.xml,添加config_mobile_data_capable为true(表示支持移动数据),具体 diff:
|
--- a/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/overlay/frameworks/base/core/res/res/values/config.xml
@@ -24,6 +24,11 @@
|
修改device.mk,添加电信功能的权限配置文件拷贝,确保系统识别为“支持电信功能的设备”:
|
+++ b/device.mk
@@ -260,6 +260,9 @@ PRODUCT_COPY_FILES +=
frameworks/native/data/etc/android.hardware.location.gps.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.location.gps.xml
endif
+PRODUCT_COPY_FILES +=
frameworks/native/data/etc/android.hardware.telephony.gsm.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.gsm.xml
|
修改完上层配置后,运行还是没通—— 查了半天发现,缺少 4G 模块对应的 HAL(硬件抽象层)配置,导致上层无法与底层 RIL 服务通信。
在devicerockchipcommon4g_modem目录下创建 / 修改manifest.xml,添加android.hardware.radio系列 HAL 的 AIDL 配置(版本均为 V2,对应之前的 NDK 库版本):
|
|
配置完 HAL 后,功能还是没通!用getprop |grep ril查看服务状态,发现关键问题:
|
[init.svc.ril-daemon]:[stopped]
|
——ril-daemon服务被莫名关掉了,电话服务也随之停用。
关闭系统中可能导致ril-daemon停止的配置(具体需结合实际设备的初始化脚本,此处为针对性关闭冲突配置)。
操作后重启服务,ril-daemon终于保持“running” 状态!
至此,所有问题解决!我们做了三项验证,确认 4G 功能正常:
1.网卡信息正常:wwan0网卡已识别,获取到运营商分配的 IP:
|
wwan0
Link encap:Ethernet HWaddr e28b6f:c4 Driver qmi_wwan_q
inet addr:10.35.91.190 Mask:255.255.255.252
inet6 addr: fe80:8bff6fc4/64 Scope:Link
UP RUNNING NOARP MTU:1500 Metric:1
RX packets:31 errors:0 dropped:0 overruns:0 frame:0
TX packets:46 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:5678 TX bytes:3960
|
1.Ping 通外网:执行ping www.baidu.com,无丢包,延迟正常:
|
PING www.a.shifen.com (157.148.69.151) 56(84) bytes of data.
64 bytes from 157.148.69.151: icmp_seq=1 ttl=52 time=29.9 ms
64 bytes from 157.148.69.151: icmp_seq=2 ttl=52 time=48.6 ms
64 bytes from 157.148.69.151: icmp_seq=3 ttl=52 time=55.3 ms
--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
|
1.系统显示正常:Android 界面显示 “已连接 China Unicom / 4G”,网络状态稳定。

为了方便大家后续复用,这里把调试过程中所有修改 / 新增的文件列出来(含路径),避免遗漏:
|
操作类型
|
涉及文件路径
|
关键修改内容
|
|
修改
|
hardware/ril/rild/Android.mk
|
补充 android.hardware.radio 系列 NDK 库依赖
|
|
修改
|
overlay/frameworks/base/core/res/res/values/config.xml
|
开启 config_mobile_data_capable
|
|
修改
|
device.mk(含 device/rockchip/common/device.mk、device/rockchip/rk3576/device.mk)
|
添加 android.hardware.telephony.gsm.xml 拷贝
|
|
修改
|
device/rockchip/common/4g_modem/manifest.xml
|
配置 android.hardware.radio 系列 HAL
|
|
移动
|
/system/lib64/libnetutils.so → /vendor/lib64/
|
调整库文件路径,解决访问问题
|
|
新增
|
hardware/ril/rild/Android.mk
|
编译 rild 文件进系统
|
|
其他修改
|
build/make/core/Makefile、device/rockchip/common/BoardConfig.mk、kernel-6.1/drivers/net/usb/qmi_wwan_q.c 等
|
适配内核驱动、系统编译配置
|
|
新增目录 / 文件
|
device/rockchip/common/4g_modem/、device/rockchip/rk3576/em05_quectel_ril/、external/usb_modeswitch/ 等
|
4G 模块依赖文件、工具
|
这次 EM05 4G 模块调试,本质是 “从底层到上层” 的逐层排查:
1.先解决“有没有”:比如 rild 文件是否存在、库文件是否齐全,这是基础;
2.再解决“通不通”:比如库路径是否正确、HAL 配置是否匹配,这是链路;
3.最后解决“启不启”:比如服务是否运行、上层功能是否开启,这是功能。
过程中一定要善用dmesg(内核日志)、logcat(Android 日志)、getprop(系统属性)、find(文件查找)等命令,定位问题会事半功倍。
如果大家也在 RK3576+Android15 环境下调试 4G 模块,遇到类似问题可以参考本文,祝大家少踩坑、快通网!
全部0条评论
快来发表一下你的评论吧 !