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

2024-02-17 08:32

本文主要是介绍Android5.0以太网流程源码情景分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://blog.csdn.net/tankai19880619/article/details/44559419

一、启动流程

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的广播通过EthernetManager发送的广播



这篇关于Android5.0以太网流程源码情景分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/717229

相关文章

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

Ubuntu 24.04启用root图形登录的操作流程

《Ubuntu24.04启用root图形登录的操作流程》Ubuntu默认禁用root账户的图形与SSH登录,这是为了安全,但在某些场景你可能需要直接用root登录GNOME桌面,本文以Ubuntu2... 目录一、前言二、准备工作三、设置 root 密码四、启用图形界面 root 登录1. 修改 GDM 配

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重