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 \
相关推荐
李坤林2 小时前
Android 12 BLASTBufferQueue 深度分析
android
盐焗西兰花2 小时前
鸿蒙学习实战之路-Core Vision Kit人脸检测实现指南
android·学习·harmonyos
码农搬砖_20202 小时前
【一站式学会compose】 Android UI体系之 Text的使用和介绍
android·compose
介一安全2 小时前
【Frida Android】实战篇18:Frida检测与绕过——基于内核指令的攻防实战
android·网络安全·逆向·安全性测试·frida
冬奇Lab2 小时前
Android稳定性基础:系统架构与关键机制
android·系统架构
李坤林2 小时前
Android ION Memory Manager 深度分析
android
Digitally2 小时前
iPhone 无法向安卓设备发送图片:轻松解决
android·ios·iphone
Digitally2 小时前
如何从 Infinix 手机中删除联系人
android
jingling5552 小时前
uni-app 安卓端完美接入卫星地图:解决图层缺失与层级过高难题
android·前端·javascript·uni-app