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

 

Android5.0以太网流程源码情景分析   点击打开链接

2015-03-23 09:34 3862人阅读 评论(0) 收藏 举报

 分类:

 

移动操作系统之Android(103) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

 

[plain] view plain copy  在CODE上查看代码片派生到我的代码片

  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 plain copy  在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 plain copy  在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 plain copy  在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 plain copy  在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 plain copy  在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 plain copy  在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 plain copy  在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 plain copy  在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 plain copy  在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 plain copy  在CODE上查看代码片派生到我的代码片

  1. public void updateDevInfo(EthernetDevInfo info);  

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

[java] view plain copy  在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的广播通过EthernetM

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值