android ethernet 框架,Android Ethernet从上至下解析一

Android Ethernet从上至下解析一

浏览次数:

发布时间:2015-08-30 14:14

最近遇到不少框架问题,比如关于网口的,开机后拔掉有线网,状态栏和设置项中有线网显示图标不会更新,还有双网口的需求,下面就带着这个问题,以跟踪网络状态问题为引线,本篇将贯穿分析Ethernet从上至下的框架结构。因能力和时间有限,文中有分析不到位的地方,十分欢迎大侠们拍砖。

首先看下应用层网络监听相关的app 网络监听一:设置 packages/apps/Settings/src/com/android/settings/ethernet/EthernetEnabler.java

设置项网络按钮类定义

网络监听二:statusbar frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java

NetworkController本身是个BroadcastReceiver,其中关于网络状态变化的监听消息为EthernetManager.NETWORK_STATE_CHANGED_ACTION,可以猜测这个消息是framework发出来的,往下看。

网络服务框架层 通过整理,网络框架管理器和服务相关代码和基本解释如下: frameworks/base/ethernet/java/com/android/internal/ethernet/

EthernetStateMachine.java

-> 网络状态机,用于管理网络状态变化及动作逻辑

EthernetManager.java

-> 网络管理器,是app和EthernetService信息交互的桥梁

EthernetInfo.java

-> 网络状态参数类,是Parcelable的一个实现

EthernetInfo.aidl

-> aidl文件,Manager和service统一使用的数据结构

IEthernetManager.aidl

-> aidl文件,用于Manager和service通信

在此可以发现网络状态机也在监听NETWORK_STATE_CHANGED_ACTION广播,广播发送者不再这里,那应该就是在service那了,继续往下。 frameworks/base/services/java/com/android/server/EthernetService.java

private class InterfaceStateReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals(EthernetManager.INTERFACE_STATE_CHANGED_ACTION)) {

...

Intent newIntent = new Intent(EthernetManager.NETWORK_STATE_CHANGED_ACTION);

newIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);

newIntent.putExtra(EthernetManager.EXTRA_ETHERNET_INFO, ei);

在service中,可以看到发送NETWORK_STATE_CHANGED_ACTION的发送动作,而这个发送行为还不是底层上报的状态直接启动的,而是上面说的网络状态机,它发送的INTERFACE_STATE_CHANGED_ACTION广播信息,怎么源头又跑上面去了?有些人可能并不理解为什么在framework里面要把一个简单的事件广播要这么来回的发送,等明白了网络状态机的作用,就知道这些过程的逻辑性了。

我们知道statemachine的特点是有一个rootstate,然后向下由多个state发展而成一个树状结构,state之间的转换会伴随着enter(),processMessage()等动作。EthernetStateMachine的状态初始化如下:

addState(mRootState);

addState(mIdleState, mRootState);

//addState(mObtainingLinkState, mRootState);

addState(mObtainingIpState, mRootState);

addState(mIPConnectedState, mRootState);

addState(mDisconnectingState, mRootState);

接着前面说到的INTERFACE_STATE_CHANGED_ACTION广播继续来看下状态机中的逻辑。 在ethernetstatemachine中,state状态的变化控制着网络状态的广播通知,部分代码如下:

private void sendInterfaceStateChangedBroadcast() {

if (DBG) Slog.d(TAG, Sending INTERFACE_STATE_CHANGED_ACTION for

+ mEthernetInfo.getName());

Intent intent = new Intent(EthernetM

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值