Android 以太网服务启动流程

本文详细解析了Android系统中以太网服务的启动流程,从EthernetService的角度出发,介绍了服务启动、NF与CS通道建立以及ENF与CS之间的通信。涉及关键组件如EthernetTracker、NetworkFactory、NetworkManagementService和ConnectivityService,分析了它们如何通过AsyncChannel实现跨进程通信和网络状态管理。
摘要由CSDN通过智能技术生成

一、引言
  阅读本文需要对Android系统的启动流程有一定的了解。如果读者还没有这方面的知识,建议大家先了解一下这方面的知识,鄙人后面也会专门做相关系列文章。这里先大概简单阐述一下(这里我们重点关注init以上的进程服务),方便阅读本文章。Android 在kernel内核启动后会加载启动Init进程,在Init进程中启动各种服务,包括显示系统的SurfaceFlinger,音频系统AudioFlinger,网络守护进程Netd等等,其中最重要一个进程是system_server进程,其是所有Framework层级系统服务的发动机。Init启动system_server后,会进入system_server的主方法,并且在主方法中调用startOtherService方法启动非关键的一些服务,而我们以太网服务就是从该方法启动。图1-1所示是以太网服务启动的整体流程。下面我们将具体分析各个服务的启动以及相互之间作用关系。


图1-1 Android以太网服务启动流程
名称解释:

ENF:EthernetNetworkFactory;

ES:EthernetService

ESI:EthernetServiceImpl

CS:ConnectivityService

NMS:NetworkManagementService

NF:NetworkFactory

二 以太网服务的启动流程
2.1 ES的角度分析以太网服务的启动
2.1.1 ES的启动流程
  根据前面的分析及图1-1的流程图,我们知道EthernetService是在SystemServer的startOtherService的方法中启动,下面我们来具体分析一下启动流程。

//framework/base/services/java/com/android/server/SystemServer.java
public final class SystemServer {
    private static final String ETHERNET_SERVICE_CLASS =  
        "com.android.server.ethernet.EthernetService";
    //Init进程启动System_Server,进入SystemServer的主方法
    public static void main(String[] args) {
        new SystemServer().run();
    }
    private void run() {
        startOtherService()
    }
    private void startOtherServices() {
        //Feature特性,具体定义在Android源码的frameworks/native/data/etc/下
        if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_ETHERNET) ||    
          mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)) {
             traceBeginAndSlog("StartEthernet");
             mSystemServiceManager.startService(ETHERNET_SERVICE_CLASS);
             traceEnd();
         }
    }
}



这里是通过SystemServiceManager的方式启动ES服务的,这里就不详细介绍。这里在启动ES的时候使用了Feature控制,具体定义在Android源码/frameworks/native/data/etc/下。

<!--frameworks/native/data/etc-->
android.hardware.ethernet.xml
<permissions>
    <feature name="android.hardware.ethernet" />
</permissions>



在设备中的位置是在/vendor/etc/permissions/,该目录保存了大部分厂商的配置的文件:

DTEN:/ # ls -l ./vendor/etc/permissions/
total 80
-rw-r--r-- 1 root root  820 2009-01-01 08:00 android.hardware.bluetooth.xml
-rw-r--r-- 1 root root  830 2009-01-01 08:00 android.hardware.bluetooth_le.xml
-rw-r--r-- 1 root root  877 2009-01-01 08:00 android.hardware.camera.front.xml
-rw-r--r-- 1 root root  877 2009-01-01 08:00 android.hardware.camera.xml
-rw-r--r-- 1 root root  834 2009-01-01 08:00 android.hardware.ethernet.xml
-rw-r--r-- 1 root root  870 2009-01-01 08:00 android.hardware.opengles.aep.xml
-rw-r--r-- 1 root root  824 2009-01-01 08:00 android.hardware.sensor.accelerometer.xml
-rw-r--r-- 1 root root 1035 2009-01-01 08:00 android.hardware.touchscreen.multitouch.xml
-rw-r--r-- 1 root root  845 2009-01-01 08:00 android.hardware.usb.accessory.xml
-rw-r--r-- 1 root root  868 2009-01-01 08:00 android.hardware.usb.host.xml
-rw-r--r-- 1 root root  904 2009-01-01 08:00 android.hardware.vulkan.version.xml
-rw-r--r-- 1 root root  843 2009-01-01 08:00 android.hardware.wifi.direct.xml
-rw-r--r-- 1 root root  845 2009-01-01 08:00 android.hardware.wifi.passpoint.xml
-rw-r--r-- 1 root root  829 2009-01-01 08:00 android.hardware.wifi.xml
-rw-r--r-- 1 root root  747 2009-01-01 08:00 android.software.backup.xml
-rw-r--r-- 1 root root  875 2009-01-01 08:00 android.software.ipsec_tunnels.xml
-rw-r--r-- 1 root root  745 2009-01-01 08:00 android.software.midi.xml
-rw-r--r-- 1 root root  753 2009-01-01 08:00 android.software.verified_boot.xml
-rw-r--r-- 1 root root 1093 2009-01-01 08:00 sensor_feature.xml
-rw-r--r-- 1 root root 2555 2009-01-01 08:00 tablet_core_hardware.xml


  设备在系统开机过程中会读取/vendor/etc/permissions/目录下对应的配置文件,然后在SystemServer中启动相关服务的时候会通过该配置文件进行匹配,依此来决定是否启动相关服务,正如我们ES一样。我们平时系统服务裁剪,就可以通过配置Feature的方式决定是否启动对应的服务。

  下面我们具体看下ES的启动流程:

//frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetService.java
public final class EthernetService extends SystemService {            

    private static final String TAG = "EthernetService";
    //这里是以太网服务的真正核心实现
    final EthernetServiceImpl mImpl;
    public EthernetService(Context context) {                         
        super(context); 
        //初始化EthernetServiceImpl服务
        mImpl = new EthernetServiceImpl(context);
    }
                                                                      
    @Override                                                         
    public void onStart() {
        Log.i(TAG, "Registering service " + Context.ETHERNET_SERVICE);
        publishBinderService(Context.ETHERNET_SERVICE, mImpl);
    }

    @Override                                                         
    public void onBootPhase(int phase) {
        //在系统SYSTEM_SERVICES_READY阶段,调用EthernetServiceImpl服务的start方法
        if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
            mImpl.start();
        }
    }
}                                                                     


  ES服务并不复杂,真正起作用的是ESImpl服务。在EthernetService服务的构造方法中创建了ESI对象。该对象在ES的onStart方法中通过publishBinderService将其注册到SystemManager中以供客户端使用。至此用户就可以通过对外暴露接口来使用以太网的服务了。然后在系统SYSTEM_SERVICES_READY阶段,调用ESI服务的start方法进行初始化的工作。而ESImpl又委托给EthernetTracker来完成以太网的具体工作。

//frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetServiceImp.java
public class EthernetServiceImpl extends IEthernetManager.Stub { 
    private static final String TAG = "EthernetServiceImpl";
    private EthernetTracker mTracker;
    
    public void start() {
       Log.i(TAG, "Starting Ethernet service");
       HandlerThread handlerThread = new HandlerThread("EthernetServiceThread");
       handlerThread.start();
       mHandler = new Handler(handlerThread.getLooper());
       //创建EthernetTracker对象,注意此时的mHandler的looper,后面ENS和CS之间的通信会用的着
       mTracker = new EthernetTracker(mContext, mHandler);
       mTracker.start();            
    }
}



  该构造方法比较简单,主要创建一个EthernetTracker这个对象。该类是以太网络连接的管理对象,Android 以太网框架源码分析启动篇正如中介绍一样,该对象在以太网服务中扮演着重要角色。EthernetTracker可以持有NMS对象mNMService,通过mNMService可以访问到Netd的接口。另外mFactory对象又可以和CS进行相互通信。因此,该对象是整个以太网的中枢所在。

//frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetTracker.java
final class EthernetTracker {
    //NMS对象,通过该对象访问Netd的相关接口
    private final INetworkManagementService mNMService;
    private final Handler mHandler;
    //主要更新网络连接状,链路配置,网络能力给ConnectivityService,同时接受来自ConnectivityService
    //禁止自动连接,网络有效性等信息
    private final EthernetNetworkFactory mFactory;
    //存储以太网配置信息,
    private final EthernetConfigStore mConfigStore;
    
    EthernetTracker(Context context, Handler handler) {
       // The services we 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android系统是一个流行的移动操作系统,支持无线网络连接的设备非常普遍。然而,有时候用户可能希望使用有线以太网连接,以获得更稳定和快速的网络连接。那么,在Android系统中,有线以太网是如何与DownloadManager一起使用的呢? 首先,需要了解DownloadManager是什么。DownloadManager是Android系统提供的一个系统服务,用于处理网络下载任务。它可用于在后台异步下载各种文件,并提供了管理、监控和操作下载任务的功能。 要使用有线以太网连接与DownloadManager一起下载文件,首先要确保设备支持有线以太网连接功能。通常情况下,设备上会有一个USB Type-C或Ethernet接口,用于连接有线以太网适配器。通过将有线以太网适配器插入设备的接口上,并确保设置中启用了有线以太网选项,就可以实现有线以太网连接。 一旦设备与有线以太网连接成功,就可以使用DownloadManager来执行下载任务了。首先,需要创建一个DownloadManager.Request对象,并设置要下载的文件的URL、保存文件的目录路径、显示通知栏的标题等相关参数。然后,使用DownloadManager.enqueue()方法将请求加入下载队列,并返回一个下载任务的唯一ID。 下载任务加入队列后,DownloadManager会自动处理下载任务,包括断点续传、网络异常处理等。可以通过查询DownloadManager查询下载任务的状态,以及监听下载任务的进度和完成状态。 总之,Android系统支持有线以太网连接与DownloadManager一起使用,以实现稳定和快速的文件下载。通过连接有线以太网适配器,创建DownloadManager.Request对象,并加入下载队列,就可以轻松地进行有线以太网下载任务的管理和操作。 ### 回答2: Android的DownloadManager类提供了一种方便的方式来通过有线以太网连接下载文件。有线以太网连接通常提供了更快的下载速度和更稳定的网络连接,而DownloadManager则是Android系统中的一个强大的下载管理器。 要使用有线以太网下载,首先需要确保设备连接到一个可用的有线以太网网络。然后,可以通过以下步骤使用DownloadManager进行下载: 1. 创建一个DownloadManager实例: DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 2. 创建一个DownloadManager.Request对象来描述下载请求: DownloadManager.Request request = new DownloadManager.Request(Uri.parse("下载链接")); // 设置一些下载请求的参数,例如设置保存文件的路径、显示通知等 3. 将下载请求添加到下载队列中: long downloadId = downloadManager.enqueue(request); 4. 可以使用下载ID来查询下载状态或管理下载任务: DownloadManager.Query query = new DownloadManager.Query(); query.setFilterById(downloadId); // 执行查询并获取下载任务的信息 Cursor cursor = downloadManager.query(query); // 根据需要处理下载任务的状态、进度等信息 5. 在下载完成后,可以通过监听下载完成的广播或查询下载状态来获取下载的文件路径等信息: String filePath = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); 通过上述步骤,我们可以在Android设备上使用有线以太网连接来下载文件。有线以太网相较于其他网络连接方式,可以提供更快速、稳定的下载体验,并且DownloadManager类可以帮助我们方便地管理和监控下载过程。 ### 回答3: Android的有线以太网DownloadManager是一个功能强大的下载管理器,它可以帮助用户在使用有线以太网连接时更有效地下载文件。 首先,有线以太网可以提供更稳定和快速的网络连接,相较于无线网络,它更适合下载大型文件和高速数据传输。有了有线以太网DownloadManager,用户可以更好地利用这种连接优势。 该下载管理器为用户提供了直观和简单的用户界面,用户只需点击链接或输入下载地址,便可将文件添加到下载队列中。用户可以随时暂停、恢复或取消下载过程,而不会中断其他正在进行的下载任务。这种灵活性使得用户能够更好地控制文件的下载进程。 有线以太网DownloadManager还支持多线程下载,这意味着它可以同时下载一个文件的不同部分,从而提高下载速度。此外,它利用了文件分片技术,将大文件分割成多个较小的块进行下载,从而提高整体下载效率。 另一个重要的功能是断点续传。如果下载过程中网络连接中断,用户只需重新连接到有线以太网并重新启动下载管理器,该管理器将自动检测到未完成的下载并继续下载。这样,用户不必重新下载整个文件,节省了时间和网络资源。 总之,Android的有线以太网DownloadManager为用户提供了更快速、稳定和灵活的下载体验。它利用有线以太网的网络连接和多线程下载技术,使用户能够更高效地下载大文件。此外,它还支持断点续传,确保用户可以在中断的情况下无缝恢复下载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值