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

相关文章

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

Spring中Bean有关NullPointerException异常的原因分析

《Spring中Bean有关NullPointerException异常的原因分析》在Spring中使用@Autowired注解注入的bean不能在静态上下文中访问,否则会导致NullPointerE... 目录Spring中Bean有关NullPointerException异常的原因问题描述解决方案总结

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

python-nmap实现python利用nmap进行扫描分析

《python-nmap实现python利用nmap进行扫描分析》Nmap是一个非常用的网络/端口扫描工具,如果想将nmap集成进你的工具里,可以使用python-nmap这个python库,它提供了... 目录前言python-nmap的基本使用PortScanner扫描PortScannerAsync异

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S

Nginx、Tomcat等项目部署问题以及解决流程

《Nginx、Tomcat等项目部署问题以及解决流程》本文总结了项目部署中常见的four类问题及其解决方法:Nginx未按预期显示结果、端口未开启、日志分析的重要性以及开发环境与生产环境运行结果不一致... 目录前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指