开机注网流程

一.BP侧流程

1.sim卡初始化

1>主要卡文件读取
参考3GPP TS 31.102
在这里插入图片描述
2>主要NV

NV10Digital/Analog Mode Preference,接入技术,对应上层设置的网络模式
NV00849Network Selection Mode Preference,设置手动搜网与自动搜网
NV00850Service Domain Preference,服务域选取,仅PS/CS/PS&CS
NV6828LTE band config,UE支持的LTE band
NV65633:lte bandpref /nv/item_files/modem/mmode/lte_bandpref

2.plmn,rat选择

plmn和rat选择在reg模块中完成,通过CM_SERVICE_REQ发起,分为手动模式和自动模式
1>手动搜网

 协议:23.122 4.4.3.1.1 Automatic Network Selection Mode Procedure
 按照协议规定的优先级去搜索网,即RPLMN->HPLMN->UPLMN->OPLMN

2>自动搜网

 协议:23.122 4.4.3.1.2 Manual Network Selection Mode Procedure
 UE会将所有的PLMN,包括不可用的PLMN列出来,供用户选择注册

3>流程

    开机后会先从sim卡获取EF_LRPLMNSI,如果是1,先获取HPLMN,如果是0,先获取RPLMN
    若先获取RPLMN,设备会先读取NV_RPLMNACT_I,获得最后注册的网络模式,并根据该网络制式去获取对应的PLMNNV_RPLMNACT_I = LTE,对应的RPLMNEF_EPSLOCI获取
    若NV_RPLMNACT_I = UMTS or GSM,继续检查NV_SERVICE_DOMAIN_PREF_INV_SERVICE_DOMAIN_PREF_I = CS only or CS&PSRPLMNEFLOCI获得。
    若NV_SERVICE_DOMAIN_PREF_I = PS only RPLMN信息从EFPSLOCI中获得。

当找到可用plmn时,发起MMR_REG_REQ PLMN请求
log:

//network_selection_mode 0代表自动选网
02:16:36.506793 MM/LowFreq/High/REG [ reg_state.c 2356] DS: SUB 0 =REG= CM_SERVICE_REQ Scan Scope type=0 network_selection_mode 0 Additional_info=0 RAT Enabled BM = 0x214, BST BM = 0x2001
//选择的rplmn,rat
02:16:36.507431 MM/LowFreq/High/REG [ reg_send.c 2176] DS: SUB 0 =REG= MMR_REG_REQ PLMN(460-11) RAT(0-GSM,1-W,2-LTE,3-TDS,4-NR5G) = 2 trans_id 8, scan_scope=01

4.小区选择

MM模块收到reg模块发来的注册请求,根据传来的intial_rat 发送rrc_service_req去激活对应协议栈,在接入层模块进行扫频,小区搜索,小区选择等。
小区搜索分为band scan与system scan

band scan:根据UE支持的band来进行频点搜索
system scan:根据acq_db文件中保存的频点来搜索

//log:

//system scan
06:59:19.253845 LRRC/HighFreq/High/LRRC [ lte_rrc_csp.c 26478] CSP: Processing service request1
06:59:19.278490 LRRC/HighFreq/High/LRRC [ lte_rrc_llc.c 1937] Sent System Scan Request
06:59:19.349307 LRRC/HighFreq/High/LRRC [ lte_rrc_csp.c 34633] CSP: Received System Scan Cnf
06:59:19.349308 LRRC/HighFreq/High/LRRC [ lte_rrc_csp.c 34655] CSP: System Scan Cnf returned 3 systems1
06:59:19.349372 LRRC/HighFreq/High/LRRC [ lte_rrc_csp.c 24665] CSP: Prioritization of system scan results complete1 //查看扫频结果
06:59:19.349470 LML1/LowFreq/High/LML1 [ lte_ml1_mgr_stm.c 4181] LTE_CPHY_ACQ_REQ Trans id 8 Band 3 earfcn 1650 rest_cfg 0 # black_cells 0 acq_type 0 acq_cell_id 0,num earfcn 11
 
//cell select
06:59:19.433037 LML1/LowFreq/High/LML1 [lte_ml1_sm_idle_cell_select_stm.c 1546] Entering IDLE CELL SELECT STM1
06:59:19.440858 LRRC/HighFreq/High/LRRC [ lte_rrc_csp.c 39583] CSP: Proceeding to cell select request1
06:59:19.440895 LRRC/HighFreq/High/LRRC [ lte_rrc_csp.c 8641] CSP: Sent Cell Selection Request1
06:59:19.444017 LRRC/HighFreq/High/LRRC [ lte_rrc_csp.c 41121] CSP: Received Cell Select Cnf1
06:59:19.444021 LRRC/HighFreq/High/LRRC [ lte_rrc_csp.c 41294] CSP: Cell select req is success1
06:59:19.349451 LRRC/HighFreq/High/LRRC [ lte_rrc_llc.c 1948] Sent Acq Request1
06:59:19.440591 LRRC/HighFreq/High/LRRC [ lte_rrc_csp.c 39078] CSP: Adding cell to Acq DB1 //保存在acq db中
06:59:19.598790 LML1/LowFreq/High/LML1 [lte_ml1_sm_idle_cell_select_stm.c 1591] Exiting IDLE CELL SELECT STM1

5.附着网络

1>随机接入,RRC连接
UE通过小区搜索成功驻留到LTE网络,通过随机接入与小区建立RRC链接并取得上行同步。
随机接入主要目的:获取上行同步;为UE分配一个唯一的标识C-RNTI
log:

信令:
02:13:47.716920       [0xB0C0]  UL_CCCH / RRCConnectionRequest
02:13:47.750050       [0xB167]   LTE Random Access Request (MSG1) Report
02:13:47.758430       [0xB168]   LTE Random Access Response (MSG2) Report
02:13:47.758600       [0xB169]   LTE UE Identification Message (MSG3) Report
02:13:47.770454       [0xB16A]  LTE Contention Resolution Message (MSG4) Report
02:13:47.770507       [0xB0C0]  DL_CCCH / RRCConnectionSetup
02:13:47.774524       [0xB0C0]  UL_DCCH / RRCConnectionSetupComplete
 
//NAS ,AS
02:13:47.716822 MM/LowFreq/High/MM [ emm_rrc_if.c 1312] DS: SUB 0 =EMM= Sent LTE_RRC_CONN_EST_REQ w/ cause 3, msg_id=651
02:13:47.716834 MM/HighFreq/High/MM [ emm_database.c 189] DS: SUB 0 =EMM= Set connection state 1
02:13:47.716841 LRRC/HighFreq/High/LRRC [ lte_rrc_cep.c 1834] RRC CEP: RegisteredMME is present in CONN_EST_REQ
02:13:47.716843 LRRC/HighFreq/High/LRRC [ lte_rrc_cep.c 6017] RRC CEP: Recvd Conn Est Req; Controller state = 2
02:13:47.716858 LRRC/HighFreq/High/LRRC [ lte_rrc_cep.c 4662] RRC CEP:LTE_RRC_EST_CAUSE_MO_SIGNALING volte_opt:est_calltype = 0
02:13:47.716873 LRRC/HighFreq/High/LRRC [lte_rrc_controller.c 9009] RRCC_DSDS: Received TRM Priority Indi. From:0, Pri: 6, Proc: 5
02:13:47.716897 LRRC/HighFreq/High/LRRC [ lte_rrc_cep.c 5213] RRC CEP: Building ConnectionRequest message
02:13:47.716928 LL2/LowFreq/High/LRLC [ lte_mac_ctrl.c 2701] Start Access Request for reason=0, RAID=255 //随机接入
02:13:47.716942 LRRC/HighFreq/High/LRRC [lte_rrc_controller.c 8025] RRCC: Received conn_est_started_indi

2>attach流程
log:

02:13:47.716720 LTE NAS EMM Plain OTA Outgoing Message Attach request Msg 1
02:13:48.241882 LTE NAS EMM Plain OTA Incoming Message Attach accept Msg 1
02:13:48.246848 LTE NAS EMM Plain OTA Outgoing Message Attach complete Msg 1
02:13:48.324604 LTE NAS ESM Plain OTA Outgoing Message PDN connectivity request Msg1
02:13:48.429165 LTE NAS ESM Plain OTA Incoming Message Activate default EPS bearer context request Msg1
02:13:48.433425 LTE NAS ESM Plain OTA Outgoing Message Activate default EPS bearer context accept Msg1
02:13:49.798700 IMS Registration Length: 177   

二.AP侧流程

1.拨号
收到注册成功的消息(DATA_REGISTRATION_STATE)→apn连接(trySetupData)→卡loaded–>trySetupData
关键log: < DATA_REGISTRATION_STATE|trySetupData|onDataSetupComplete
第一次拨号使用default类型的拨号,但此时卡文件还没加载完成,拨号失败
在这里插入图片描述
第二次拨号:
使用ims类型的apn 拨号成功
在这里插入图片描述
apn配置在apns-conf.xml文件中 ,一般位于/system/etc/下

优先级:data/misc/apns/apns-conf.xml >product/etc/apns-conf.xml >oem/telephony/apns-conf.xml >system/etc/apns-conf.xml

但是apns-conf.xml中关于电信卡46011 有好几个,会选哪个进行拨号呢
源码中调用堆栈为 ,为DcTracker收到EVENT_RECORDS_LOADED消息进行处理
在这里插入图片描述
查看setupDataOnAllConnectableApns,重点关注apnContext参数,源码如下

private void setupDataOnAllConnectableApns(String reason, RetryFailures retryFailures) {
        if (VDBG) log("setupDataOnAllConnectableApns: " + reason);

        if (DBG && !VDBG) {
            StringBuilder sb = new StringBuilder(120);
            for (ApnContext apnContext : mPrioritySortedApnContexts) {
                sb.append(apnContext.getApnType());
                sb.append(":[state=");
                sb.append(apnContext.getState());
                sb.append(",enabled=");
                sb.append(apnContext.isEnabled());
                sb.append("] ");
            }
            log("setupDataOnAllConnectableApns: " + reason + " " + sb);
        }

        for (ApnContext apnContext : mPrioritySortedApnContexts) {
			Log.d(TAG,"apnContext is "+apnContext);
            setupDataOnConnectableApn(apnContext, reason, retryFailures);
        }
    }

mPrioritySortedApnContexts定义如下 ,为一个初始长度为5,从大到小排序

    private final PriorityQueue<ApnContext>mPrioritySortedApnContexts =
            new PriorityQueue<ApnContext>(5,
            new Comparator<ApnContext>() {
                public int compare(ApnContext c1, ApnContext c2) {
                    return c2.priority - c1.priority;
                }
            } );
   //添加元素
    private void initApnContexts() {
        log("initApnContexts: E");
        // Load device network attributes from resources
        String[] networkConfigStrings = mPhone.getContext().getResources().getStringArray(
                com.android.internal.R.array.networkAttributes); //frameworks\base\core\res\res\values\config.xml
        for (String networkConfigString : networkConfigStrings) {
            NetworkConfig networkConfig = new NetworkConfig(networkConfigString);
            ApnContext apnContext;

            switch (networkConfig.type) {
                case NETWORK_TYPE_DEFAULT:
                    apnContext = addApnContext(PhoneConstants.APN_TYPE_DEFAULT, networkConfig);
                    break;
                case NETWORK_TYPE_MMS:
                    apnContext = addApnContext(PhoneConstants.APN_TYPE_MMS, networkConfig);
                    break;
                case NETWORK_TYPE_SUPL:
                    apnContext = addApnContext(PhoneConstants.APN_TYPE_SUPL, networkConfig);
                    break;
                case NETWORK_TYPE_DUN:
                    apnContext = addApnContext(PhoneConstants.APN_TYPE_DUN, networkConfig);
                    break;
                case NETWORK_TYPE_HIPRI:
                    apnContext = addApnContext(PhoneConstants.APN_TYPE_HIPRI, networkConfig);
                    break;
                case NETWORK_TYPE_FOTA:
                    apnContext = addApnContext(PhoneConstants.APN_TYPE_FOTA, networkConfig);
                    break;
                case NETWORK_TYPE_IMS:
                    apnContext = addApnContext(PhoneConstants.APN_TYPE_IMS, networkConfig);
                    break;
                case NETWORK_TYPE_CBS:
                    apnContext = addApnContext(PhoneConstants.APN_TYPE_CBS, networkConfig);
                    break;
                case NETWORK_TYPE_IA:
                    apnContext = addApnContext(PhoneConstants.APN_TYPE_IA, networkConfig);
                    break;
                case NETWORK_TYPE_EMERGENCY:
                    apnContext = addApnContext(PhoneConstants.APN_TYPE_EMERGENCY, networkConfig);
                    break;
                case NETWORK_TYPE_MCX:
                    apnContext = addApnContext(PhoneConstants.APN_TYPE_MCX, networkConfig);
                    break;
                default:
                    log("initApnContexts: skipping unknown type=" + networkConfig.type);
                    continue;
            }
            log("initApnContexts: apnContext=" + apnContext);
        }

        if (VDBG) log("initApnContexts: X mApnContexts=" + mApnContexts);
    }

查看frameworks\base\core\res\res\values\config.xml,networkAttributes定义如下:

 <string-array translatable="false" name="networkAttributes">
        <item>"wifi,1,1,1,-1,true"</item>
        <item>"mobile,0,0,0,-1,true"</item>
        <item>"mobile_mms,2,0,2,60000,true"</item>
        <item>"mobile_supl,3,0,2,60000,true"</item>
        <item>"mobile_dun,4,0,2,60000,true"</item>
        <item>"mobile_hipri,5,0,3,60000,true"</item>
        <item>"mobile_fota,10,0,2,60000,true"</item>
        <item>"mobile_ims,11,0,2,60000,true"</item>
        <item>"mobile_cbs,12,0,2,60000,true"</item>
        <item>"wifi_p2p,13,1,0,-1,true"</item>
        <item>"mobile_ia,14,0,2,-1,true"</item>
        <item>"mobile_emergency,15,0,2,-1,true"</item>
    </string-array>

添加log打印的顺序如下:

08-14 17:23:32.062  2230  2230 D DcTracker: apnContext is {mApnType=emergency mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
08-14 17:23:32.062  2230  2230 D DcTracker: apnContext is {mApnType=mms mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
08-14 17:23:32.062  2230  2230 D DcTracker: apnContext is {mApnType=supl mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
08-14 17:23:32.062  2230  2230 D DcTracker: apnContext is {mApnType=hipri mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
08-14 17:23:32.062  2230  2230 D DcTracker: apnContext is {mApnType=dun mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
08-14 17:23:32.062  2230  2230 D DcTracker: apnContext is {mApnType=fota mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
08-14 17:23:32.062  2230  2230 D DcTracker: apnContext is {mApnType=ims mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
08-14 17:23:32.062  2230  2230 D DcTracker: apnContext is {mApnType=default mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
08-14 17:23:32.062  2230  2230 D DcTracker: apnContext is {mApnType=cbs mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}

源码分析:
1>pollState来源

1.SST收到EVENT_RADIO_STATE_CHANGED且当前radio状态为RADIO_POWER_OFF
2.SST收到EVENT_SIM_READY或者EVENT_RUIM_READY
3.SST收到EVENT_CARRIER_CONFIG_CHANGED

2>modemTriggeredPollState来源

1.SST收到EVENT_PHONE_TYPE_SWITCHED或者EVENT_RADIO_STATE_CHANGED
2.SST收到EVENT_NETWORK_STATE_CHANGED

3>trySetupData来源

1.DcTracker收到EVENT_ENABLE_APN<--TelephonyNetworkFactory中的needNetworkFor
2.DcTrackers收到EVENT_DATA_RAT_CHANGED
3.DcTracker收到EVENT_DATA_CONNECTION_ATTACHED
4.DcTracker收到EVENT_RECORDS_LOADED

2.重连机制
主要有以下三种方式触发重连网络(data stall)

1.SETUP_DATA_CALL 时返回错误
2.Modem上报DATA_CALL_LIST包含错误码或者链接中断
3.一段时间内没有上下行数据(TX/RX

具体参考https://blog.csdn.net/huangling07031190/article/details/125348072

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android开机服务启动流程主要包括以下几个步骤: 1. 开机引导:当用户按下电源键开机后,硬件会首先进行自检,然后加载引导程序Bootloader。Bootloader负责加载Android系统的内核。 2. 内核启动:引导程序加载完毕后,会启动Android系统的内核(Linux内核)。内核负责初始化硬件设备、创建第一个用户进程init,并启动init进程。 3. init进程启动:init进程是整个Android系统的第一个用户进程,它是所有其他进程的祖先进程。init进程会读取系统配置文件(如init.rc),根据配置文件启动各种系统服务和应用程序。 4. 启动Zygote进程:init进程会启动Zygote进程,Zygote进程是一个特殊的进程,它作为所有Java应用程序的父进程。Zygote进程会预加载常用的系统类和资源,以提高应用程序的启动速度。 5. 启动系统服务:Zygote进程会通过SystemServer类启动系统服务。系统服务包括Activity Manager、Window Manager、PackageManager等,它们负责管理Android系统的各个方面。 6. 应用程序启动:当系统服务启动完成后,Zygote进程会等待应用程序的请求。当用户点击应用程序图标或通过其他方式启动应用程序时,Zygote进程会创建一个新的应用程序进程,并加载应用程序的代码和资源,最终启动应用程序。 以上是Android开机服务启动流程的基本步骤,具体的实现细节可能会根据不同的Android版本和设备厂商有所差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值