转自:http://blog.sina.com.cn/s/blog_6100a4f10101efoa.html

一 资源位置及入口文件

USB tethering, usb_tethering_button_text

Xml/tether_prefs.xml------usb_tether_settings,布局文件

packages/apps/Settings/AndroidManifest.xml

<!-- Keep compatibility with old shortcuts. -->

<activity-alias android:name=".TetherSettings"

android:label="@string/tether_settings_title_all"

android:clearTaskOnLaunch="true"

android:exported="true"

android:targetActivity="Settings$TetherSettingsActivity">

<meta-data android:name="com.android.settings.FRAGMENT_CLASS"

android:value="com.android.settings.TetherSettings" />

<meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"

android:resource="@id/wireless_settings" />

<meta-data android:name="com.android.settings.PARENT_FRAGMENT_TITLE"

android:resource="@string/wireless_networks_settings_title" />

<meta-data android:name="com.android.settings.PARENT_FRAGMENT_CLASS"

android:value="com.android.settings.Settings$WirelessSettingsActivity" />

</activity-alias>

TetherSettings.java

二 触发流程

2.1 TetherSettings.java

packages/apps/Settings/src/com/android/settings/TetherSettings.java

onPreferenceTreeClick

SXlog.d(TAG, "onPreferenceTreeClick - setusbTethering(" + newState + ") mUsbTethering:  " + mUsbTethering);

setUsbTethering(true);

下面是设置时抓取的log日志

D/TetherSettings(  543): onPreferenceTreeClick - setusbTethering(true) mUsbTethering:  true

D/Tethering(  271): setUsbTethering(true)

D/UsbDeviceManager(  271): setCurrentFunction(rndis) default: false

W/UsbDeviceManager(  271): handleMessage: 2

W/UsbDeviceManager(  271): setEnabledFunctions: functions = rndis

W/UsbDeviceManager(  271): setEnabledFunctions, mDefaultFunctions: mtp,adb

W/UsbDeviceManager(  271): setEnabledFunctions, mCurrentFunctions: mtp,adb

D/UsbDeviceManager(  271): setEnabledFunctions, mSettingFunction: mtp,adb

W/UsbDeviceManager(  271): containsFunction, functions: rndis

W/UsbDeviceManager(  271): containsFunction, function: adb

W/UsbDeviceManager(  271): containsFunction index: -1

W/UsbDeviceManager(  271): addFunction, functions: rndis

W/UsbDeviceManager(  271): addFunction, function: adb

W/UsbDeviceManager(  271): containsFunction, functions: rndis

W/UsbDeviceManager(  271): containsFunction, function: acm

W/UsbDeviceManager(  271): containsFunction index: -1

W/UsbDeviceManager(  271): containsFunction, functions: rndis,adb

W/UsbDeviceManager(  271): containsFunction, function: acm

W/UsbDeviceManager(  271): containsFunction index: -1

D/UsbDeviceManager(  271): setUsbConfig(none)

W/UsbDeviceManager(  271): setUsbConfig, config: none

public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {

ConnectivityManager cm =

(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

if (preference == mUsbTether) {

if (!mUsbTethering) {

boolean newState = mUsbTether.isChecked();

mUsbTethering = true;

mUsbTetherCheckEnable = false;

mUsbTether.setEnabled(false);

SXlog.d(TAG, "onPreferenceTreeClick - setusbTethering(" + newState + ") mUsbTethering:  " + mUsbTethering);

if (newState) {

startProvisioningIfNecessary(USB_TETHERING);

} else {

setUsbTethering(newState);

}

} else {

return true;

}

} else if (preference == mBluetoothTether) {

private void setUsbTethering(boolean enabled) {

ConnectivityManager cm =

(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

if (cm.setUsbTethering(enabled) != ConnectivityManager.TETHER_ERROR_NO_ERROR) {

mUsbTether.setChecked(false);

mUsbTether.setSummary(R.string.usb_tethering_errored_subtext);

return;

}

mUsbTether.setSummary("");

}

2.2 ConnectivityManager.java

frameworks/base/core/java/android/net/ConnectivityManager.java

private final IConnectivityManager mService;

public int setUsbTethering(boolean enable) {

try {

return mService.setUsbTethering(enable);

} catch (RemoteException e) {

return TETHER_ERROR_SERVICE_UNAVAIL;

}

}

manager 和service有一个对应关系,固定的规则。 manager是为了sdk诞生的,方便app开发者调用。其实可以直接调用service,如mountservice是没有mountmanager的。

service是在系统起来是就被android系统启动的,而manager是后期有需要时实例化起来的。

Service的目录在:/frameworks/base/services/java/com/android/server/

manager的目录在:frameworks/base/core/java/android

2.3 ConnectivityService.java

frameworks/base/services/java/com/android/server

private Tethering mTethering;

public int setUsbTethering(boolean enable) {

enforceTetherAccessPermission();

if (isTetheringSupported()) {

return mTethering.setUsbTethering(enable);

} else {

return ConnectivityManager.TETHER_ERROR_UNSUPPORTED;

}

}

2.4 Tethering.java

frameworks/base/services/java/com/android/server/connectivity/Tethering.java

public int setUsbTethering(boolean enable) {

UsbManager usbManager = (UsbManager)mContext.getSystemService(Context.USB_SERVICE);

………………

else {

mUsbTetherRequested = true;

usbManager.setCurrentFunction(UsbManager.USB_FUNCTION_RNDIS, false);

}

通过service,来获取manager,进行操作。这个tethering.java的构造函数

public Tethering(Context context, INetworkManagementService nmService,

INetworkStatsService statsService, IConnectivityManager connService, Looper looper) {

Context是获取全局信息的接口,

2.5 UsbManager.java

/frameworks/base/core/java/android/hardware/usb/UsbManager.java

public void setCurrentFunction(String function, boolean makeDefault) {

try {

mService.setCurrentFunction(function, makeDefault);

} catch (RemoteException e) {

Log.e(TAG, "RemoteException in setCurrentFunction", e);

}

}

2.6 frameworks/base/services/java/com/android/server/usb$

mengfd1@tablet-C:~/work/A2107/frameworks/base/services/java/com/android/server$ cd usb

mengfd1@tablet-C:~/work/A2107/frameworks/base/services/java/com/android/server/usb$ ls

UsbDeviceManager.java  UsbHostManager.java  UsbService.java  UsbSettingsManager.java

/frameworks/base/services/java/com/android/server/usb/UsbService.java

public void setCurrentFunction(String function, boolean makeDefault) {

mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);

if (mDeviceManager != null) {

mDeviceManager.setCurrentFunction(function, makeDefault);

} else {

throw new IllegalStateException("USB device mode not supported");

}

}

/frameworks/base/services/java/com/android/server/usb/UsbDeviceManager.java

public void setCurrentFunction(String function, boolean makeDefault) {

if (DEBUG) Slog.d(TAG, "setCurrentFunction(" + function + ") default: " + makeDefault);

mHandler.sendMessage(MSG_SET_CURRENT_FUNCTION, function, makeDefault);

}

public void handleMessage(Message msg) {

case MSG_SET_CURRENT_FUNCTION:

String function = (String)msg.obj;

boolean makeDefault = (msg.arg1 == 1);

if (function != null && function.equals(UsbManager.USB_FUNCTION_CHARGING_ONLY)) {

mSettingUsbCharging = true;

SXlog.d(TAG, "handleMessage - MSG_SET_CURRENT_FUNCTION - USB_FUNCTION_CHARGING_ONLY - makeDefault: " + makeDefault);

} else {

mSettingUsbCharging = false;

}

setEnabledFunctions(function, makeDefault);

SXlog.d(TAG, "handleMessage - MSG_SET_CURRENT_FUNCTION - function: " + function);

break;

private void setEnabledFunctions(String functions, boolean makeDefault) {

private boolean setUsbConfig(String config) {

SystemProperties.set("sys.usb.config", config);

五、 Usb setting 中tethering 设置流程相关推荐

  1. CE5.0 - eboot汇编Startup.s中MMU设置流程详细分析

    CE5.0 - eboot汇编Startup.s中MMU设置流程详细分析   以下为SMDK开发板startup.s部分启动代码.   ;------------------------------- ...

  2. usb启动计算机boss设置方法,教程方法;U盘装系统中bios设置USB启动图文教程电脑技巧-琪琪词资源网...

    琪琪词资源网-教程方法;U盘装系统中bios设置USB启动图文教程电脑技巧,以下是给大家带来的教程方法;U盘装系统中bios设置USB启动图文教程,大家可以了解一下哦! 总的来讲,设置电脑从U盘启动一 ...

  3. 时序约束基础 和 quartusII 中的设置

    时序约束目的: 一.提高设计的工作频率 二.获得正确的时序分析报告(STA:静态时序分析) 常用的时序概念:   周期,    最大时钟频率.    时钟建立时间.时钟保持时间.    时钟到输出延时 ...

  4. android 5.1 壁纸路径,RTFSC – Android5.1 壁纸设置流程简析 – RustFisher

    Android5.1 壁纸设置流程浅析 Ubuntu14.04  Android5.1  Source Insight3 这里只是简单分析一下5.1里是如何设置壁纸的:这个流程和4.4有一些不同.但基 ...

  5. tkinter的可视化拖拽工具_可视化越做越丑?这五个高级图表效果实现流程分享给你...

    今天我们来说一说数据可视化,想必很多人在入门数据分析之后,就会经常进行可视化的工作,所谓一图胜千言,图表用的好,真的是会事半功倍的.但现实情况下,很多人遇到的问题是: 你做的图表太丑了?你做的图表到底 ...

  6. 【华为云技术分享】解析数据治理在过程可信变革中的运作流程

    摘要:本文针对"数据牵引改进,工具固化规范"这一思路在业务团队落地过程中的动作流程进行详细阐述,并明确了支撑整个流程的关键角色定义和组织运作形式. 目的 为实现云服务开发的过程可信 ...

  7. Android恢复出厂设置流程分析【Android源码解析十】

    最近看恢复出厂的一个问题,以前也查过这方面的流程,所以这里整理一些AP+framework层的流程: 在setting-->备份与重置--->恢复出厂设置--->重置手机---> ...

  8. iOS中app在iTunes中更新版本流程

    2019独角兽企业重金招聘Python工程师标准>>> 昨天终于把新版本的app上传了,我能说我在上传的前一分钟都在改bug吗 对这个版本的app我实在是没有什么信心去期盼它可以通过 ...

  9. 如何在Windows 10中打开设置?

    Windows 10 provides the Windows Settings in order to configure different settings of the Windows 10. ...

最新文章

  1. java apache fileutil_Java FileUtil.listFiles方法代码示例
  2. c语言程序设计和数据结构,C语言程序设计与数据结构实践 闵光太主编.pdf
  3. bootstrap File Input 多文件上传插件使用记录(二)删除原文件
  4. [机器学习笔记] Note4--逻辑回归
  5. 通过SharedPreferences方式存储复杂数据
  6. svn中文扩展包安装
  7. java读取shp文件_GDAL-java读取shp文件信息
  8. CMMI 2.0 和 1.3
  9. 《勘测定界界址点坐标交换格式》解析
  10. 测试内存条是否兼容软件,内存条不兼容有什么表现
  11. (C语言)判断数独是否正确
  12. 【uni-app】uni-app 封装 uni.request 携带请求头
  13. 深度|从一个故事说起,谈谈企业应用架构的演变史
  14. 短语a slap on the wrist
  15. 后悔没早点开源自己的这个仓库
  16. 编译报错Task :app:compileDebugJavaWithJavac FAILED ������ (1.8.0_251) �г����쳣��������� Bug Database
  17. USB启动U盘 计算机找不到,电脑开机快捷启动键找不到u盘怎么办
  18. linux centos crontab,Centos下crontab 指定执行用户
  19. 经纬度,距离,方位角相关计算(Java实现)
  20. 哈工大2021~2022春季学期《计算机系统》大作业

热门文章

  1. 货币政策新款“奥利给”:普惠小微企业信贷支持计划的制约与动力
  2. 28岁的他如何从运营转岗产品经理
  3. java如何等待异步结果_你如何等待所有异步调用在Java中完成?
  4. Python小记---你不在意的小细节
  5. stm32mp157开发板MIC 接口测试方法
  6. 图像算法五 —— EM算法
  7. IDEA的mysql报错[08S01] 解决办法
  8. 国产 android 平板,三大旗舰新品 国产Android系统平板对比
  9. sbus storm32bgc_STorM32 BGC三轴增稳云台固件更新
  10. 电路交换、报文交换、分组交换三种数据交换方式的特点、优点、应用场景以及技术对比分析