背景

Android kitkat 默认已经支持 Ethernet 有线网络,只要稍微配置,便可以直接使用,测试结果,网络浏览器和下载都没有没有问题,而且系统可以做到与 wifi 共存,互相不影响功能,这里简单介绍如何使能 Ethernet,并简要分析其代码和流程。

Linux 配置部分

Linux 需要能够支持有线网络,生成 eth 网络设备节点。

Android 配置

overlay

主要是 overlay 里面添加 Ethernet 网络类型支持:  frameworks/base/core/res/res/values/config.xml 
  1. <string-array translatable="false" name="radioAttributes">
  2. <item>"1,1"</item>
  3. <item>"7,1"</item>
  4. <item>"9,1"</item>
  5. </string-array>

其中 9 对应 Ethernet 的网络类型,其定义在 ConnectivityManager.java 中

  1. /**
  2. * The Ethernet data connection.  When active, all data traffic
  3. * will use this network type's interface by default
  4. * (it has a default route).
  5. */
  6. public static final int TYPE_ETHERNET    = 9;

init.<board>.rc

init 里面需要添加 dhcp 和 ip renew 服务
  1. # DHCPCD
  2. # # eth0
  3. service dhcpcd_eth0 /system/bin/dhcpcd -ABKL
  4. class main
  5. disabled
  6. oneshot
  7. # IP Renew
  8. # # eth0
  9. service iprenew_eth0 /system/bin/dhcpcd -n
  10. class main
  11. disabled
  12. oneshot

流程分析

ConnectivityService

ConnectivityService 的构造函数里面将会读取 radioAttributes 里面的网络配置
  1. public ConnectivityService(Context context, INetworkManagementService netManager,
  2. INetworkStatsService statsService, INetworkPolicyManager policyManager,
  3. NetworkFactory netFactory) {
  4. if (DBG) log("ConnectivityService starting up");
  1. // Load device network attributes from resources
  2. String[] raStrings = context.getResources().getStringArray(
  3. com.android.internal.R.array.radioAttributes);
  4. for (String raString : raStrings) {
  5. RadioAttributes r = new RadioAttributes(raString);
  6. if (VDBG) log("raString=" + raString + " r=" + r);
  7. if (r.mType > ConnectivityManager.MAX_RADIO_TYPE) {
  8. loge("Error in radioAttributes - ignoring attempt to define type " + r.mType);
  9. continue;
  10. }
  11. if (mRadioAttributes[r.mType] != null) {
  12. loge("Error in radioAttributes - ignoring attempt to redefine type " +
  13. r.mType);
  14. continue;
  15. }
  16. mRadioAttributes[r.mType] = r;
  17. }

根据网络配置数据,将会创建 EthernetDataTracker , 并开始监听 startMonitoring

  1. // Create and start trackers for hard-coded networks
  2. for (int targetNetworkType : mPriorityList) {
  3. final NetworkConfig config = mNetConfigs[targetNetworkType];
  4. final NetworkStateTracker tracker;
  5. try {
  6. tracker = netFactory.createTracker(targetNetworkType, config);
  7. mNetTrackers[targetNetworkType] = tracker;
  8. } catch (IllegalArgumentException e) {
  9. Slog.e(TAG, "Problem creating " + getNetworkTypeName(targetNetworkType)
  10. + " tracker: " + e);
  11. continue;
  12. }
  13. tracker.startMonitoring(context, mTrackerHandler);
  14. if (config.isDefault()) {
  15. tracker.reconnect();
  16. }
  17. }

EthernetDataTracker

EthernetDataTracker 将会寻找第一个以 eth 开头的有线网络设备,打开并开始做 dhcp

  1. <!-- Regex of wired ethernet ifaces -->
  2. <string translatable="false" name="config_ethernet_iface_regex">eth\\d</string>
  1. sIfaceMatch = context.getResources().getString(
  2. com.android.internal.R.string.config_ethernet_iface_regex);
  3. try {
  4. final String[] ifaces = mNMService.listInterfaces();
  5. for (String iface : ifaces) {
  6. if (iface.matches(sIfaceMatch)) {
  7. mNMService.setInterfaceUp(iface);
  8. InterfaceConfiguration config = mNMService.getInterfaceConfig(iface);
  9. if (getEthernetCarrierState(iface) == 1) {
  10. mIface = iface;
  11. mLinkUp = true;
  12. mNetworkInfo.setIsAvailable(true);
  13. if (config != null && mHwAddr == null) {
  14. mHwAddr = config.getHardwareAddress();
  15. if (mHwAddr != null) {
  16. mNetworkInfo.setExtraInfo(mHwAddr);
  17. }
  18. }
  19. }
  20. // if a DHCP client had previously been started for this interface, then stop it
  21. NetworkUtils.stopDhcp(iface);
  22. }
  23. }
  24. reconnect();
  25. } catch (RemoteException e) {
  26. Log.e(TAG, "Could not get list of interfaces " + e);
  27. }

DHCP 成功后,通知NetworkManagementService  网路已经连接,这个时候上层应用便可以开始执行网络操作。

  1. mNetworkInfo.setDetailedState(DetailedState.CONNECTED, null, mHwAddr);
  2. Message msg = mCsHandler.obtainMessage(EVENT_STATE_CHANGED, mNetworkInfo);
  3. msg.sendToTarget();

如果有多个网口呢,这个 EthernetDataTracker 显然不能满足要求,必须对其进行扩展。

Android 4.4 Kitkat 使能有线网络 Ethernet相关推荐

  1. android获取网卡ip地址吗,Native.js获取android有线网络IP地址

    刚上手Native.js 请教问题如下: 想通过Native.js 获取Android有线网络IP地址,提示这一行console.log(en.hasMoreElements());报错: Uncau ...

  2. Android 以太网(有线网络)开关和状态的判断

    最近在开发有线网络的一些功能,需要判断网线的状态和开启和关闭网线,查询api最终找到EthernetManager来进行相关开发,只有系统应用才可以调用EthernetManager import a ...

  3. Linux系统有线网络抓包程序

    今天心血来潮,玩一玩linux抓包.思路如下: 1.使用raw socket接收网络数据: 2.先解析以太帧头,得到是IP还是ARP包: 3.再解析IP头,知道是UDP还是TCP: 4.再解析UDP. ...

  4. Android连接管理的评分机制(WIFI,Ethernet,BT,移动数据

    Android可以支持:移动数据网络.WIFI.蓝牙.网线等,这些连接本身都可以独立使用,连接管理通过一个评分机制来实现不同接入方式的选择.具体来说就是,每一种上网方式在初始化时,都向Connecti ...

  5. [Android各版本特性]Android 4.4 Kitkat

    [Android各版本特性]专栏目录: 01. Android API 版本对照表 02. Android 4.4以前版本特性 03. 为什么以Android4.4做分界线 04. Android 4 ...

  6. 没有网线接口的MacBook电脑怎么连接有线网络?USB外置网卡来帮忙

    当使用MacBook或Ultrabook时,网络速度应该得到最大的关注.但是我们都知道,大多数时尚和轻便的便携式设备都没有配备网络接口.有时无线网络可能不可用或有点慢. 所以这里是完美的解决这个问题的 ...

  7. android p2p 连接服务器上,当通过Wi-Fi P2P使用网络服务发现时无法连接到Android设备每个人都可以使用网络服务发现...

    ! 我正在开发一个Android应用程序,允许与附近已安装此应用程序的设备聊天.为了做到这一点,我使用Wi-Fi P2P API和网络服务发现来搜索附近的设备. 我已经编写了用于在服务启动的线程中搜索 ...

  8. 有线网络硬件接口简介

    本篇文章的内容都是有线网络 一. 嵌入式下的网络硬件接口 嵌入式网络硬件分为两部分:MAC 和 PHY 1.SOC 内部没有网络 MAC 外设 SOC 与外部 MAC+PHY 芯片的连接如图: 这种方 ...

  9. Ubuntu16.04有线网络无法连接,原来是网卡的型号和系统中网卡的驱动不匹配

    Ubuntu16.04有线网络无法连接,问题解决,原来是网卡的型号和系统中网卡的驱动不匹配 一假期回来,打开电脑有线网络突然连接不上了,哭.... 参考网址:http://events.jianshu ...

最新文章

  1. Gradle学习系列之十——自定义Plugin(本系列完)
  2. 清空SQL Server数据库日志的SQL语句
  3. APP漏洞自动化扫描专业评测报告
  4. postgresql mysql fdw_PostgreSQL使用MySQL外表(mysql_fdw)
  5. JSP教程(八)—— Servlet实现验证码
  6. Hello Blazor:(1)像ASP.NET WebForm一样写代码
  7. 1634C. OKEA
  8. 从 0 搭建一个工业级推荐系统
  9. python两个基本的库管理工具_Python多版本共存管理工具之pyenv
  10. c++ 栈中如何给string malloc空间_malloc,free,calloc,realloc函数
  11. 如何更改html广告,js 动态改变广告代码DIV的位置_原生JS通过innerHTML改变div位置...
  12. JAVA 文件下载乱码问题解决办法
  13. HTML5 Geolocation(地理定位)用于定位用户的位置。
  14. WebClass实现动态WEB编程之实践篇 (转)
  15. 关于局域网计算机ip地址设置,怎么设置局域网计算机的IP地址
  16. HTML5 实例:旋转同时放大缩小的方块(canvas)
  17. ANC主动降噪蓝牙耳机南A2测评:日常通勤降噪亲民之选!
  18. 主攻文推荐攻守都有系统_坚守最后一道防线
  19. Matlab:拉盖尔-高斯光束杨氏双缝干涉
  20. 基础的概率公式推导-指数分布(离开学校太多年,温习一下)

热门文章

  1. c语言块级作用域_块级作用域问题ES5 ES6
  2. python知识点总结全_【转】Python高级知识点总结
  3. 浏览器的referer是服务器修改的吗,利用浏览器调整http的referer
  4. python3 安装pyinstaller_python3.7 打包(.exe)神器——pyinstaller 安装及用法
  5. 开机启动项_Windows10开机速度:其实手动设置可以更快!
  6. python的全局变量能暂存数据吗_【Python】Python之全局变量
  7. 常用的php函数,PHP常用函数整理(上)
  8. python中常用的序列化模块_使用pickle模块对python对象进行序列化
  9. 数据库查询某一列大写转化小写字母表示_基于MySQL数据库下亿级数据的分库分表...
  10. 【转】自然语言系列学习之表示学习与知识获取(五)融合文本和知识,利用cnn方法进行关系抽取