在Android设备上,客户期望能够通过设置使设备默认进入"5G only"模式,确保设备始终使用5G网络。根据系统定义的网络模式常量修改Android系统属性即可。
但是本次修改后未生效,仍然会掉到4G。查看系统设置中的首选网络类型,显示仅5G,切换4G模式,网络变化;切换5G自动模式,网络变化;再次切换仅5G,网络没有变化,怀疑网络模式设置失败。
再次通过拨号盘,输入 *#*#4636#*#* 查看手机信息,默认仍然是 5G自动模式,可以确定是系统设置失败了。

进入工程模式设置网络类型,仅5G成功,但是调用的方法并不是系统接口。
1. Android系统属性
- ro.telephony.default_network :标准Android系统属性,用于设置默认网络模式,值为23时表示5G-only模式。该属性为只读,无法动态调整。
- persist.sys.eng.nr.enable :展讯平台特定的5G强制启用开关状态,根据工程模式设置后修改状态。
- persist.vendor.radio.engtest.enable :RIL层标志,用于区分工程模式(true)和标准模式(false,默认)。
2. 网络模式常量
标准Android常量 :
java
frameworks/base/telephony/java/com/android/internal/telephony/RILConstants.java
/* NETWORK_MODE_* See ril.h RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE */
/** GSM, WCDMA (WCDMA preferred) */
int NETWORK_MODE_WCDMA_PREF = 0;
/** GSM only */
int NETWORK_MODE_GSM_ONLY = 1;
/** WCDMA only */
int NETWORK_MODE_WCDMA_ONLY = 2;
/** GSM, WCDMA (auto mode, according to PRL) */
int NETWORK_MODE_GSM_UMTS = 3;
/** CDMA and EvDo (auto mode, according to PRL) */
int NETWORK_MODE_CDMA = 4;
/** CDMA only */
int NETWORK_MODE_CDMA_NO_EVDO = 5;
/** EvDo only */
int NETWORK_MODE_EVDO_NO_CDMA = 6;
/** GSM, WCDMA, CDMA, and EvDo (auto mode, according to PRL) */
int NETWORK_MODE_GLOBAL = 7;
/** LTE, CDMA and EvDo */
int NETWORK_MODE_LTE_CDMA_EVDO = 8;
/** LTE, GSM and WCDMA */
int NETWORK_MODE_LTE_GSM_WCDMA = 9;
/** LTE, CDMA, EvDo, GSM, and WCDMA */
int NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA = 10;
/** LTE only mode. */
int NETWORK_MODE_LTE_ONLY = 11;
/** LTE and WCDMA */
int NETWORK_MODE_LTE_WCDMA = 12;
/** TD-SCDMA only */
int NETWORK_MODE_TDSCDMA_ONLY = 13;
/** TD-SCDMA and WCDMA */
int NETWORK_MODE_TDSCDMA_WCDMA = 14;
/** LTE and TD-SCDMA*/
int NETWORK_MODE_LTE_TDSCDMA = 15;
/** TD-SCDMA and GSM */
int NETWORK_MODE_TDSCDMA_GSM = 16;
/** TD-SCDMA, GSM and LTE */
int NETWORK_MODE_LTE_TDSCDMA_GSM = 17;
/** TD-SCDMA, GSM and WCDMA */
int NETWORK_MODE_TDSCDMA_GSM_WCDMA = 18;
/** LTE, TD-SCDMA and WCDMA */
int NETWORK_MODE_LTE_TDSCDMA_WCDMA = 19;
/** LTE, TD-SCDMA, GSM, and WCDMA */
int NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA = 20;
/** TD-SCDMA, CDMA, EVDO, GSM and WCDMA */
int NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA = 21;
/** LTE, TDCSDMA, CDMA, EVDO, GSM and WCDMA */
int NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA = 22;
/** NR 5G only mode */
int NETWORK_MODE_NR_ONLY = 23;
/** NR 5G, LTE */
int NETWORK_MODE_NR_LTE = 24;
/** NR 5G, LTE, CDMA and EvDo */
int NETWORK_MODE_NR_LTE_CDMA_EVDO = 25;
/** NR 5G, LTE, GSM and WCDMA */
int NETWORK_MODE_NR_LTE_GSM_WCDMA = 26;
/** NR 5G, LTE, CDMA, EvDo, GSM and WCDMA */
int NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA = 27;
/** NR 5G, LTE and WCDMA */
int NETWORK_MODE_NR_LTE_WCDMA = 28;
/** NR 5G, LTE and TDSCDMA */
int NETWORK_MODE_NR_LTE_TDSCDMA = 29;
/** NR 5G, LTE, TD-SCDMA and GSM */
int NETWORK_MODE_NR_LTE_TDSCDMA_GSM = 30;
/** NR 5G, LTE, TD-SCDMA, WCDMA */
int NETWORK_MODE_NR_LTE_TDSCDMA_WCDMA = 31;
/** NR 5G, LTE, TD-SCDMA, GSM and WCDMA */
int NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA = 32;
/** NR 5G, LTE, TD-SCDMA, CDMA, EVDO, GSM and WCDMA */
int NETWORK_MODE_NR_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA = 33;
@UnsupportedAppUsage
int PREFERRED_NETWORK_MODE = Optional.of(TelephonyProperties.default_network())
.filter(list -> !list.isEmpty())
.map(list -> list.get(0))
.orElse(NETWORK_MODE_WCDMA_PREF);
展讯平台自定义常量 :
NT_NR=69 (5G-only模式,NETWORK_MODE_BASE + 19 ,NETWORK_MODE_BASE=50 )
NT_NR_LTE_FDD_TD_LTE=70 (5G+LTE模式)
3. RIL层网络模式处理机制
展讯平台的RIL层根据 persist.vendor.radio.engtest.enable 属性区分两种工作模式:
-
工程模式 ( engtestEnable=true ):支持展讯自定义的网络模式常量(如69)
-
标准模式 ( engtestEnable=false ):仅支持标准Android网络模式常量
在RIL层中, ril_network.c 文件负责处理网络模式转换,将上层传入的网络模式常量转换为Radio Access Family (RAF)位掩码,最终传递给调制解调器。
4. 问题排查过程
-
RIL层错误日志分析
R005F42 12-26 10:10:37.476 1357 1357 D RadioInteractor: [RadioInteractor] [3652]> SET_PREFERRED_NETWORK_TYPE networkType = 23
R005F43 12-26 10:10:37.476 1357 1357 D RadioInteractor: [RadioInteractorHandler] EVENT_UNSOL_RI_CONNECTED
R005F44 12-26 10:10:37.476 705 705 D RILC_EXT: setPreferredNetworkTypeExt: serial 4
R005F45 12-26 10:10:37.477 705 726 D RIL_REQ_THDS: dequeue msg
R005F46 12-26 10:10:37.477 705 726 D RIL_REQ_THDS: handleMessage 4023
R005F47 12-26 10:10:37.477 705 726 D RIL : onRequest: EXT_SET_PREFERRED_NETWORK_TYPE radioState = RADIO_ON
R005F48 12-26 10:10:37.477 705 726 D RIL : ENGTEST_ENABLE_PROP is false
R005F49 12-26 10:10:37.477 705 726 E RIL : set preferred network failed, type incorrect: 23
R005F4A 12-26 10:10:37.477 705 726 D RILC : RequestComplete, RIL_SOCKET_1
R005F4B 12-26 10:10:37.477 705 726 D RILC : Calling responseFunction() for token 4
R005F4C 12-26 10:10:37.478 705 726 D RILC_EXT: setPreferredNetworkTypeExtResponse: serial 4
R005F4D 12-26 10:10:37.478 705 726 D RIL_REQ_THDS: pool2Thread[0] process one message done
R005F4E 12-26 10:10:37.478 1357 1373 D RadioInteractor: [3652]< SET_PREFERRED_NETWORK_TYPE error 2 [SUB0]
R005F4F 12-26 10:10:37.479 1357 1357 D RadioInteractor: [RadioInteractor] [3653]> RI_REQUEST_GET_SIM_STATUS
R005F50 12-26 10:10:37.479 705 705 D RILC_EXT: getIccCardStatusExt: serial 5
R005F51 12-26 10:10:37.480 1357 1373 D RadioInteractor: [RIRequest] [3652]< SET_PREFERRED_NETWORK_TYPE error: com.android.unisoc.telephony.server.CommandException: GENERIC_FAILURE ret=
分析设备日志发现,当尝试设置5G-only模式(值为23)时,RIL层返回错误码2( GENERIC_FAILURE ),并输出日志:"set preferred network failed, type incorrect: 23"。这表明RIL层在标准模式下不支持NETWORK_MODE_NR_ONLY=23常量。
- 网络模式常量有效性检查
进一步分析发现,尽管Android系统定义了 NETWORK_MODE_NR_ONLY=23 常量,但在展讯平台的RIL层实现中, ril_network.c 文件并未对该常量进行处理,导致RIL层无法识别并拒绝该模式。
修复方案
ril_network.c的修改
修复的核心在于修改
vendor/sprd/modules/rild/impl-ril/ril_network.c 文件,
java
vendor/sprd/modules/rild$ git diff
diff --git a/impl-ril/ril_network.c b/impl-ril/ril_network.c
index df6eff2..c91857d 100755
--- a/impl-ril/ril_network.c
+++ b/impl-ril/ril_network.c
@@ -3178,6 +3178,9 @@ static int requestSetPreferredNetType(RIL_SOCKET_ID socket_id, void *data,
case NETWORK_MODE_GLOBAL:
type = WCDMA_AND_EVDO_AND_CDMA_AND_GSM;
break;
+ case NETWORK_MODE_NR_ONLY:
+ type = NR_ONLY;
+ break;
case NETWORK_MODE_NR_LTE:
type = NR_AND_TD_LTE_AND_LTE_FDD;
break;
总结
-
修复前 :RIL层在标准模式下仅支持20(5G+LTE)和22(5G+LTE+GSM+WCDMA)两种5G相关模式,不支持23(5G-only)模式,导致设置失败并返回错误码2。
-
修复后 :RIL层能够识别并处理 NETWORK_MODE_NR_ONLY=23 常量,将其转换为对应的RAF值 NR_ONLY=128 ,并传递给调制解调器,从而实现5G-only模式。
-
NR_ONLY值的有效性 :在 ril.h 文件中, NR_ONLY 定义为128,是一个有效的RAF位掩码值,代表仅使用5G网络。
本次修复通过在展讯平台的RIL层实现中添加对 NETWORK_MODE_NR_ONLY=23 的支持,解决了设备无法稳定工作在5G-only模式的问题。修复的核心在于修改 ril_network.c 文件,在标准模式的网络模式处理逻辑中添加对5G-only模式的case处理。
补充:
设置首选网络类型显示仅5G
packages/apps/Settings$ git diff
diff --git a/src_unisoc/com/unisoc/settings/network/UniEnabledNetworkModePreferenceController.java b/src_unisoc/com/unisoc/settings/network/UniEnabledNetworkModePreferenceController.java
index 124eddba5e..cbff95fa78 100755
--- a/src_unisoc/com/unisoc/settings/network/UniEnabledNetworkModePreferenceController.java
+++ b/src_unisoc/com/unisoc/settings/network/UniEnabledNetworkModePreferenceController.java
@@ -369,6 +369,7 @@ public class UniEnabledNetworkModePreferenceController extends
break;
/** UNISOC:Add for network mode @{ */
case UNISOC_ENABLED_NETWORKS_NR_CHOICES:
+ add5gOnlyEntry(TelephonyManagerConstants.NETWORK_MODE_NR_ONLY);^M
add5gAutoEntry(TelephonyManagerConstants.NETWORK_MODE_NR_LTE_GSM_WCDMA);
add4gAutoEntry(TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA);
break;
默认网络类型仅5G
device/sprd/mpool
diff --git a/module/vendor/telephony/msoc/qogirn6l/qogirn6l.mk b/module/vendor/telephony/msoc/qogirn6l/qogirn6l.mk
index 7d87910d..82958293 100755
--- a/module/vendor/telephony/msoc/qogirn6l/qogirn6l.mk
+++ b/module/vendor/telephony/msoc/qogirn6l/qogirn6l.mk
@@ -1,7 +1,8 @@
# SPDX-FileCopyrightText: 2016-2023 Unisoc (Shanghai) Technologies Co., Ltd
# SPDX-License-Identifier: LicenseRef-Unisoc-General-1.0
PRODUCT_VENDOR_PROPERTIES += \
- ro.telephony.default_network = 26 \
+ ro.telephony.default_network = 23 \
+ persist.sys.eng.nr.enable = 1 \
persist.vendor.sys.wac.enable = true \
persist.vendor.sys.single.imsstack = true \
persist.sys.wfc.supp_dual_sim = true \