zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Android连接管理的评分机制(WIFI,Ethernet,BT,移动数据

AndroidWiFiBT连接数据 管理 机制 移动
2023-09-14 09:09:54 时间
Android可以支持:移动数据网络、WIFI、蓝牙、网线等,这些连接本身都可以独立使用,连接管理通过一个评分机制来实现不同接入方式的选择。具体来说就是,每一种上网方式在初始化时,都向ConnectivityService标明自己网络的分值(比如数据连接50,WIFI60,蓝牙69,网线70),当有更高分数的网络就绪时,就将当前分值低的连接断开。而当当前网络被断开时,就寻找当前就绪的其他网络连接,选取分值高的进行接入。并且,每一个网络接入时,都会进行有效性检测,如果检测不通过,将会被扣掉一定分数,此时该网络的优先级也会相应的下降。以下是Ethernet和Wifi连接管理评分的更新流程。

【1】frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetNetworkFactory.java
     private static final int NETWORK_SCORE = 70;//以太网
【2】frameworks/base/core/java/android/net/NetworkAgent.java
     public static final int WIFI_BASE_SCORE = 60;
【3】packages/apps/Bluetooth/src/com/android/bluetooth/pan/BluetoothTetheringNetworkFactory.java
     private static final int NETWORK_SCORE = 69;//蓝牙
【4】frameworks/opt/telephony/src/java/com/android/internal/telephony/dataconnection/TelephonyNetworkFactory.java
     private final static int TELEPHONY_NETWORK_SCORE = 50;//移动数据
     public TelephonyNetworkFactory(){
        setScoreFilter(TELEPHONY_NETWORK_SCORE);
     }

1.Ethernet的连接评分
<1>.frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetNetworkFactory.java
  public void updateAgent() { 
        private static final int NETWORK_SCORE = 70;//以太网的初始评分,分数越高,优先连接
       // never set the network score below 0.
        mNetworkAgent.sendNetworkScore(mLinkUp? NETWORK_SCORE : 0); 
 }

<2>.Wifi的连接评分
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiScoreReport.java
  public static WifiScoreReport calculateScore(){
        public static final int WIFI_BASE_SCORE = 60;//Wifi的初始评分
        networkAgent.sendNetworkScore(score);
 }

2.frameworks/base/core/java/android/net/NetworkAgent.java
 public void sendNetworkScore(int score) { 
      queueOrSendMessage(EVENT_NETWORK_SCORE_CHANGED, new Integer(score));
  }

3.frameworks/base/services/core/java/com/android/server/ConnectivityService.java
  <1>.case NetworkAgent.EVENT_NETWORK_SCORE_CHANGED: { 
	updateNetworkScore(nai, score.intValue());
     }

  <2>.private void updateNetworkScore(NetworkAgentInfo nai, int score) {
        final int oldScore = nai.getCurrentScore(); 
  	log("OldScore = " + OldScore + " newScore = " + String.valueOf(score) ); 
  }