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 <interface> <enable|disable>
8       ipv6         //  Usage: interface ipv6 <interface> <enable|disable>
9       ipv6ndoffload   //  Usage: interface ipv6ndoffload <interface> <enable|disable>
10      setmtu   //  Usage: interface setmtu <interface> <val>
11      
12  ipfwd
13      status  
14      enable  // ipfwd enable  <requester>
15      disable  //  ipfwd disable <requester>
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 <interface>
50      getquota\gq
51      getiquota\giq        // getiquota <iface>
52      setquota\sq      //   setquota <interface> <bytes>
53      setquotas\sqs    // setquotas <bytes> <interface> ...
54      removequotas\rqs  // removequotas <interface> ...
55      removeiquota\riq  removeiquota <interface>
56      setiquota\siq  // setiquota <interface> <bytes>
57      addnaughtyapps\ana // addnaughtyapps <appUid> ...
58      removenaughtyapps\rna   //removenaughtyapps <appUid> ...
59      happybox   // happybox (enable | disable)
60      addniceapps\aha   //  addniceapps <appUid> ...
61      removeniceapps\rha  // removeniceapps <appUid> ...
62      setglobalalert\sga  // setglobalalert <bytes>
63      debugsettetherglobalalert\dstga  // debugsettetherglobalalert <interface0> <interface1>
64      removeglobalalert\rga
65      debugremovetetherglobalalert\drtga // debugremovetetherglobalalert <interface0> <interface1>
66      setsharedalert\ssa  // setsharedalert <bytes>
67      removesharedalert\rsa  
68      setinterfacealert\sia  // setinterfacealert <interface> <bytes>
69      removeinterfacealert\ria  //  removeinterfacealert <interface>
70      gettetherstats\gts  // gettetherstats [<intInterface> <extInterface>]
71      
72  idletimer
73      enable
74      disable
75      add
76      remove
77      
78  firewall
79      enable  // Usage: firewall enable <whitelist|blacklist>
80      disable
81      is_enabled
82      set_interface_rule  //  Usage: firewall set_interface_rule <rmnet0> <allow|deny>
83      set_egress_source_rule  // Usage: firewall set_egress_source_rule <192.168.0.1> <allow|deny>
84      set_egress_dest_rule  //  Usage: firewall set_egress_dest_rule <192.168.0.1> <80> <allow|deny>
85      set_uid_rule  // Usage: firewall set_uid_rule <dozable|standby|none> <1000> <allow|deny>
86      enable_chain  // Usage: firewall enable_chain <dozable|standby>
87      disable_chain  // Usage: firewall disable_chain <dozable|standby>
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 vpn
103     destroy
104     permission 
105             // network permission   user   set  <permission>  <uid> ...
106             // network permission   user  clear    <uid> ...
107             // network permission network  set  <permission> <netId> ...
108             // network permission network clear   <netId> ...
109     users  
110             // network users  add   <netId> [<uid>[-<uid>]] ...
111             // network users remove <netId> [<uid>[-<uid>]] ...
112             
113     protect
114             // network protect allow <uid> ...
115             // network protect  deny <uid> ...

系统支持哪些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();

USB共享网络流程分析和自动分享网络给PC相关推荐

  1. 自动驾驶网络:为什么需要自动驾驶网络?

    自动驾驶网络:为什么需要自动驾驶网络? 作者:Albert Qin "我们坚信,未来二.三十年人类社会必然走进智能社会.今天,人类社会正处于新理论.新技术再一次爆发的前夜.发展潜力巨大,但也 ...

  2. 手机usb共享计算机网络连接,如何将手机wifi网络通过USB共享给电脑?小编教你共享方法...

    曾经就有过这样的情况,家里突然断网了,这时又需要打开电脑接收文件,或是需要在线编辑公众号的文章,着急得很,这时电脑没有网络怎么办呢?能不能使用手机的流量,来让电脑连网呢?有时候电脑没有网络又想上网怎么 ...

  3. MTK 使用iptable 命令来完成网络路由(android WIFI/4G分享网络)

    很多时候,总有些奇怪的需求,这时候是发挥我们的聪明才智的时候!! 有客户的需求是: 描述下需求:现今有一个控制设备,里面有WIFI,物联网络,以太网2个,其中有一个以太网2是链接内部设备,而其余几个均 ...

  4. 华为任旭东:通过产业合作加速自动驾驶网络

    [美国,圣何塞]美国当地时间4月4日上午,2019年北美开放网络峰会(ONS NA 2019,Open Networking Summit North America 2019)上,华为首席开源联络官 ...

  5. 网络管理员在预先分配和识别作为_14个网络管理员必备的最佳网络流量分析工具,收藏了...

    企业网络每天都会产生大量数据.企业可以分析这些数据,以深入了解网络运行情况或发现安全威胁.网络流量分析(NTA)解决方案允许网络管理员收集流经网络的流量数据.这些工具通常用于识别性能问题和/或发现安全 ...

  6. IOTA--最便捷的网络流量分析工具

    IOTA–最便捷的网络流量分析工具 近年来5G技术迅速的发展,整个我们整个的网络环境将迎来巨大变革,其中网络流量和宽带的剧增是其中的重要变革.这样的变化虽然给我们的工作和生活带来诸多便利,但是也带来了 ...

  7. ubuntu能连接wifi或手机USB共享热点,不能上网

    ubuntu能连接wifi或手机USB共享热点,不能上网 检查 设置 网络 网络代理打开没有,把它关闭 setting->network->networkproxy->off

  8. 极验系列文章一:极验三代 极验验证码整体流程分析

    警告与声明: 作为一位js逆向爱好者,写本篇文章在于纯技术分析.无任何不良商业目的.旨在提高大家的网络安全意识,共同维护网络安全环境!请不要做任何有损国家或其他集体或个人的事情, 否者后果自负!本文如 ...

  9. 网络协议分析(仅供参考,后面的wireshark抓包内容最好自己看书研究)

    必须掌握ARP协议的格式.工作原理和过程.功能,arp命令主要参数等 Arp协议被称为地址解析协议,功能是在同一局域网中,进行mac寻址完成ip到mac的映射,因为局域网中,信息的交流要通过mac地址 ...

最新文章

  1. 你为什么应该经常访问招聘网站?招聘网站至少有4个方面的价值!
  2. python进阶(小白也能看懂)——*args与**kwargs的使用
  3. W5100使用中的常见问题
  4. 文艺平衡树 Splay 学习笔记(1)
  5. 查询2021抚顺高考成绩,2021年抚顺高考状元是谁分数多少分,历年抚顺高考状元名单...
  6. hibernate 别名_Hibernate:在sqlRestriction上使用联接表别名
  7. zynq+linux固化程序,如何在 Zynq UltraScale+ MPSoC 上实现 Linux UIO 设计
  8. 通过init-connect + binlog 实现MySQL审计功能
  9. [转]SQL语句资料
  10. index.wxss 导入不显示结果
  11. JAVA day24,25,26 异常(try、catch、finally、throw、throws),线程(Thread、Runnable、Callable)
  12. python语法训练_18-04-17回顾: python3语法+刻意训练
  13. python替换文件中的字符串_Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)...
  14. html字段集,禁用HTML DOM字段集的属性
  15. ActiveX控件开发流程
  16. 手机同步专家--基于SyncML协议同步通讯录的应用软件
  17. 网吧服务器系统介绍,网吧服务器系统
  18. java word模板生成pdf,java根据模板生成pdf
  19. 支付宝微信QQ钱包收款码合并教程及源码下载
  20. 线性回归之最小二乘法(高斯-马尔可夫定理)

热门文章

  1. 2021高考甘肃师大附中成绩查询,西北师大附中2019年高考喜报 西北师大附中2019年高考成绩...
  2. 弃九法,数论同余学习笔记
  3. 软件测试——黑盒测试基本方法
  4. 魔方大数据系列圆桌论坛(22)之 “数据智能助力产业升级“ 暨国内首个大数据微应用实验室落户上海超级计算中心签约仪式
  5. 向百度提交网站地图Sitemap
  6. 15天完成民猫电商毕设——支付消息(11th day)
  7. 从在线监测与故障诊断系统视角,探讨动设备安全运行的重要性
  8. 哈佛幸福课相关积极心理学经典英文原版书籍-读书笔记(连载中)(转)
  9. Windows8.1中的KB2919355更新
  10. layui文件上传回调前对文件类型及大小判断