APN设置流程分析

228 阅读7分钟

目录

前期概要

源码分析

入口

重置APN流程

切换APN

新建APN

编辑APN

后续流程

​​​​​​​ConnectivityService部分

​​​​​​​AcitivityManagerService部分

参考文档


源码流程分析

前期概要

此流程分析是在不同平台可能不一致,只能作为参考文档,是属于一个通用流程文档。

源码分析

入口

首先是界面,我在此平台的界面如下:

​编辑

对应的入口源码位置在Settings的ApnSettings中

然后点击切换按钮会调用到UniEnabledNetworkModePreferenceController的onPreferenceChange方法

然后我们分析APN的主要流程:重置APN流程、切换APN、新建APN、编辑APN

重置APN流程

点击右上角的三个点,然后出现如下界面,点击Reset to default就是进行apn重置

​编辑

主要流程如下:

1、在ApnSettings界面点击重置后,通过Uri: “content://telephony/carriers/restore"进行delete操作,删除完成后会重新fillList。
2、进行delete操作时,TelephonyProvider通过URL_RESTOREAPN进行删除操作,会删除carriers表,同时删除首选APN,获取preferred-full-apn的SP,如果SP包含version1,表示apn已经存储起来了,删除该subId对应的version1字段以及APN唯一字段与subId组合在一起的字段,删除完成,重新初始化加载carrier表,

3、在ApnSettings界面查询到APN后,会通过Uri:"content://telephony/carriers/
preferapn" 去设置首选APN。

4、初始化完成后,DcTracker监听到数据库变化执行onApnChanged,然后会设置偏好APN

重置源码入口如下,在ApnSettings类中

​编辑

​编辑

​编辑

此处就是调用数据库的delete操作,其中操作的uri就是"content://telephony/carriers/restore",然后会到TelephonyProvider中进行数据删除,如下:

​编辑

可以看到上面的代码最终会调用到如下代码

mRestoreApnUiHandler

    .sendEmptyMessage(EVENT_RESTORE_DEFAULTAPN_COMPLETE);

此代码就是查询当前的状态并更新界面

​编辑

此处是重置过后的一些界面及状态的操作,其中fillList()中是调用了再次查询设置首选项apn的操作,然后进行界面刷新

然后下面就是在DcTracker中监听变化重新设置APN首选项

​编辑

切换APN

  1. 在ApnSettings界面点击onPreferenceChange,执行setSelectedApnKey,设置首选APN
    通过URI:content://telephony/carriers/preferapn 和APN_ID为选中的id进行update。
  2. TelephonyProvider:获取subId,检查values中是否包含apn_id,如果包含apn_id,获取apn_id带过来的id值,将对应的apn_id保存为该subId的首选APN
  3. DcTracker:监听到数据库变化,ApnChangeObserver的onChange函数将被调用,触发onApnChange函数,onApnChange的时候,底层会清除掉所有的连接。

首先是在ApnSettings.java文件的如下代码中监听切换apn选项的

​编辑

​编辑

如上uri就是"content://telephony/carriers/preferapn"进行包装的,此处就是进行update操作

然后会走到TelephonyProvider类中检查values中是否包含apn_id,如果包含apn_id,获取apn_id带过来的id值,将对应的apn_id保存为该subId的首选APN,如下:

​编辑

最后是在DcTracker监听数据库数据变化,同上面的重置apn差不多,这里不展开说了

新建APN

1、ApnEditor:布局初始化,获取相关控件,获取subId等intent传过来的参数,插入一条仅有id的信息,并根据插入信息返回uri,根据uri查询相应id的数据。
2、根据查询到的数据fillUi进行显示,如果是新建的,mvnoType显示有差异,mvnoMatchData显示有差异
3、移动定制版本,APN协议和APN漫游协议默认为IpV4V6、设置SIM卡相关的监听、APN变化的TextWatcher
4、在onResume中会注册phone状态、插拔卡等的监听
5、(1)点击保存:内置的APN则弹框提示是否保存,非内置的APN,直接验证并保存,如果APN相关有用信息为空,则toast提示,不保存返回,根据各项字段,通过uri更新数据库中数据。

上面的流程基本都在ApnEditor,可以查看ApnEditor这个界面的代码

​编辑

编辑APN

1、ApnEditor:布局初始化,获取相关控件,获取subId等intent传过来的参数,插入一条仅有id的信息,并根据插入信息返回uri,根据uri查询相应id的数据。
2、根据查询到的数据fillUi进行显示,如果是新建的,mvnoType显示有差异,mvnoMatchData显示有差异
3、移动定制版本,APN协议和APN漫游协议默认为IpV4V6、设置SIM卡相关的监听、APN变化的TextWatcher
4、在onResume中会注册phone状态、插拔卡等的监听
5、(1)点击保存:内置的APN则弹框提示是否保存,非内置的APN,直接验证并保存,如果APN相关有用信息为空,则toast提示,不保存返回,根据各项字段,通过uri更新数据库中数据。

编辑的过程也基本都在ApnEditor中,可以查看这部分源码

​​​​​​​**后续流程**​​​​​​​

​​​​​​​ DcTracker部分

该类检测到APN数据发生改变,执行下图系列方法去获取数据中的数据并保存到ApnSetting类中。

​编辑

​编辑

​编辑

​编辑

在数据网络建立成功之后,将代理信息发送给ConnectivityService类。

​编辑

​编辑

​编辑

​​​​​​​**ConnectivityService部分**

CS服务接受到消息之后,开始更新路由表、MTU、DNS等信息,最后发送广播给AMS去处理每个进程的Proxy。

​编辑

​编辑

​编辑

​​​​​​​**AcitivityManagerService部分**

AMS服务去设置每个进程的代理,然后更新系统属性http.proxyHost

​编辑

​编辑

至此,该proxy从Settings UI输入开始,到Telephony数据库,然后DcTracker监听到数据库的变化,获取到proxy,发送消息给ConnectivityService服务,在该服务验证了代理是否可用之后,再发送广播给ActivityManagerService去更新每个进程的代理并设置系统属性的值。