Android以太网开关流程分析

本文详细分析了Android系统中开启和关闭以太网的流程,从APP调用EthernetManager的setEthernetEnabled接口开始,经由system_server进程,深入到NetworkManagementService和Netd服务,最终通过ioctl操作与kernel交互,实现以太网的启用和禁用。文章还介绍了NetworkManagementService如何通过Binder服务与Netd通信,以及Netd如何获取和设置InterfaceConfiguration。
Android以太网开关流程分析

一、引言

  在Android 以太网服务启动流程中我们启动了EthernetService(ES),NetworkManagementService(NMS)等服务,其中ES作为Binder的服务端,向客户端EthernetManger提供了调用接口的引用。因此,应用可以通过EthernetManger来访问以太网的相关接口。本篇文章将从APP调用以太网的使能和关闭的接口流程作为切入点来分析,以太网框架中,上层app是如何将指令传递到底层。图1-1所示为以太网使能和关闭流程图
在这里插入图片描述

图1-1 以太网使能和关闭流程图

二、以太网使能流程

2.1 app端调用以太网的使能接口

  应用端调用以外网使能的接口是setEthernetEnabled,具体调用过如下:

import android.net.EthernetManager;
EthernetManager et;
//获取ethernet的Binder引用端
et = (EthernetManager)getSystemService("ethernet");
//调用setEthernetEnabled使能以太网
et.setEthernetEnabled("eth0", true);

  App端实现很简单,是Android 通常获取Binder通信过程,主要完成以下任务:

  • 获取以太网的Binder服务的引用,以便调用其使能接口;
  • 调用setEthernetEnabled接口来使能以外网

2.2 system_server进程的调用流程

App端调用setEthernetEnabled接口来使能以外网,具体代码如下:

//frameworks/base/core/java/android/net/EthernetManager.java 
public boolean setEthernetEnabled(String iface, boolean enabled) {
   
   
    Log.d(TAG,enabled ? "turn on Ethernet" : "turn off Ethernet");
    try {
   
   
        return mService.setEthernetEnabled(iface, enabled);
    } catch (RemoteException e) {
   
   
        return false;
    }
}

  其实调用很简单,直接调用服务端的setEthernetEnabled接口,需要注意的是,这里传入的iface为Hal层创建interface名称,以太网是eth0,enabled是true表示使能以太网,否则表示关闭以太网。下面我们直捣黄龙直接看服务端的setEthernetEnabled这个接口的实现。

//frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetServiceImpl.java
public class EthernetServiceImpl extends IEthernetManager.Stub {
   
   
    //以太网服务的核心
    private EthernetTracker mTracker;
    public boolean setEthernetEnabled(String iface, boolean enable) {
   
   
       //enforceChangePermission();
       Log.i(TAG,"setEthernetEnabled() : enable="+enable);
      return mTracker.setEthernetEnabled(iface, enable);
    }
}

由Android 以太网服务启动流程我们可以知道EthernetTracker是以太网服务的核心,其能保存NetworkManagementService的引用对象,从而间接和Netd进行通信,下面我们直接看EthernetTracker中的setEthernetEnabled接口。

final class EthernetTracker {
   
    
    private final INetworkManagementService mNMService;
     EthernetTracker(Context context, Handler handler) {
   
   
         IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
         mNMService = INetworkManagementService
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GitFranc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值