在网上在网上查找ethernet移植相关资料时发现,若要移植的是android-xxx的版本的ethernet,就需要android-x86在xxx版本上的相关源码。但是查看android-x86 4.0版本的源码(目前没找到android-x86 4.0.3版本),发现android-x86 4.0版本中也没包含有ethernet相关代码,故下载了ethernet 补丁文件。
下载地址:http://www.android-x86.org/download
下载: Patch下的ethernet.diff.tar.gz。
把下载的补丁放至linux中解压,用patch命令分别给build、framework、package相关目录打补丁,如:
把frameworks-base.diff放到\frameworks\base下,用命令 patch -p1 <frameworks-base.diff即可打好该目录下的补丁。(注:补丁一定要打全,否则编译很容易报错)
打好补丁后,还要做些修改:
1. 在EthernetStateTracker.java的
public void defaultRouteSet(boolean enabled) {
mDefaultRouteSet.set(enabled);
}后加上下面两个继承接口函数:
@Override
public void setPolicyDataEnable(boolean enabled){
}
@Override
public void setUserDataEnable(boolean arg0) {
// TODO Auto-generated method stub
}
2. system\core\libnetutils\dhcp_utils.c的 dhcp_do_request函数中,把
snprintf(daemon_cmd,sizeof(daemon_cmd),"%s","dhcpcd_wlan0");改成
snprintf(daemon_cmd,sizeof(daemon_cmd),"%s","dhcpcd_eth0");
编译源码,期间会提示有提示要 make-update api,执行后即可。到此,即可通过setting界面自动获取IP连接上ethernet。
目前分析理解:
EthernetManager:以太网配置的Android API接口,可通过getSystemService接口获取
NetWorkStateTracker: 每种网络都有各自NetWorkStateTracker的子类, 来负责以太网状态的监听, ConnectivityService统一管理它们。
EthernetService:负责配置信息的保存和读取
EthernetStateTracker:继承NetWorkStateTracker, 负责以太网状态的监听和配置
系统启动时EthernetStateTracker就会创建EthernetMonitor线程来监听网络状态信息, 监听的通过jni调用c代码完成的, 原理就是监听NetLink Socket, 网络连接或断开时这个socket端口就会接收到信息。当有网线连接上时,EthernetMonitor线程就会给EthernetStateTracker发送EVENT_HW_PHYCONNECT消息, EthernetStateTracker读取配置信息, 由于我们在Settings设置为DHCP, 就会通过DhcpHandle给DhcpThread发送EVENT_DHCP_START信息, DhcpThread就会运行NetUtil.runDhcp()来自动获取网络地址。接下来EthernetMonitor线程又会收到网络已通的消息, 并通过EVENT_HW_CONNECTED通知EthernetStateTracker EthernetStateTracker接着会发送EVENT_STATE_CHANGED消息给ConnectivityService。