Android如何确定使用哪个apn
一. 问题
研究这个事情是因为遇到下面这样一个问题,我们平板出到巴西、巴拉圭,客户测试发现用当地有个叫OI的运营商的SIM卡,无法上网,要Log过来看下,发现一个非常奇怪的现象:注上的电话网络跟数据网络mcc mnc居然不一样。电话网络是 72416, 数据网络是72431。
二. 分析
一直以为,Android拨数据网络的时候,是根据COPS注上当前网络的mcc, mnc来选择上网用的APN的,从这个Log看下来好像不是这样。
为了验证这个现象,我在ril里面把COPS上报(当前注上的电话网络)里的mcc mnc强改成72416,然后用联通卡在国内测。发现居然可以用3gnet(46001)正常上网。
这就说明android 层选择数据网络的 apn确实不是根据cops 里面报上来的mcc mnc来确定的,那是根据什么来确定的呢,只能看 android代码了。
代码查下来,发现Android在开机后,会生成一个备选的apn列表,那这个列表是什么时候生成的,基于什么标准来选备用apn的呢?
在GsmDataConnectionTracker.java 中可以看到,有两个事情会导致这件事情发生,一个是 onRecordsLoaded, 一个是onApnChanged, APN change 这种情况应该发生的不多,先不管。
继续查代码,在SIMRecords.java中可以看到,是在onAllRecordsLoaded中上报RecordsLoad的,估计应该是SIM卡中信息都读出来之后,即STK对话框跳出来之后,没详细验证,有兴趣的可以去试试看。