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

相关文章

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

springboot启动流程过程

《springboot启动流程过程》SpringBoot简化了Spring框架的使用,通过创建`SpringApplication`对象,判断应用类型并设置初始化器和监听器,在`run`方法中,读取配... 目录springboot启动流程springboot程序启动入口1.创建SpringApplicat

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

MySQL的cpu使用率100%的问题排查流程

《MySQL的cpu使用率100%的问题排查流程》线上mysql服务器经常性出现cpu使用率100%的告警,因此本文整理一下排查该问题的常规流程,文中通过代码示例讲解的非常详细,对大家的学习或工作有一... 目录1. 确认CPU占用来源2. 实时分析mysql活动3. 分析慢查询与执行计划4. 检查索引与表

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一