Android7.0 usb网络共享开关

涉及的文件:
packages\apps\Settings\src\com\android\settings\TetherSettings.java
packages\apps\Settings\src\com\android\settings\TetherService.java
frameworks\base\services\core\java\com\android\server\connectivity\Tethering.java

TetherSettings.java中重点函数

  1. 状态变化
private void updateState() {    String[] available = mCm.getTetherableIfaces();    String[] tethered = mCm.getTetheredIfaces();    String[] errored = mCm.getTetheringErroredIfaces();    updateState(available, tethered, errored);}private void updateState(String[] available, String[] tethered,        String[] errored) {    updateUsbState(available, tethered, errored);    updateBluetoothState(available, tethered, errored);}private void updateUsbState(String[] available, String[] tethered,        String[] errored) {    boolean usbAvailable = mUsbConnected && !mMassStorageActive;    int usbError = ConnectivityManager.TETHER_ERROR_NO_ERROR;    for (String s : available) {        for (String regex : mUsbRegexs) {            if (s.matches(regex)) {                if (usbError == ConnectivityManager.TETHER_ERROR_NO_ERROR) {                    usbError = mCm.getLastTetherError(s);                }            }        }    }    boolean usbTethered = false;    for (String s : tethered) {        for (String regex : mUsbRegexs) {            if (s.matches(regex)) usbTethered = true;        }    }    boolean usbErrored = false;    for (String s: errored) {        for (String regex : mUsbRegexs) {            if (s.matches(regex)) usbErrored = true;        }    }    if (usbTethered) {    // 已共享网络        mUsbTether.setSummary(R.string.usb_tethering_active_subtext);        mUsbTether.setEnabled(!mDataSaverEnabled);        mUsbTether.setChecked(true);    } else if (usbAvailable) {        if (usbError == ConnectivityManager.TETHER_ERROR_NO_ERROR) {        // usb已连接,usb共享选项打开选项从灰色变为可操作            mUsbTether.setSummary(R.string.usb_tethering_available_subtext);        } else {            mUsbTether.setSummary(R.string.usb_tethering_errored_subtext);        }        mUsbTether.setEnabled(!mDataSaverEnabled);        mUsbTether.setChecked(false);    } else if (usbErrored) {        mUsbTether.setSummary(R.string.usb_tethering_errored_subtext);        mUsbTether.setEnabled(false);        mUsbTether.setChecked(false);    } else if (mMassStorageActive) {    // usb共享和adb、访问Android存储公用一个usb,当选择浏览Android设备文件时,usb共享不可以使用    // 提示此时状态为文件浏览模式,usb共享不可操作        mUsbTether.setSummary(R.string.usb_tethering_storage_active_subtext);        mUsbTether.setEnabled(false);        mUsbTether.setChecked(false);    } else {    // usb断开连接        mUsbTether.setSummary(R.string.usb_tethering_unavailable_subtext);        mUsbTether.setEnabled(false);        mUsbTether.setChecked(false);    }}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. 打开usb网络共享
private void startTethering(int choice) { if (choice == TETHERING_BLUETOOTH) {     // Turn on Bluetooth first.     BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();     if (adapter.getState() == BluetoothAdapter.STATE_OFF) {         mBluetoothEnableForTether = true;         adapter.enable();         mBluetoothTether.setSummary(R.string.bluetooth_turning_on);         mBluetoothTether.setEnabled(false);         return;     } } mCm.startTethering(choice, true, mStartTetheringCallback, mHandler);}@Overridepublic boolean onPreferenceTreeClick(Preference preference) {if (preference == mUsbTether) {    if (mUsbTether.isChecked()) {    // 打开usb网络共享        startTethering(TETHERING_USB);    } else {    // 关闭USB网络共享        mCm.stopTethering(TETHERING_USB);    }} else if (preference == mBluetoothTether) {    if (mBluetoothTether.isChecked()) {        startTethering(TETHERING_BLUETOOTH);    } else {        mCm.stopTethering(TETHERING_BLUETOOTH);        // No ACTION_TETHER_STATE_CHANGED is fired or bluetooth unless a device is        // connected. Need to update state manually.        updateState();    }} else if (preference == mCreateNetwork) {    showDialog(DIALOG_AP_SETTINGS);}    return super.onPreferenceTreeClick(preference);}1234567891011121314151617181920212223242526272829303132333435363738394041

framework中的重点函数

  1. 追踪代码,实际会调用到Tethering.java的
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) {                final long ident = Binder.clearCallingIdentity();                try {                // 如果对/sys/class/android_usb/android0已经设置为rndis                // 对usb interface设置ip                    tetherMatchingInterfaces(true, ConnectivityManager.TETHERING_USB);                } finally {                    Binder.restoreCallingIdentity(ident);                }            } else {                mUsbTetherRequested = true;                // 对/sys/class/android_usb/android0设置为rndis模式                usbManager.setCurrentFunction(UsbManager.USB_FUNCTION_RNDIS);            }        } else {            final long ident = Binder.clearCallingIdentity();            try {                tetherMatchingInterfaces(false, ConnectivityManager.TETHERING_USB);            } finally {                Binder.restoreCallingIdentity(ident);            }            if (mRndisEnabled) {                usbManager.setCurrentFunction(null);            }            mUsbTetherRequested = false;        }    }    return ConnectivityManager.TETHER_ERROR_NO_ERROR;}1234567891011121314151617181920212223242526272829303132333435
  1. rndis、adb、mtp等功能都是复用/sys/class/android_usb/android0设备,可以通过对设备写不同的值进行切换或者几个功能共存。在UsbService中对sys.usb.config设置不同的值,在rc文件中处理,如下
...on property:sys.usb.config=ptp    write /sys/class/android_usb/android0/enable 0    write /sys/class/android_usb/android0/idVendor 1f3a    write /sys/class/android_usb/android0/idProduct 1008    write /sys/class/android_usb/android0/functions ${sys.usb.config}    write /sys/class/android_usb/android0/enable 1    setprop sys.usb.state ${sys.usb.config}on property:sys.usb.config=ptp,adb    write /sys/class/android_usb/android0/enable 0    write /sys/class/android_usb/android0/idVendor 1f3a    write /sys/class/android_usb/android0/idProduct 1009    write /sys/class/android_usb/android0/functions ${sys.usb.config}    write /sys/class/android_usb/android0/enable 1    start adbd    setprop sys.usb.state ${sys.usb.config}on property:sys.usb.config=rndis    write /sys/class/android_usb/android0/enable 0    write /sys/class/android_usb/android0/idVendor 1f3a    write /sys/class/android_usb/android0/idProduct 100a    write /sys/class/android_usb/android0/functions ${sys.usb.config}    write /sys/class/android_usb/android0/bDeviceClass 224    write /sys/class/android_usb/android0/enable 1    setprop sys.usb.state ${sys.usb.config}on property:sys.usb.config=rndis,adb    write /sys/class/android_usb/android0/enable 0    write /sys/class/android_usb/android0/idVendor 1f3a    write /sys/class/android_usb/android0/idProduct 100b    write /sys/class/android_usb/android0/functions ${sys.usb.config}    write /sys/class/android_usb/android0/bDeviceClass 224    write /sys/class/android_usb/android0/enable 1    start adbd    setprop sys.usb.state ${sys.usb.config}...

更多相关文章

  1. Android文件下载使用Http协议
  2. android HttpURLConnection 连接网络 读取返回数据
  3. Android客户端与云服务器进行网络通信
  4. 用Javascript判断访问来源操作系统, 设备, 浏览器类型
  5. ReactNative 命令生成bundle文件
  6. Android 手机存储文件各种路径
  7. 修改android studio 默认的so文件检索路径
  8. CreateProcess error=2, 系统找不到指定的文件。
  9. 【Android】Android Layout Binder——根据layout布局文件自动生

随机推荐

  1. 软件架构-分布式系列并发编程Lock锁和Too
  2. Linux学习笔记总结(九十八)
  3. .Net如何学习
  4. 安全星球将成为企业办公必备的工具
  5. 报表生成器FastReport .Net如何存储和加
  6. HMS Core助力游戏运营开发,为游戏出海开启
  7. 五个Excel函数组合,效率提高一丢丢
  8. Linux运维入门教程01-03 (Linux命令及获
  9. 构造函数、dom元素的基础
  10. 大型团队 Jenkins 实践分享