USB共享网络流程分析和自动分享网络给PC

本文详细解析了Android系统中USB网络共享的实现机制,从用户界面操作到内核级网络配置,深入探讨了网络共享的启动流程、关键API调用及Netd指令交互过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值