Android5.0以太网流程源码情景分析

来源:互联网 发布:hspa 什么网络 编辑:程序博客网 时间:2024/06/05 06:14

                             Android5.0以太网流程源码情景分析

  1. logcat -s TCL_EthernetManager EthernetManager EthernetService EthernetServiceImpl EthernetNetworkFactory EthernetConfigStore TCL_EthernetDevInfo CommandListener ConnectivityService NetworkSettingsActivity Ethernetd dhcpcd NetworkMonitorNetworkAgentInfo NetworkManagementService NetdConnector NativeDaemonConnector Guide NetworkMonitorNetworkAgentInfo  

一、启动流程

frameworks/base/services/java/com/android/server/SystemServer.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public final class SystemServer {  
  2.   private static final String ETHERNET_SERVICE_CLASS =  
  3.             "com.android.server.ethernet.EthernetService";  
  4.   public static void main(String[] args) {  
  5.     new SystemServer().run();  
  6.   }  
  7.   private void run() {  
  8.     startOtherServices();  
  9.   }  
  10.   private void startOtherServices() {  
  11.     if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_ETHERNET)) {  
  12.                     mSystemServiceManager.startService(ETHERNET_SERVICE_CLASS);  
  13.     }  
  14.   }  
  15. }  
frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetService.java
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public final class EthernetService extends SystemService {  
  2.     private static final String TAG = "EthernetService";  
  3.     final EthernetServiceImpl mImpl;  
  4.     public EthernetService(Context context) {  
  5.         super(context);  
  6.         mImpl = new EthernetServiceImpl(context);  
  7.     }  
  8.     @Override  
  9.     public void onStart() {  
  10.         Log.i(TAG, "Registering service " + Context.ETHERNET_SERVICE);  
  11.         publishBinderService(Context.ETHERNET_SERVICE, mImpl);  
  12.     }  
  13.     @Override  
  14.     public void onBootPhase(int phase) {  
  15.         if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {  
  16.             mImpl.start();  
  17.         }  
  18.     }  
  19. }  
frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetServiceImpl.java
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class EthernetServiceImpl extends IEthernetManager.Stub {  
  2.   public EthernetServiceImpl(Context context) {  
  3.     mContext = context;  
  4.     Log.i(TAG, "Creating EthernetConfigStore");  
  5.     mEthernetConfigStore = new EthernetConfigStore();  
  6.     mIpConfiguration = mEthernetConfigStore.readIpAndProxyConfigurations();  
  7.     Log.i(TAG, "Read stored IP configuration: " + mIpConfiguration);  
  8.     IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);  
  9.     mNMService = INetworkManagementService.Stub.asInterface(b);  
  10.     mTracker = new EthernetNetworkFactory();  
  11.   }  
  12.   public void start() {  
  13.     mCM = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);  
  14.     HandlerThread handlerThread = new HandlerThread("EthernetServiceThread");  
  15.     handlerThread.start();  
  16.     mHandler = new Handler(handlerThread.getLooper());  
  17.     mEnabled = getPersistedState();  
  18.     Log.i(TAG, "Ethernet Persisted Enabled " + mEnabled);  
  19.     setState(mEnabled);  //重要  
  20.   }  
  21.   public synchronized void setState(int state) {  
  22.     enforceChangePermission();  
  23.     Log.i(TAG, "setState from mState=" + mState + " to state=" + state);  
  24.     if (mState != state) {  
  25.       mState = state;  
  26.       if (state == EthernetManager.ETHERNET_STATE_DISABLED) {  
  27.         setPersistedState(EthernetManager.ETHERNET_STATE_DISABLED);  
  28.         mTracker.stopInterface();  
  29.         mStarted.set(false);  
  30.       } else {  
  31.         setPersistedState(EthernetManager.ETHERNET_STATE_ENABLED);  
  32.         mTracker.stop();  
  33.         mTracker.start(mContext, mHandler);  
  34.         mStarted.set(true);  
  35.       }  
  36.     }  
  37.   }  
  38. }  
frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetNetworkFactory.java
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. class EthernetNetworkFactory {  
  2.   EthernetNetworkFactory() {  
  3.     mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_ETHERNET, 0, NETWORK_TYPE, "");  
  4.     mLinkProperties = new LinkProperties();  
  5.     initNetworkCapabilities();  
  6.   }  
  7.   public synchronized void start(Context context, Handler target) {  
  8.     IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);  
  9.     mNMService = INetworkManagementService.Stub.asInterface(b);  
  10.     mEthernetManager = (EthernetManager) context.getSystemService(Context.ETHERNET_SERVICE);  
  11.     mFactory = new LocalNetworkFactory(NETWORK_TYPE, context, target.getLooper());  
  12.     mFactory.setCapabilityFilter(mNetworkCapabilities);  
  13.     mFactory.setScoreFilter(-1); // this set high when we have an iface  
  14.     mFactory.register();  
  15.     /* 
  16.     public void register() {  
  17.       if (DBG) log("Registering NetworkFactory");  
  18.       if (mMessenger == null) {  
  19.         mMessenger = new Messenger(this);  
  20.         ConnectivityManager.from(mContext).registerNetworkFactory(mMessenger, LOG_TAG);  
  21.       }  
  22.     }  
  23.     frameworks/base/services/core/java/com/android/server/ConnectivityService.java  
  24.     public void registerNetworkFactory(Messenger messenger, String name) {  
  25.       NetworkFactoryInfo nfi = new NetworkFactoryInfo(name, messenger, new AsyncChannel());  
  26.       mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_FACTORY, nfi));  
  27.     }  
  28.     private class InternalHandler extends Handler {  
  29.       public void handleMessage(Message msg) {  
  30.         case EVENT_REGISTER_NETWORK_FACTORY: {  
  31.           handleRegisterNetworkFactory((NetworkFactoryInfo)msg.obj);  
  32.           break;  
  33.         }  
  34.       }  
  35.     }  
  36.     private void handleRegisterNetworkFactory(NetworkFactoryInfo nfi) {  
  37.       if (DBG) log("Got NetworkFactory Messenger for " + nfi.name);  
  38.       mNetworkFactoryInfos.put(nfi.messenger, nfi);  
  39.       nfi.asyncChannel.connect(mContext, mTrackerHandler, nfi.messenger);  
  40.     } 
  41.     */  
  42.     mInterfaceObserver = new InterfaceObserver();  
  43.     try {  
  44.       mNMService.registerObserver(mInterfaceObserver);  
  45.     } catch (RemoteException e) {  
  46.       Log.e(TAG, "Could not register InterfaceObserver " + e);  
  47.     }  
  48.     updateInterfaceState(iface, true); //注册  
  49.   }  
  50.   private void updateInterfaceState(String iface, boolean up) {  
  51.     updateAgent();  
  52.     mFactory.setScoreFilter(up ? NETWORK_SCORE : -1); //设置scroe值;这个是网络优先级判断依据  
  53.   }  
  54.   public void updateAgent() {  
  55.     mNetworkAgent.sendNetworkInfo(mNetworkInfo);  
  56.   }  
  57. }  
2.ETHERNET监听NETD进程的socket

init.rc

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. service netd /system/bin/netd  
  2.     class main  
  3.     socket netd stream 0660 root system  
  4.     socket dnsproxyd stream 0660 root inet  
  5.     socket mdns stream 0660 root system  
  6.     socket fwmarkd stream 0660 root inet  

frameworks/base/services/core/java/com/android/server/NetworkManagementService.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public static NetworkManagementService create(Context context) throws InterruptedException {  
  2.   return create(context, NETD_SOCKET_NAME);  
  3.   /* 
  4.   private static final String NETD_SOCKET_NAME = "netd"; 
  5.   */  
  6. }  
  7.   
  8. private NetworkManagementService(Context context, String socket) {  
  9.   mConnector = new NativeDaemonConnector(  
  10.                 new NetdCallbackReceiver(), socket, 10, NETD_TAG, 160, wl,  
  11.                 FgThread.get().getLooper());  
  12.   /* 
  13.   frameworks/base/services/core/java/com/android/server/NativeDaemonConnector.java 
  14.   public void run() { 
  15.     mCallbackHandler = new Handler(mLooper, this); 
  16.     while (true) { 
  17.       try { 
  18.         listenToSocket(); 
  19.       } catch (Exception e) { 
  20.         loge("Error in NativeDaemonConnector: " + e); 
  21.         SystemClock.sleep(5000); 
  22.       } 
  23.     } 
  24.   } 
  25.   private void listenToSocket() throws IOException { 
  26.     LocalSocketAddress address = determineSocketAddress(); 
  27.     mCallbackHandler.sendMessage(); 
  28.   } 
  29.   public boolean handleMessage(Message msg) { 
  30.     mCallbacks.onEvent 
  31.   } 
  32.   */  
  33. }  
  34.   
  35. private class NetdCallbackReceiver implements INativeDaemonConnectorCallbacks {  
  36.   public boolean onEvent(int code, String raw, String[] cooked) {  
  37.     notifyInterfaceAdded(cooked[3]);  
  38.     ......  
  39.     notifyInterfaceRemoved(cooked[3]);  
  40.     ......  
  41.     notifyInterfaceStatusChanged(cooked[3], cooked[4].equals("up"));  
  42.     ......  
  43.     notifyInterfaceLinkStateChanged(cooked[3], cooked[4].equals("up"));  
  44.   }  
  45.   private void notifyInterfaceLinkStateChanged(String iface, boolean up) {  
  46.     mObservers.getBroadcastItem(i).interfaceLinkStateChanged(iface, up);  
  47.   }  
  48. }  
frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetNetworkFactory.java
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. private class InterfaceObserver extends BaseNetworkObserver {  
  2.   public void interfaceLinkStateChanged(String iface, boolean up) {  
  3.     updateInterfaceState(iface, up);  
  4.   }  
  5. }  
  6.   
  7. private void updateInterfaceState(String iface, boolean up) {  
  8.  mFactory.setScoreFilter(up ? NETWORK_SCORE : -1);  
  9. }  
frameworks/base/core/java/android/net/NetworkFactory.java
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public void setScoreFilter(int score) {  
  2.   sendMessage(obtainMessage(CMD_SET_SCORE, score, 0));  
  3. }  
  4.   
  5. public void handleMessage(Message msg) {  
  6.   case CMD_SET_SCORE: {  
  7.     handleSetScore(msg.arg1);  
  8.     break;  
  9.   }  
  10. }  
  11.   
  12. private void handleSetScore(int score) {  
  13.   mScore = score;  
  14.   evalRequests();  
  15. }  
  16.   
  17. private void evalRequests() {  
  18.   for (int i = 0; i < mNetworkRequests.size(); i++) {  
  19.     NetworkRequestInfo n = mNetworkRequests.valueAt(i);  
  20.     evalRequest(n);  
  21.   }  
  22. }  
  23.   
  24. private void evalRequest(NetworkRequestInfo n) {  
  25.   needNetworkFor(n.request, n.score);  
  26. }  
  27.   
  28. protected void needNetworkFor(NetworkRequest networkRequest, int score) {  
  29.   if (++mRefCount == 1) startNetwork();  
  30. }  
frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetNetworkFactory.java
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. private class LocalNetworkFactory extends NetworkFactory {  
  2.   LocalNetworkFactory(String name, Context context, Looper looper) {  
  3.     super(looper, context, name, new NetworkCapabilities());  
  4.   }  
  5.   protected void startNetwork() {  
  6.     onRequestNetwork();  
  7.   }  
  8.   protected void stopNetwork() {  
  9.   }  
  10. }  
  11.   
  12. public void onRequestNetwork() {  
  13.   Thread dhcpThread = new Thread(new Runnable() {  
  14.     public void run() {  
  15.       DhcpResults dhcpResults = new DhcpResults(); //DHCP相关  
  16.       if (!NetworkUtils.runDhcp(mIface, dhcpResults)) {  
  17.         /* 
  18.         frameworks/base/core/java/android/net/NetworkUtils.java 
  19.         public native static boolean runDhcp(String interfaceName, DhcpResults dhcpResults); 
  20.         frameworks/base/core/jni/android_net_NetUtils.cp 
  21.         static jboolean android_net_utils_runDhcp(JNIEnv* env, jobject clazz, jstring ifname, jobject info) 
  22.         { 
  23.           return android_net_utils_runDhcpCommon(env, clazz, ifname, info, false); 
  24.         } 
  25.         static jboolean android_net_utils_runDhcpCommon(JNIEnv* env, jobject clazz, jstring ifname, 
  26.         jobject dhcpResults, bool renew) 
  27.         { 
  28.           if (renew) { 
  29.             result = ::dhcp_do_request_renew(nameStr, ipaddr, gateway, &prefixLength, 
  30.                 dns, server, &lease, vendorInfo, domains, mtu); 
  31.           } else { 
  32.              result = ::dhcp_do_request(nameStr, ipaddr, gateway, &prefixLength, 
  33.                 dns, server, &lease, vendorInfo, domains, mtu); 
  34.           } 
  35.         } 
  36.         system/core/libnetutils/dhcp_utils.c 
  37.         见博文:《Android系统DHCP问题》 
  38.         上处DHCP Client和DHCP server(system/bin/dhcpd进程)通过property_get/set 共享内存来共享信息 
  39.         */  
  40.         Log.e(TAG, "DHCP request error:" + NetworkUtils.getDhcpError());  
  41.         // set our score lower than any network could go  
  42.         // so we get dropped.  
  43.         mFactory.setScoreFilter(-1);  
  44.         return;  
  45.       }  
  46.       mNetworkAgent = new NetworkAgent(mFactory.getLooper(), mContext,  
  47.                             NETWORK_TYPE, mNetworkInfo, mNetworkCapabilities, mLinkProperties,  
  48.                             NETWORK_SCORE)  
  49.     }  
  50.   });  
  51.   dhcpThread.start();  
  52. }  

三、项目问题

应用程序调用关键API

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public void updateDevInfo(EthernetDevInfo info);  

配置完成以后ConnectivityService向EthernetManager发送CONNECTIVITY_ACTION_IMMEDIATE的广播;EthernetManager接收到该广播以后向应用程序发送ETHERNET_INTERFACE_CONF_CHANGED广播。否则;应用程序将TIMEOUT。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public static final String EXTRA_ETHERNET_STATE = "ETHERNET_state";  
  2. public static final String ETHERNET_INTERFACE_CONF_CHANGED =  
  3.                             "android.net.ethernet.ETHERNET_INTERFACE_CONF_CHANGED"//add by tank  
  4. private void sendEthBroadcast(String action, boolean state) {    
  5.   String bootStr = SystemProperties.get("sys.boot_completed");  
  6.   Log.d(TAG, "sendEthBroadcast -->: " + bootStr);  
  7.   if(bootStr.equals("1")) { //boot complete  
  8.     Intent intent = new Intent(action);  
  9.     intent.putExtra(EXTRA_ETHERNET_STATE, state);  
  10.   
  11.     Log.d(TAG, "sendEthBroadcast --> action= " + action + " state=" + state);  
  12.     mContext.sendBroadcast(intent);  
  13.   }  
  14. }  
  15. //连接成功调用如下:  
  16. sendEthBroadcast(ETHERNET_INTERFACE_CONF_CHANGED, true);  
  17. //连接失败调用如下:  
  18. sendEthBroadcast(ETHERNET_INTERFACE_CONF_CHANGED, false);  

1.手动配置IP后子网掩码错误,以及子网掩码在应用不显示问题

原因:向上层应用提供信息有误

2.手动配置IP提示网关错误,以及网关获取错误问题

原因:同上

3.自动获取IP地址速度慢

原因:应用程序在等待ConnectivityService的广播通过EthernetManager发送的广播

1 0
原创粉丝点击