Android网络架构简介

Posted by Jeff's Lab on January 24, 2021

一、 整体架构:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述




二、 WLAN驱动加载:

在这里插入图片描述

驱动源码目录:

在这里插入图片描述 在这里插入图片描述




三、 启动WPA_SUPPLICANT :

wpa_supplicant是一个连接、配置WIFI的工具

源码位置

在这里插入图片描述

服务声明部分:

device/qcom/common/rootdir/etc/init.qcom.rc 在这里插入图片描述 注意这个服务一开始是disable的

wpa_supplicant的启动是通过属性控制服务的启动: 在这里插入图片描述

这样wpa_supplicant就被启动了,可以用来控制wlan




四、 WIFI搜索:

在这里插入图片描述

在这里插入图片描述 在这里插入图片描述

P2P搜索过程

在这里插入图片描述




五、 DHCP :

Android8之前版本:

在这里插入图片描述

Android8之后版本

在这里插入图片描述




六、 DNS :

常用的域名解析函数

gethostbyname()

getaddrinfo()

Android中不管是在java中还是C中去解析域名不是直接连到域名服务器去查询的。 在这里插入图片描述



源码部分:


LIBC部分



在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述






NETD部分


netd目录

netd目录

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述




七、 关于eBPF:

eBPF 简介

扩展型柏克莱封包过滤器 (eBPF) 是一个内核中的虚拟机,可运行用户提供的 eBPF 程序。这些程序可以挂接到内核中的探测点或事件、收集有用的统计信息,并将结果存储在多种数据结构中。程序通过 bpf(2) 系统调用加载到内核中,并作为 eBPF 机器指令的二进制 blob 由用户提供。Android 构建系统支持使用下文所述的简单构建文件语法将 C 程序编译为 eBPF 程序。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


ConnectivityManager.java用来管理网络接口

 public Network getActiveNetwork() {
        try {
            return mService.getActiveNetwork(); //--> getDefaultNetwork();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }
    
    public Network[] getAllNetworks() {
        enforceAccessPermission();
        synchronized (mNetworkForNetId) {
            final Network[] result = new Network[mNetworkForNetId.size()];
            for (int i = 0; i < mNetworkForNetId.size(); i++) {
                result[i] = mNetworkForNetId.valueAt(i).network;
            }
            return result;
        }
    }
    
    //Network.java
    createSocket()
    connectToHost()
    openConnection()
    .....