在嵌入式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
二、调试全流程:从“RIL未启动”到“4G通网”
1.初遇困境:模组RIL未启动,rild文件“失踪”
现象
刚上电调试时,发现4G模组完全没反应,执行service ril-daemon指令无任何输出——核心的RIL(无线接口层)服务根本没起来。
排查
RIL服务依赖rild可执行文件,其默认路径是vendor/bin/hw/rild。进入该路径查看,果然没有rild文件——系统编译时压根没把rild编进去!
解决方案
需要在代码中添加rild的编译配置,具体是:
在hardwarerilrild目录下补充Android.mk文件,通过该.mk文件将rild编译进系统。重新编译后,vendor/bin/hw/rild路径下成功生成rild文件。
2.新问题:rild存在,但链接库“缺胳膊少腿”
好不容易搞定rild,运行后又报错——链接库缺失!这一步遇到了两个典型的库问题,我们逐个解决。
问题2.1:android.hardware.radio系列NDK库缺失
现象
执行/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/路径下。
问题2.2:libnetutils.so缺失,访问路径不对
现象
解决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"):
3.上层卡点:无RILJ初始化,4G功能未开启
底层打通后,查看系统Log发现一个关键问题:没有RILJ(RIL Java层)初始化相关操作——上层根本不知道要启用4G功能!
原因
Android系统默认可能关闭了移动数据和电信功能,需要手动开启配置。
解决方案
分两步修改上层配置:
步骤1:开启移动数据能力(修改config.xml)
修改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 @@
|
步骤2:添加电信功能权限(修改device.mk)
修改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
|
4.再遇波折:HAL配置缺失,功能仍不通
修改完上层配置后,运行还是没通——查了半天发现,缺少4G模块对应的HAL(硬件抽象层)配置,导致上层无法与底层RIL服务通信。
解决方案
在devicerockchipcommon4g_modem目录下创建/修改manifest.xml,添加android.hardware.radio系列HAL的AIDL配置(版本均为V2,对应之前的NDK库版本):
|
|
5.最后一公里:ril-daemon服务被停止
配置完HAL后,功能还是没通!用getprop |grep ril查看服务状态,发现关键问题:
| [init.svc.ril-daemon]:[stopped]
|
——ril-daemon服务被莫名关掉了,电话服务也随之停用。
解决方案
关闭系统中可能导致ril-daemon停止的配置(具体需结合实际设备的初始化脚本,此处为针对性关闭冲突配置)。
操作后重启服务,ril-daemon终于保持“running”状态!
6.验证:4G功能完全打通
至此,所有问题解决!我们做了三项验证,确认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模块,遇到类似问题可以参考本文,祝大家少踩坑、快通网!
- 随机文章
- 热门文章
- 热评文章
- 成都老卤冒烤鸭——人间烟火气,蜀中蓉小香招商加盟
- 券商今日金股:12份研报力推一股(名单)
- 仅需9.98万元 蓝电E5正式开启限时优惠
- 22万起售:“最美比亚迪”宋L开卖17天累计订单超1.1万辆
- 第二届全球数字生态大会数字会展在杭州成功举办
- 倍加洁(603059):2023年第一次临时股东大会决议
- 2022年香港运输、仓库及速递服务业的总收益为7631亿元 同比上升5%
- 群智咨询:预计2028年全球OLED面板在中尺寸渗透率约两成