1.点击网络共享菜单处理流程
类:TetherSettings.java
public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
ConnectivityManager cm =
(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
if (preference == mUsbTether) {
if (!mUsbTethering) {
boolean newState = mUsbTether.isChecked();
/// M: update usb tethering @{
mUsbTether.setEnabled(false);
mTetherSettingsExt.updateUsbTypeListState(false);
mUsbTethering = true;
mUsbTetherCheckEnable = false;
if (newState) {
mUsbTetherDone = false;
} else {
mUsbUnTetherDone = false;
}
mUsbTetherFail = false;
Log.d(TAG, "onPreferenceTreeClick - setusbTethering(" + newState +
") mUsbTethering: " + mUsbTethering);
/// @}
if (newState) {
startProvisioningIfNecessary(TETHERING_USB);//若新状态位true,开始网络共享
} else {
if (TetherUtil.isProvisioningNeeded(getActivity())) {
TetherService.cancelRecheckAlarmIfNecessary(getActivity(), TETHERING_USB);
}
setUsbTethering(newState);//设置新的usb网络共享选项状态
}
} else {
return true;
}
}
===========》
private void startProvisioningIfNecessary(int choice) {
mTetherChoice = choice;
if (TetherUtil.isProvisioningNeeded(getActivity())) {//弹出对话框让用户选择允许
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClassName(mProvisionApp[0], mProvisionApp[1]);
intent.putExtra(TETHER_CHOICE, mTetherChoice);
startActivityForResult(intent, PROVISION_REQUEST);
} else {
startTethering();//开始共享网络的方法
}
}
===========》
private void startTethering() {
switch (mTetherChoice) {
.....
case TETHERING_USB: //TETHERING_USB选选等于USB网络共享
setUsbTethering(true);//
break;
}
}
===========》 //到此还是没发现网络是怎么共享出去的
private void setUsbTethering(boolean enabled) {
ConnectivityManager cm =
(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
//M: move mUsbTether.setChecked(false) as CR ALPS00449289
if (cm.setUsbTethering(enabled) != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
mUsbTether.setChecked(false);
mUsbTether.setSummary(R.string.usb_tethering_errored_subtext);
return;
}
mUsbTether.setSummary("");
}
===========》下面看看ConnectivityManager.java的 setUsbTethering(enabled)方法:
public int setUsbTethering(boolean enable) {
try {
return mService.setUsbTethering(enable);//连接服务器类设置共享位true
} catch (RemoteException e) {
return TETHER_ERROR_SERVICE_UNAVAIL;
}
}
}
===========》看 ConnectivityService类:
public int setUsbTethering(boolean enable) {
ConnectivityManager.enforceTetherChangePermission(mContext);
if (isTetheringSupported()) {
return mTethering.setUsbTethering(enable);//mTethering为Tethering类对象
} else {
return ConnectivityManager.TETHER_ERROR_UNSUPPORTED;
}
}
===========》查看Tethering类:
public int setUsbTethering(boolean enable) {
if (VDBG) Log.d(TAG, "setUsbTethering(" + enable + ")");
UsbManager usbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
int value ;
synchronized (mPublicSync) {
/** M: ALPS00233672 */
mUsbTetherEnabled = enable;
/** M: for bug solving, ALPS00331223 */
mTetheredFail = false ;
if (enable) {
mTetherDone = false ;
if (mRndisEnabled) {
tetherUsb(true);
} else {
mUsbTetherRequested = true;
/// M: @{
/** EEM Support */
//usbManager.setCurrentFunction(UsbManager.USB_FUNCTION_RNDIS);
value = Settings.System.getInt(mContext.getContentResolver()
, Settings.System.USB_TETHERING_TYPE
, Settings.System.USB_TETHERING_TYPE_DEFAULT);
if ((value == Settings.System.USB_TETHERING_TYPE_EEM) && isMtkTetheringEemSupport()) {
Log.d(TAG, "The MTK_TETHERING_EEM_SUPPORT is True");
usbManager.setCurrentFunction(UsbManager.USB_FUNCTION_EEM);
} else {
Log.d(TAG, "The MTK_TETHERING_RNDIS only");
usbManager.setCurrentFunction(UsbManager.USB_FUNCTION_RNDIS);
}
/// @}
}
} else {
//for tear down request from ConnectivityService
mUnTetherDone = false ;
tetherUsb(false);
if (mRndisEnabled) {
usbManager.setCurrentFunction(null);
}
mUsbTetherRequested = false;
}
}
return ConnectivityManager.TETHER_ERROR_NO_ERROR;
}
===========》看tetherUsb(true)方法:
private void tetherUsb(boolean enable) {
if (VDBG) Log.d(TAG, "tetherUsb " + enable);
String[] ifaces = new String[0];
try {
ifaces = mNMService.listInterfaces();//获取网络消息名列表
for (String iface : ifaces) {
if (isUsb(iface)) {//如果属于USB需要的网络消息
//且网络分享开启时分享网络消息,否则不分享
int result = (enable ? tether(iface) : untether(iface));
if (result == ConnectivityManager.TETHER_ERROR_NO_ERROR) {
return;
}
}
}
} catch (Exception e) {
Log.e(TAG, "Error listing Interfaces", e);
//return;
}
/** M: for bug solving, ALPS00331223 */
mTetheredFail = true ;
SystemClock.sleep(500);
sendTetherStateChangedBroadcast() ;
Log.e(TAG, "unable start or stop USB tethering");
}
===========》现在看tether(iface),usb是如何把信号分享出去:
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;
}
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;
}
===========》CMD_TETHER_REQUESTED消息的处理在InitialState中:
case CMD_TETHER_REQUESTED:
setLastError(ConnectivityManager.TETHER_ERROR_NO_ERROR);
mTetherMasterSM.sendMessage(TetherMasterSM.CMD_TETHER_MODE_REQUESTED,
TetherInterfaceSM.this);//这里也没具体处理消息,再次发出一个消息和TetherMasterSM对象
/** M: ipv6 tethering @{ */
if (isTetheringIpv6Support()) {
setLastError(ConnectivityManager.TETHER_ERROR_IPV6_NO_ERROR);
if (mIpv6FeatureEnable) {
mIpv6TetherMasterSM.sendMessage(
TetherMasterSM.CMD_TETHER_MODE_REQUESTED,
TetherInterfaceSM.this);
}
}
/** @} */
transitionTo(mStartingState);
break;
===========》该消息CMD_TETHER_MODE_REQUESTED处理如下
case CMD_TETHER_MODE_REQUESTED:
TetherInterfaceSM who = (TetherInterfaceSM)message.obj;
if (VDBG) Log.d(TAG, "[MSM_Initial][" + mName
+ "] Tether Mode requested by " + who);
mNotifyList.add(who);
transitionTo(mTetherModeAliveState);//这里实质传递了一个mTetherModeAliveState状态。
break;
===========》看mTetherModeAliveState初始化:
class TetherModeAliveState extends TetherMasterUtilState {
boolean mTryCell = !WAIT_FOR_NETWORK_TO_SETTLE;
@Override
public void enter() {
Log.i(TAG, "[MSM_TetherModeAlive][" + mName + "] enter");
//打开主机网络信号分享出去
turnOnMasterTetherSettings(); // may transition us out
//开始监听SIM信号变化
startListeningForSimChanges();
mTryCell = !WAIT_FOR_NETWORK_TO_SETTLE; // better try something first pass
// or crazy tests cases will fail
chooseUpstreamType(mTryCell);
mTryCell = !mTryCell;
}
===========》查看turnOnMasterTetherSettings()方法:
protected boolean turnOnMasterTetherSettings() {
try {
/** M: ipv6 tethering @{ */
if (isIpv6MasterSmOn()) {
if (MASTERSM_IPV4.equals(mName)) {
///M: Fix for CR ALPS00382764
//mNMService.setIpForwardingEnabled(true);
}
else if (MASTERSM_IPV6.equals(mName)) {
mNMService.setIpv6ForwardingEnabled(true); }//设置ipv6信息传递可用
} else {
/** @} */
///M: Fix for CR ALPS00382764
//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;
}
===========》到这里NetworkManagementService才真正走到开始分享的方法mNMService.startTethering,看看该方法:
@Override
public void setIpForwardingEnabled(boolean enable) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
try {
mConnector.execute("ipfwd", enable ? "enable" : "disable", "tethering");
} catch (NativeDaemonConnectorException e) {
throw e.rethrowAsParcelableException();
}
}
@Override
public void startTethering(String[] dhcpRange) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
// cmd is "tether start first_start first_stop second_start second_stop ..."
// an odd number of addrs will fail
final Command cmd = new Command("tether", "start");
for (String d : dhcpRange) {
cmd.appendArg(d);
}
try {
//mConnector是一个Runnable守护线程NativeDaemonConnector 熟称ndc
//支持netd指令集,发送的信号字符串数组通过Command组装,真正写入USB线达到共享网络目的
mConnector.execute(cmd);
} catch (NativeDaemonConnectorException e) {
throw e.rethrowAsParcelableException();
}
}
===========》到此网络信号终于通过USB线传递来出去,可以看出传递的实际是一个Command的指令对象,其中保存的是一个
ArrayList字符串数组参数,具体传输协议内容如下:
1)设置IP方法时,获取了8组2,254的ip地址域:
03-30 14:07:19.169 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.42.2
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.42.254
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.43.2
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.43.254
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.44.2
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.44.254
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.45.2
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.45.254
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.46.2
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.46.254
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.47.2
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.47.254
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.48.2
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.48.254
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.49.2
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.49.254
会获取IP列表然后在分享是组装成字符串列表如下:
2)开始分享网络
97 tether start 192.168.42.2 192.168.42.254 192.168.43.2 192.168.43.254 192.168.44.2 192.168.44.254 192.168.45.2 192.168.45.254 192.168.46.2 192.168.46.254 192.168.47.2 192.168.47.254 192.168.48.2 192.168.48.254 192.168.49.2 192.168.49.254 \0
98 tether dns set 1002 2409:8057:2000::8 2409:8057:2000:4::8 120.196.165.7 221.179.38.7 \0
99 nat enable rndis0 ccmni0 0 \0
100 ipfwd add rndis0 ccmni0 \0
101 ipfwd enable tethering \0
每条USB传输协议内容构成分解如下:
序列号97 指令类型tether 指令动作start 指令内容xxx 结束符\0
这些关键字为Netd命令,见文档结尾附
其中指令内容可以有多个并列,每条指令都是以指令序列号开始 结束符 结束。
从以上log看出开启USB网络共享步骤:
1.开始8个IP段: 97 tether start 192.168.42.2 xxx \0
2.dns设置: 98 tether dns set xxxx \0
3.enable rndis0和ccmni0 99 nat enable rndis0 ccmni0 0 \0
4.将rndis0和ccmni0添加入IP 100 ipfwd add rndis0 ccmni0 \0
5.开始分享 101 ipfwd enable tethering \0
enable tethering后,开始具体设置,每次网络发送变化时会重新配置一遍:
337 bandwidth gettetherstats //带宽控制
338 network create 1011 SYSTEM //网络控制
339 network interface add 1011 ccmni4 //网络配置管理
340 interface setmtu ccmni4 1410
341 network route add 1011 ccmni4 ::/0 fe80::74a1:f4a:3dac:fcb //网络路由配置管理
342 resolver clearnetdns 1011
343 bandwidth gettetherstats
344 bandwidth gettetherstats
345 tether dns set 1010 2409:8057:2000::8 2409:8057:2000:4::8 120.196.165.7 221.179.38.7
346 bandwidth removeiquota ccmni0
347 bandwidth setiquota ccmni0 9223372036854775807
348 bandwidth setglobalalert 2097152
底层Netd支持命令集:
ndc(NativeDeamonConnector):
2 interface
3 list // /sys/class/net
4 getcfg wlan0
5 setcfg
6 clearaddrs
7 ipv6privacyextensions // Usage: interface ipv6privacyextensions
8 ipv6 // Usage: interface ipv6
9 ipv6ndoffload // Usage: interface ipv6ndoffload
10 setmtu // Usage: interface setmtu
11
12 ipfwd
13 status
14 enable // ipfwd enable
15 disable // ipfwd disable
16 add // ipfwd add wlan0 dummy0
17 remove // ipfwd remove wlan0 dummy0
18
19 tether
20 stop
21 status
22 interface list/add/remove
23 dns list/set
24 start
25
26 nat
27 enable
28 disable
29
30 pppd
31 attach
32 detach
33
34 softap
35 startap
36 stopap
37 fwreload
38 status
39 set
40
41 resolver
42 setnetdns
43 clearnetdns
44 flushnet
45
46 bandwidth
47 enable
48 disable
49 removequota\rq // removequota
50 getquota\gq
51 getiquota\giq // getiquota
52 setquota\sq // setquota
53 setquotas\sqs // setquotas
54 removequotas\rqs // removequotas
55 removeiquota\riq removeiquota
56 setiquota\siq // setiquota
57 addnaughtyapps\ana // addnaughtyapps
58 removenaughtyapps\rna //removenaughtyapps
59 happybox // happybox (enable | disable)
60 addniceapps\aha // addniceapps
61 removeniceapps\rha // removeniceapps
62 setglobalalert\sga // setglobalalert
63 debugsettetherglobalalert\dstga // debugsettetherglobalalert
64 removeglobalalert\rga
65 debugremovetetherglobalalert\drtga // debugremovetetherglobalalert
66 setsharedalert\ssa // setsharedalert
67 removesharedalert\rsa
68 setinterfacealert\sia // setinterfacealert
69 removeinterfacealert\ria // removeinterfacealert
70 gettetherstats\gts // gettetherstats [
71
72 idletimer
73 enable
74 disable
75 add
76 remove
77
78 firewall
79 enable // Usage: firewall enable
80 disable
81 is_enabled
82 set_interface_rule // Usage: firewall set_interface_rule
83 set_egress_source_rule // Usage: firewall set_egress_source_rule <192.168.0.1>
84 set_egress_dest_rule // Usage: firewall set_egress_dest_rule <192.168.0.1> <80>
85 set_uid_rule // Usage: firewall set_uid_rule
86 enable_chain // Usage: firewall enable_chain
87 disable_chain // Usage: firewall disable_chain
88
89 clatd
90 stop
91 status
92 start
93
94 strict
95 enable
96 disable
97 set_uid_cleartext_policy
98
99 network
100 route
101 interface add/remove
102 create
103 destroy
104 permission
105 // network permission user set
106 // network permission user clear
107 // network permission network set
108 // network permission network clear
109 users
110 // network users add
111 // network users remove
112
113 protect
114 // network protect allow
115 // network protect deny
系统支持哪些netd指令可以通过adb命令查询,当然要在eng版本下:
adb shell ndc interface list
1.功能需求修改:实现连上USB后自动打开网络分享功能:
USB连上后自动开始网络共享
diff --git a/frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/frameworks/base/services/usb/java/com/android/ser
index 7437332..e16da06 100644
--- a/frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java
+++ b/frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java
@@ -71,6 +71,11 @@ import java.util.Locale;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
+//add auto open usb tethering by fengqing 20190422
+import android.net.ConnectivityManager;
+//add auto open usb tethering by fengqing 20190422
+
+
/**
* UsbDeviceManager manages USB state in device mode.
@@ -817,7 +822,19 @@ public class UsbDeviceManager {
if (DEBUG) Slog.d(TAG, "broadcasting " + intent + " extras: " + intent.getExtras());
mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
mBroadcastedIntent = intent;
+ //add auto open usb tethering by fengqing 20190422
+ setUsbTethering(mConnected);
}
+
+ private void setUsbTethering(boolean connected){
+ ConnectivityManager cm =
+ (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
+ if (cm !=null && cm.setUsbTethering(connected) != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+ Slog.d(TAG, "Tethering start.........successfully ");
+ }
+
+ }
+ //add auto open usb tethering by fengqing 20190422
private void updateUsbFunctions() {
updateAudioSourceFunction();