Android中设置Ethernet为默认网络类型

Android中设置Ethernet为默认网络类型


平台:RK3188
版本:Android4.2.2


     要求Ethernet网和WiFi要像PC机上那样能共存,且以Ethernet优先。其实这个问题说来简单,牵扯的东西很多,然后根据现象一点一点解决:
现象1:先连接Ethernet网后连接WiFi的时候会将Ethernet断开
现象2:先连接WiFi后,Ethernet连接不上
现象3:Ethernet在硬件断开后再插入的时候不能自动连接
今天只解决现象1.

Android连接网络流程图:

Android中设置Ethernet为默认网络类型_第1张图片

图中只关注了WiFi和以太网,连接是不分顺序的,如果以太网优先级高,就算先连接wifi后连接以太网,也会将WiFi代替掉。
重点在于优先级仲裁的阶段,各自网络配置好后,会自动到优先级仲裁的地方报道:
frameworks/base/services/java/com/android/server/ConnectivityService.java的NetworkStateTrackerHandler的handleMessage中。
所以这里将这个文件的调试全部打开将如下的值全部赋值为true.

[java] view plain copy
  1.   private static final boolean DBG = true;  
  2.   private static final boolean VDBG = true;  
  3. private static final boolean LOGD_RULES = true;  

分析仲裁具体是在case NetworkStateTracker.EVENT_STATE_CHANGED:这个分支的handleCaptivePortalTrackerCheck(info);进行的,再进一步是这里isNewNetTypePreferredOverCurrentNetType如果返回true就切换到新的网络,反之不切换。
仔细来看:
[java] view plain copy
  1. private boolean isNewNetTypePreferredOverCurrentNetType(int type) {  
  2.     if (DBG) {  
  3.         log("type = " + type);  
  4. og("mNetworkPreference = " + mNetworkPreference);  
  5.         log("mNetConfigs[mActiveDefaultNetwork].priority = " + mNetConfigs[mActiveDefaultNetwork].priority);  
  6.         log(" mNetConfigs[type].priority = "+ mNetConfigs[type].priority);  
  7.         log("mNetworkPreference = " + mNetworkPreference);  
  8.         log("mActiveDefaultNetwork = " + mActiveDefaultNetwork);  
  9.         log("mActiveDefaultNetwork =" + mActiveDefaultNetwork);  
  10.     }  
  11.     if ((type != mNetworkPreference &&  
  12.                 mNetConfigs[mActiveDefaultNetwork].priority >  
  13.                 mNetConfigs[type].priority) ||  
  14.             mNetworkPreference == mActiveDefaultNetwork) return false;  
  15.     return true;  
  16. }  

并添加打印信息后:


转换成人类语言:
((新连接的网络类型 不 等于偏好) 且 (新连接网络类型优先级 低于 当前网络类型优先级)) 
               或者 
              (偏好类型正是当前网络类型))
              则不切 
新连接的网络类型     = type                     这里是wifi
偏好                 = mNetworkPreference        这里是wifi
新连接网络类型优先级 = mNetConfigs[type].priority  wifi优先级 这里是1
当前网络类型优先级   = 以太网优先级             这里是4
当前网络类型         = mActiveDefaultNetwork     这里是以太网

frameworks\base\core\res\res\values-large\config.xml 中有这种网络类型:

[java] view plain copy
  1.    <string-array translatable="false" name="networkAttributes">  
  2.        <item>"wifi,1,1,1,-1,true"</item>  
  3.        <item>"mobile,0,0,0,-1,true"</item>  
  4.        <item>"mobile_mms,2,0,2,60000,true"</item>  
  5.        <item>"mobile_supl,3,0,2,60000,true"</item>  
  6.        <item>"mobile_hipri,5,0,3,60000,true"</item>  
  7.        <item>"mobile_fota,10,0,2,60000,true"</item>  
  8.        <item>"mobile_ims,11,0,2,60000,true"</item>  
  9.        <item>"mobile_cbs,12,0,2,60000,true"</item>  
  10.        <item>"wifi_p2p,13,1,0,-1,true"</item>  
  11. <item>"ethernet,9,9,0,-1,true"</item>     
  12.  </string-array>  

(注:上边第3个数也是指的优先级,不过经过实验并没有起到效果)
经过上面的分析要实现WiFi不打断ethernet就是要实现mNetworkPreference是ethernet的9,而不是WiFi的1.剩下的就是找出mNetworkPreference的来历了。
[java] view plain copy
  1. mNetworkPreference = getPersistedNetworkPreference();  
  2.     private int getPersistedNetworkPreference() {  
  3.         final ContentResolver cr = mContext.getContentResolver();  
  4.   
  5.         final int networkPrefSetting = Settings.Global  
  6.                 .getInt(cr, Settings.Global.NETWORK_PREFERENCE, -1);  
  7.         if(DBG) {  
  8.             log("networkPrefSetting = " + networkPrefSetting);  
  9.             log("ConnectivityManager.DEFAULT_NETWORK_PREFERENCE = " + ConnectivityManager.DEFAULT_NETWORK_PREFERENCE);  
  10.         }  
  11.         if (networkPrefSetting != -1) {  
  12.             return networkPrefSetting;  
  13.         }  
  14.   
  15.         return ConnectivityManager.DEFAULT_NETWORK_PREFERENCE;  
  16.   }  
这里实质读的是:Settings.Global.NETWORK_PREFERENCE在这里追踪到frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java是在这里读rameworks/base/packages/SettingsProvider/res/values/defaults.xml中的def_network_preference以下是我更改后的结果(以前是1):
[html] view plain copy
  1. <!--  0 == mobile, 1 == wifi. 9 == eth -->  
  2. t;integer name="def_network_preference">9</integer>  

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

你可能感兴趣的:(Android中设置Ethernet为默认网络类型)