今天主要分析下Tethering.java这个文件:
这边netd和NetworkManagerService简单说下,详细分析后续会有。netd,NetworkManagerService和vold,MountService很相似。
当我们插上usb的时候,netd会接受kernel的uevent事件:
void NetlinkHandler::onEvent(NetlinkEvent *evt) { const char *subsys = evt->getSubsystem(); if (!subsys) { ALOGW("No subsystem found in netlink event"); return; } if (!strcmp(subsys, "net")) { int action = evt->getAction(); const char *iface = evt->findParam("INTERFACE"); if (action == evt->NlActionAdd) { notifyInterfaceAdded(iface);//有网络设备增加 } else if (action == evt->NlActionRemove) { notifyInterfaceRemoved(iface);
notifyInterfaceAdded函数
void NetlinkHandler::notifyInterfaceAdded(const char *name) { notify(ResponseCode::InterfaceChange, "Iface added %s", name); }
notify往上层发消息
void NetlinkHandler::notify(int code, const char *format, ...) { char *msg; va_list args; va_start(args, format); if (vasprintf(&msg, format, args) >= 0) { mNm->getBroadcaster()->sendBroadcast(code, msg, false); free(msg); } else { SLOGE("Failed to send notification: vasprintf: %s", strerror(errno)); } va_end(args); }
NetworkManagerService的onEvent函数
public boolean onEvent(int code, String raw, String[] cooked) { String errorMessage = String.format("Invalid event from daemon (%s)", raw); switch (code) { case NetdResponseCode.InterfaceChange: /* * a network interface change occured * Format: "NNN Iface added <name>" * "NNN Iface removed <name>" * "NNN Iface changed <name> <up/down>" * "NNN Iface linkstatus <name> <up/down>" */ if (cooked.length < 4 || !cooked[1].equals("Iface")) { throw new IllegalStateException(errorMessage); } if (cooked[2].equals("added")) { notifyInterfaceAdded(cooked[3]);//处理网络设备的增加 return true; }
private void notifyInterfaceAdded(String iface) { final int length = mObservers.beginBroadcast(); try { for (int i = 0; i < length; i++) { try { mObservers.getBroadcastItem(i).interfaceAdded(iface); } catch (RemoteException e) { } catch (RuntimeException e) { } } } finally { mObservers.finishBroadcast(); } }
这样就到Tethering.java文件的interfaceAdded函数,其中mobservers的注册,是在ConnectivityService中注册的。
接下来看下Tethering.java文件的interfaceAdded函数:
public void interfaceAdded(String iface) { if (VDBG) Log.d(TAG, "interfaceAdded " + iface); boolean found = false; boolean usb = false; synchronized (mPublicSync) { if (isWifi(iface)) { found = true; } if (isUsb(iface)) {//先判断是否是usb,下面分析这个函数 found = true; usb = true; } if (isBluetooth(iface)) { found = true; } if (found == false) { if (VDBG) Log.d(TAG, iface + " is not a tetherable iface, ignoring"); return; } TetherInterfaceSM sm = mIfaces.get(iface);//如果已经存在,直接退出 if (sm != null) { if (VDBG) Log.d(TAG, "active iface (" + iface + ") reported as added, ignoring"); return; } sm = new TetherInterfaceSM(iface, mLooper, usb); mIfaces.put(iface, sm);//新建一个TetherInterfaceSM,放在hashmap中 sm.start();//开启 } }
再来看看isUsb函数
private boolean isUsb(String iface) { synchronized (mPublicSync) { for (String regex : mTetherableUsbRegexs) {//看看mTetherableUsbRegexs有没有和该iface匹配的,有就认为属于usb if (iface.matches(regex)) return true; } return false; } }
mTetherableUsbRegexs成员变量是在构造函数中调用了updateConfiguration,读取资源文件中的值
void updateConfiguration() { String[] tetherableUsbRegexs = mContext.getResources().getStringArray( com.android.internal.R.array.config_tether_usb_regexs); String[] tetherableWifiRegexs = mContext.getResources().getStringArray( com.android.internal.R.array.config_tether_wifi_regexs); String[] tetherableBluetoothRegexs = mContext.getResources().getStringArray( com.android.internal.R.array.config_tether_bluetooth_regexs); int ifaceTypes[] = mContext.getResources().getIntArray( com.android.internal.R.array.config_tether_upstream_types); Collection<Integer> upstreamIfaceTypes = new ArrayList(); for (int i : ifaceTypes) { upstreamIfaceTypes.add(new Integer(i)); } synchronized (mPublicSync) { mTetherableUsbRegexs = tetherableUsbRegexs; mTetherableWifiRegexs = tetherableWifiRegexs; mTetherableBluetoothRegexs = tetherableBluetoothRegexs; mUpstreamIfaceTypes = upstreamIfaceTypes; } // check if the upstream type list needs to be modified due to secure-settings checkDunRequired(); }
usb资源文件对应如下:
<string-array translatable="false" name="config_tether_usb_regexs"> <item>"rndis0"</item> </string-array>
接下来继续看interfaceAdded函数新建了一个TetherInterfaceSM对象,然后调用其start函数。下面就分析下这个类,
先来看下构造函数:
TetherInterfaceSM(String name, Looper looper, boolean usb) { super(name, looper); mIfaceName = name; mUsb = usb; setLastError(ConnectivityManager.TETHER_ERROR_NO_ERROR); mInitialState = new InitialState(); addState(mInitialState); mStartingState = new StartingState(); addState(mStartingState); mTetheredState = new TetheredState(); addState(mTetheredState); mUnavailableState = new UnavailableState(); addState(mUnavailableState); setInitialState(mInitialState); }
addState函数是其父类stateMachine中的函数
protected final void addState(State state) { mSmHandler.addState(state, null); }
private final StateInfo addState(State state, State parent) { if (mDbg) { mSm.log("addStateInternal: E state=" + state.getName() + ",parent=" + ((parent == null) ? "" : parent.getName())); } StateInfo parentStateInfo = null; if (parent != null) { parentStateInfo = mStateInfo.get(parent); if (parentStateInfo == null) { // Recursively add our parent as it's not been added yet. parentStateInfo = addState(parent, null); } } StateInfo stateInfo = mStateInfo.get(state); if (stateInfo == null) { stateInfo = new StateInfo(); mStateInfo.put(state, stateInfo);//放在mStateInfo hashmap中 } // Validate that we aren't adding the same state in two different hierarchies. if ((stateInfo.parentStateInfo != null) && (stateInfo.parentStateInfo != parentStateInfo)) { throw new RuntimeException("state already added"); } stateInfo.state = state; stateInfo.parentStateInfo = parentStateInfo; stateInfo.active = false; if (mDbg) mSm.log("addStateInternal: X stateInfo: " + stateInfo); return stateInfo; }
setInitialState函数
protected final void setInitialState(State initialState) { mSmHandler.setInitialState(initialState); }
private final void setInitialState(State initialState) { if (mDbg) mSm.log("setInitialState: initialState=" + initialState.getName()); mInitialState = initialState; }
看看mInitialState 变量都有谁在用
setupInitialStateStack使用了,而setupInitialStateStack只有在completeConstruction函数中使用了,而这个函数又只有在start中调用了。下面正好我们要分析这函数
public void start() { // mSmHandler can be null if the state machine has quit. SmHandler smh = mSmHandler; if (smh == null) return; /** Send the complete construction message */ smh.completeConstruction(); }
下面看下completeConstruction函数
private final void completeConstruction() { if (mDbg) mSm.log("completeConstruction: E"); /** * Determine the maximum depth of the state hierarchy * so we can allocate the state stacks. */ int maxDepth = 0; for (StateInfo si : mStateInfo.values()) { int depth = 0; for (StateInfo i = si; i != null; depth++) { i = i.parentStateInfo; } if (maxDepth < depth) { maxDepth = depth; } } if (mDbg) mSm.log("completeConstruction: maxDepth=" + maxDepth); mStateStack = new StateInfo[maxDepth]; mTempStateStack = new StateInfo[maxDepth]; setupInitialStateStack(); /** Sending SM_INIT_CMD message to invoke enter methods asynchronously */ sendMessageAtFrontOfQueue(obtainMessage(SM_INIT_CMD, mSmHandlerObj));//发送消息,下面分析 if (mDbg) mSm.log("completeConstruction: X"); }
看下setupInitialStateStack函数,从mStateInfo得到mInitialState的stateinfo
private final void setupInitialStateStack() { if (mDbg) { mSm.log("setupInitialStateStack: E mInitialState=" + mInitialState.getName()); } StateInfo curStateInfo = mStateInfo.get(mInitialState); for (mTempStateStackCount = 0; curStateInfo != null; mTempStateStackCount++) { mTempStateStack[mTempStateStackCount] = curStateInfo; curStateInfo = curStateInfo.parentStateInfo; } // Empty the StateStack mStateStackTopIndex = -1; moveTempStateStackToStateStack(); }
moveTempStateStackToStateStack函数,将mTempStateStack中转到mStateStack中
private final int moveTempStateStackToStateStack() { int startingIndex = mStateStackTopIndex + 1; int i = mTempStateStackCount - 1; int j = startingIndex; while (i >= 0) { if (mDbg) mSm.log("moveTempStackToStateStack: i=" + i + ",j=" + j); mStateStack[j] = mTempStateStack[i]; j += 1; i -= 1; } mStateStackTopIndex = j - 1; if (mDbg) { mSm.log("moveTempStackToStateStack: X mStateStackTop=" + mStateStackTopIndex + ",startingIndex=" + startingIndex + ",Top=" + mStateStack[mStateStackTopIndex].state.getName()); } return startingIndex; }
再看下在completeConstruction中发送的消息的处理
public final void handleMessage(Message msg) { if (!mHasQuit) { if (mDbg) mSm.log("handleMessage: E msg.what=" + msg.what); /** Save the current message */ mMsg = msg; /** State that processed the message */ State msgProcessedState = null; if (mIsConstructionCompleted) { /** Normal path */ msgProcessedState = processMsg(msg); } else if (!mIsConstructionCompleted && (mMsg.what == SM_INIT_CMD) && (mMsg.obj == mSmHandlerObj)) { /** Initial one time path. */ mIsConstructionCompleted = true;//构造完成 invokeEnterMethods(0);//将第一个state,激活 }
invokeEnterMethods函数
private final void invokeEnterMethods(int stateStackEnteringIndex) { for (int i = stateStackEnteringIndex; i <= mStateStackTopIndex; i++) { if (mDbg) mSm.log("invokeEnterMethods: " + mStateStack[i].state.getName()); mStateStack[i].state.enter();//进入state的enter函数 mStateStack[i].active = true;//状态变为激活 } }
看下InitialState 的enter函数
class InitialState extends State { @Override public void enter() { setAvailable(true);//设置状态 setTethered(false); sendTetherStateChangedBroadcast();//通知 }
在Tethering构造函数还有如下:
mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper); mTetherMasterSM.start();
其流程和TetherInterfaceSM一样,先看下其构造函数
TetherMasterSM(String name, Looper looper) { super(name, looper); //Add states mInitialState = new InitialState(); addState(mInitialState); mTetherModeAliveState = new TetherModeAliveState(); addState(mTetherModeAliveState); mSetIpForwardingEnabledErrorState = new SetIpForwardingEnabledErrorState(); addState(mSetIpForwardingEnabledErrorState); mSetIpForwardingDisabledErrorState = new SetIpForwardingDisabledErrorState(); addState(mSetIpForwardingDisabledErrorState); mStartTetheringErrorState = new StartTetheringErrorState(); addState(mStartTetheringErrorState); mStopTetheringErrorState = new StopTetheringErrorState(); addState(mStopTetheringErrorState); mSetDnsForwardersErrorState = new SetDnsForwardersErrorState(); addState(mSetDnsForwardersErrorState); mNotifyList = new ArrayList<TetherInterfaceSM>(); setInitialState(mInitialState); }
再看下InitialState类,只是其enter函数为空
class InitialState extends TetherMasterUtilState { @Override public void enter() { }
如此第一波,从netd检测到新的网络设备,到networkManagementService,到tethering添加iface结束了。
下面开始第二波,开启usb共享会调用下面这个函数
public int setUsbTethering(boolean enable) { if (VDBG) Log.d(TAG, "setUsbTethering(" + enable + ")"); UsbManager usbManager = (UsbManager)mContext.getSystemService(Context.USB_SERVICE); synchronized (mPublicSync) { if (enable) { if (mRndisEnabled) {//开启USB共享 tetherUsb(true); } else { mUsbTetherRequested = true; usbManager.setCurrentFunction(UsbManager.USB_FUNCTION_RNDIS, false);//设置属性 } } else {//关闭 tetherUsb(false); if (mRndisEnabled) { usbManager.setCurrentFunction(null, false); } mUsbTetherRequested = false; } } return ConnectivityManager.TETHER_ERROR_NO_ERROR; }
tetherUsb函数
private void tetherUsb(boolean enable) { if (VDBG) Log.d(TAG, "tetherUsb " + enable); String[] ifaces = new String[0]; try { ifaces = mNMService.listInterfaces();//NetworkManagermentService里所有的iface } catch (Exception e) { Log.e(TAG, "Error listing Interfaces", e); return; } for (String iface : ifaces) { if (isUsb(iface)) {//看有没有我们资源里的是usb的iface int result = (enable ? tether(iface) : untether(iface));//有就开启共享 if (result == ConnectivityManager.TETHER_ERROR_NO_ERROR) { return; } } } Log.e(TAG, "unable start or stop USB tethering"); }
下面是tether函数
public int tether(String iface) { if (DBG) Log.d(TAG, "Tethering " + iface); TetherInterfaceSM sm = null; synchronized (mPublicSync) { sm = mIfaces.get(iface); } if (sm == null) { Log.e(TAG, "Tried to Tether an unknown iface :" + iface + ", ignoring"); return ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE; } Log.i(TAG,"sm.isAvailable() = " + sm.isAvailable() +" , sm.isErrored() = " + sm.isErrored() +" , sm.isTetered()=" + sm.isTethered()); if (!sm.isAvailable() && !sm.isErrored()) { Log.e(TAG, "Tried to Tether an unavailable iface :" + iface + ", ignoring"); return ConnectivityManager.TETHER_ERROR_UNAVAIL_IFACE; } sm.sendMessage(TetherInterfaceSM.CMD_TETHER_REQUESTED); return ConnectivityManager.TETHER_ERROR_NO_ERROR; }
到达stateMachine的sendMessage函数
public final void sendMessage(int what) { // mSmHandler can be null if the state machine has quit. SmHandler smh = mSmHandler; if (smh == null) return; smh.sendMessage(obtainMessage(what)); }
handleMessage消息处理
public final void handleMessage(Message msg) { if (!mHasQuit) { if (mDbg) mSm.log("handleMessage: E msg.what=" + msg.what); /** Save the current message */ mMsg = msg; /** State that processed the message */ State msgProcessedState = null; if (mIsConstructionCompleted) { /** Normal path */ msgProcessedState = processMsg(msg); } else if (!mIsConstructionCompleted && (mMsg.what == SM_INIT_CMD) && (mMsg.obj == mSmHandlerObj)) { /** Initial one time path. */ mIsConstructionCompleted = true; invokeEnterMethods(0); } else { throw new RuntimeException("StateMachine.handleMessage: " + "The start method not called, received msg: " + msg); } performTransitions(msgProcessedState, msg); // We need to check if mSm == null here as we could be quitting. if (mDbg && mSm != null) mSm.log("handleMessage: X"); } }
先看下processMsg函数:
private final State processMsg(Message msg) { StateInfo curStateInfo = mStateStack[mStateStackTopIndex]; if (mDbg) { mSm.log("processMsg: " + curStateInfo.state.getName()); } if (isQuit(msg)) { transitionTo(mQuittingState); } else { while (!curStateInfo.state.processMessage(msg)) { /** * Not processed */ curStateInfo = curStateInfo.parentStateInfo; if (curStateInfo == null) { /** * No parents left so it's not handled */ mSm.unhandledMessage(msg); break; } if (mDbg) { mSm.log("processMsg: " + curStateInfo.state.getName()); } } } return (curStateInfo != null) ? curStateInfo.state : null; }processMsg函数
private final State processMsg(Message msg) { StateInfo curStateInfo = mStateStack[mStateStackTopIndex];//得到staestack的stateinfo if (mDbg) { mSm.log("processMsg: " + curStateInfo.state.getName()); } if (isQuit(msg)) { transitionTo(mQuittingState); } else { while (!curStateInfo.state.processMessage(msg)) {//显示init /** * Not processed */ curStateInfo = curStateInfo.parentStateInfo; if (curStateInfo == null) { /** * No parents left so it's not handled */ mSm.unhandledMessage(msg); break; } if (mDbg) { mSm.log("processMsg: " + curStateInfo.state.getName()); } } } return (curStateInfo != null) ? curStateInfo.state : null; }然后就到InitialState 的
class InitialState extends State { @Override public void enter() { setAvailable(true); setTethered(false); sendTetherStateChangedBroadcast(); } @Override public boolean processMessage(Message message) { if (DBG) Log.d(TAG, "InitialState.processMessage what=" + message.what); boolean retValue = true; switch (message.what) { case CMD_TETHER_REQUESTED: setLastError(ConnectivityManager.TETHER_ERROR_NO_ERROR); mTetherMasterSM.sendMessage(TetherMasterSM.CMD_TETHER_MODE_REQUESTED,//注意是发送的mTetherMasterSM的消息,并且将自己作为obj传过去 TetherInterfaceSM.this); transitionTo(mStartingState);//转到mStartingState break; case CMD_INTERFACE_DOWN: transitionTo(mUnavailableState); break; default: retValue = false; break; } return retValue; } }
transitionTo函数
protected final void transitionTo(IState destState) { mSmHandler.transitionTo(destState); }
private final void transitionTo(IState destState) { mDestState = (State) destState; if (mDbg) mSm.log("transitionTo: destState=" + mDestState.getName()); }
继续分析stateMachine里的handleMessage,handleMessage函数最后会调用performTransitions函数
private void performTransitions(State msgProcessedState, Message msg) { /** * If transitionTo has been called, exit and then enter * the appropriate states. We loop on this to allow * enter and exit methods to use transitionTo. */ State orgState = mStateStack[mStateStackTopIndex].state;//上一次的state /** * Record whether message needs to be logged before we transition and * and we won't log special messages SM_INIT_CMD or SM_QUIT_CMD which * always set msg.obj to the handler. */ boolean recordLogMsg = mSm.recordLogRec(mMsg) && (msg.obj != mSmHandlerObj); if (mLogRecords.logOnlyTransitions()) { /** Record only if there is a transition */ if (mDestState != null) { mLogRecords.add(mSm, mMsg, mSm.getLogRecString(mMsg), msgProcessedState, orgState, mDestState); } } else if (recordLogMsg) { /** Record message */ mLogRecords.add(mSm, mMsg, mSm.getLogRecString(mMsg), msgProcessedState, orgState, mDestState); } State destState = mDestState; if (destState != null) { /** * Process the transitions including transitions in the enter/exit methods */ while (true) { if (mDbg) mSm.log("handleMessage: new destination call exit/enter"); /** * Determine the states to exit and enter and return the * common ancestor state of the enter/exit states. Then * invoke the exit methods then the enter methods. */ StateInfo commonStateInfo = setupTempStateStackWithStatesToEnter(destState);//先把它放在mTempStateStack中 invokeExitMethods(commonStateInfo);//执行上一个的exit int stateStackEnteringIndex = moveTempStateStackToStateStack();//将mTempStateStack放在mStateStack invokeEnterMethods(stateStackEnteringIndex);//执行最新的state的enter函数 /** * Since we have transitioned to a new state we need to have * any deferred messages moved to the front of the message queue * so they will be processed before any other messages in the * message queue. */ moveDeferredMessageAtFrontOfQueue(); if (destState != mDestState) { // A new mDestState so continue looping destState = mDestState; } else { // No change in mDestState so we're done break; } } mDestState = null; } /** * After processing all transitions check and * see if the last transition was to quit or halt. */ if (destState != null) { if (destState == mQuittingState) { /** * Call onQuitting to let subclasses cleanup. */ mSm.onQuitting(); cleanupAfterQuitting(); } else if (destState == mHaltingState) { /** * Call onHalting() if we've transitioned to the halting * state. All subsequent messages will be processed in * in the halting state which invokes haltedProcessMessage(msg); */ mSm.onHalting(); } } }
先看看setupTempStateStackWithStatesToEnter函数
private final StateInfo setupTempStateStackWithStatesToEnter(State destState) { /** * Search up the parent list of the destination state for an active * state. Use a do while() loop as the destState must always be entered * even if it is active. This can happen if we are exiting/entering * the current state. */ mTempStateStackCount = 0; StateInfo curStateInfo = mStateInfo.get(destState);//获取state的stateinfo do { mTempStateStack[mTempStateStackCount++] = curStateInfo;//放到mTempStateStack中 curStateInfo = curStateInfo.parentStateInfo; } while ((curStateInfo != null) && !curStateInfo.active); if (mDbg) { mSm.log("setupTempStateStackWithStatesToEnter: X mTempStateStackCount=" + mTempStateStackCount + ",curStateInfo: " + curStateInfo); } return curStateInfo; }
invokeExitMethods函数
private final void invokeExitMethods(StateInfo commonStateInfo) { while ((mStateStackTopIndex >= 0) && (mStateStack[mStateStackTopIndex] != commonStateInfo)) { State curState = mStateStack[mStateStackTopIndex].state; if (mDbg) mSm.log("invokeExitMethods: " + curState.getName()); curState.exit();//执行exit函数 mStateStack[mStateStackTopIndex].active = false;//置为false mStateStackTopIndex -= 1; } }
下面两个函数moveTempStateStackToStateStack,invokeEnterMethods不分析了,之前分析过。
下面应该执行StartingState 的enter函数
class StartingState extends State { @Override public void enter() { setAvailable(false); if (mUsb) { if (!Tethering.this.configureUsbIface(true)) { mTetherMasterSM.sendMessage(TetherMasterSM.CMD_TETHER_MODE_UNREQUESTED, TetherInterfaceSM.this); setLastError(ConnectivityManager.TETHER_ERROR_IFACE_CFG_ERROR); transitionTo(mInitialState); return; } } sendTetherStateChangedBroadcast(); // Skipping StartingState transitionTo(mTetheredState);//不出错直接到mTetheredState状态 }
TetheredState 的enter函数
class TetheredState extends State { @Override public void enter() { try { mNMService.tetherInterface(mIfaceName);//只是netd一个add的动作 } catch (Exception e) { Log.e(TAG, "Error Tethering: " + e.toString()); setLastError(ConnectivityManager.TETHER_ERROR_TETHER_IFACE_ERROR); transitionTo(mInitialState); return; } if (DBG) Log.d(TAG, "Tethered " + mIfaceName); setAvailable(false); setTethered(true);//状态 sendTetherStateChangedBroadcast();//通知 }
再看前面的TetherInterfaceSM的InitialState 的processMessage函数
class InitialState extends State { @Override public void enter() { setAvailable(true); setTethered(false); sendTetherStateChangedBroadcast(); } @Override public boolean processMessage(Message message) { if (DBG) Log.d(TAG, "InitialState.processMessage what=" + message.what); boolean retValue = true; switch (message.what) { case CMD_TETHER_REQUESTED: setLastError(ConnectivityManager.TETHER_ERROR_NO_ERROR); mTetherMasterSM.sendMessage(TetherMasterSM.CMD_TETHER_MODE_REQUESTED,//发消息 TetherInterfaceSM.this); transitionTo(mStartingState); break;看TetherMasterSM的InitialState ,前面相同的流程就不分析了
class InitialState extends TetherMasterUtilState { @Override public void enter() { } @Override public boolean processMessage(Message message) { if (DBG) Log.d(TAG, "MasterInitialState.processMessage what=" + message.what); boolean retValue = true; switch (message.what) { case CMD_TETHER_MODE_REQUESTED: TetherInterfaceSM who = (TetherInterfaceSM)message.obj; if (VDBG) Log.d(TAG, "Tether Mode requested by " + who); mNotifyList.add(who); transitionTo(mTetherModeAliveState);//转到mTetherModeAliveState break;
接下来执行TetherModeAliveState 的enter函数
class TetherModeAliveState extends TetherMasterUtilState { boolean mTryCell = !WAIT_FOR_NETWORK_TO_SETTLE; @Override public void enter() { turnOnMasterTetherSettings(); // may transition us out startListeningForSimChanges();//监听sim卡变换的广播 mTryCell = !WAIT_FOR_NETWORK_TO_SETTLE; // better try something first pass // or crazy tests cases will fail chooseUpstreamType(mTryCell); mTryCell = !mTryCell; }
TetherModeAliveState 函数
protected boolean turnOnMasterTetherSettings() { try { mNMService.setIpForwardingEnabled(true); } catch (Exception e) { transitionTo(mSetIpForwardingEnabledErrorState); return false; } try { mNMService.startTethering(mDhcpRange);//开启共享 } catch (Exception e) { try { mNMService.stopTethering(); mNMService.startTethering(mDhcpRange); } catch (Exception ee) { transitionTo(mStartTetheringErrorState); return false; } } return true; }只是分析了个大概的usb共享的开启流程,后续还会详细分析。也会分析netd等。