Android13 - 网络模式默认 NR only(仅5G)

在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. 问题排查过程

  1. 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常量。

  1. 网络模式常量有效性检查

进一步分析发现,尽管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 \
相关推荐
晓梦林1 小时前
[ACTF2020 新生赛]BackupFile学习笔记
android·笔记·学习
ITmaster07312 小时前
告别 IDE?Android CLI 来了,开发进入 AI Agent 时代
android·ide·人工智能
普马萨特2 小时前
5G小基站对室内定位的影响
网络·5g
aaajj3 小时前
【Android】获取设备音频
android
清泓y4 小时前
UE移动开发技术面试题
android·面试·ue5·ue4·游戏程序
DevRen4 小时前
Compose Snapshot 系统详解
android
艾莉丝努力练剑6 小时前
【MYSQL】MYSQL学习的一大重点:基本查询(下)
android·数据库·学习·mysql·面试·八股文
三少爷的鞋7 小时前
Android 中coroutineScope 和 supervisorScope 到底怎么选?先搞清楚 Exception 和 Result
android
智塑未来7 小时前
Ranplan Academic:数字孪生赋能5G教学实训
5g
飞塔老梅子8 小时前
【FortiOS 8.0】❀ 11. 无线环境下速度对比 ❀ FortiGate 防火墙
5g·无线·fortios·8.0·速度对比