平台:RK3188
版本:Android4.2.2
现象1:先连接Ethernet网后连接WiFi的时候会将Ethernet断开
现象2:先连接WiFi后,Ethernet连接不上
现象3:Ethernet在硬件断开后再插入的时候不能自动连接
今天只解决现象1.
Android连接网络流程图:
图中只关注了WiFi和以太网,连接是不分顺序的,如果以太网优先级高,就算先连接wifi后连接以太网,也会将WiFi代替掉。
重点在于优先级仲裁的阶段,各自网络配置好后,会自动到优先级仲裁的地方报道:
frameworks/base/services/java/com/android/server/ConnectivityService.java的NetworkStateTrackerHandl
所以这里将这个文件的调试全部打开将如下的值全部赋值为true.
-
private static final boolean DBG = true; -
private static final boolean VDBG = true; - private
static final boolean LOGD_RULES = true;
分析仲裁具体是在case NetworkStateTracker.EVENT_STATE_CHANGED:这个分支的handleCaptivePortalTrack
仔细来看:
- private
boolean isNewNetTypePreferredOve rCurrentNetType(int type) { -
if (DBG) { -
log("type = " + type); - og("mNetworkPreference
= " + mNetworkPreference); -
log("mNetConfigs[mActiveDefaultNetwork].priority = " + mNetConfigs[mActiveDefaultNetwork].priority); -
log(" mNetConfigs[type].priority = "+ mNetConfigs[type].priority); -
log("mNetworkPreference = " + mNetworkPreference); -
log("mActiveDefaultNetwork = " + mActiveDefaultNetwork); -
log("mActiveDefaultNetwork =" + mActiveDefaultNetwork); -
} -
if ((type != mNetworkPreference && -
mNetConfigs[mActiveDefaultNetwork].priority > -
mNetConfigs[type].priority) || -
mNetworkPreference == mActiveDefaultNetwork) return false; -
return true; - }
并添加打印信息后:
转换成人类语言:
((新连接的网络类型 不 等于偏好) 且 (新连接网络类型优先级 低于 当前网络类型优先级))
新连接的网络类型
偏好
新连接网络类型优先级 = mNetConfigs[type].priority
当前网络类型优先级
当前网络类型
frameworks\base\core\res\res\values-large\config.xml 中有这种网络类型:
-
"false" name="networkAttributes"> -
"wifi,1,1,1,-1,true" -
"mobile,0,0,0,-1,true" -
"mobile_mms,2,0,2,60000,true" -
"mobile_supl,3,0,2,60000,true" -
"mobile_hipri,5,0,3,60000,true" -
"mobile_fota,10,0,2,60000,true" -
"mobile_ims,11,0,2,60000,true" -
"mobile_cbs,12,0,2,60000,true" -
"wifi_p2p,13,1,0,-1,true" - "ethernet,9,9,0,-1,true"
-
(注:上边第3个数也是指的优先级,不过经过实验并没有起到效果)
经过上面的分析要实现WiFi不打断ethernet就是要实现mNetworkPreference是ethernet的9,而不是WiFi的1.剩下的就是找出mNetworkPreference的来历了。
- mNetworkPreference
= getPersistedNetworkPrefe rence(); -
private int getPersistedNetworkPrefe rence() { -
final ContentResolver cr = mContext.getContentResolver(); -
-
final int networkPrefSetting = Settings.Global -
.getInt(cr, Settings.Global.NETWORK_PREFERENCE, -1); -
if(DBG) { -
log("networkPrefSetting = " + networkPrefSetting); -
log("ConnectivityManager.DEFAULT_NETWORK_PREFERENCE = " + ConnectivityManager.DEFAULT_NETWORK_PREFERENCE); -
} -
if (networkPrefSetting != -1) { -
return networkPrefSetting; -
} -
-
return ConnectivityManager.DEFAULT_NETWORK_PREFERENCE; - }
-
- t;integer
name="def_network_preference">9</</span>integer>

上边的实验结果可以看出,当WiFi连接的时候,进到仲裁的地方,由于它的优先级没有ethernet的高,所以没有让它占领网卡。
(注意:修改xml文件重新编译前要将上次编译出的中间文件删除,否则不会编译进去)
然后,这个问题就解决了。