五、 Usb setting 中tethering 设置流程

本文详细解析了Android系统中USB Tethering功能的实现流程,从用户界面操作出发,介绍如何通过设置应用触发USB共享网络的过程,并深入探讨了底层服务间的交互机制。
AI助手已提取文章相关产品:

转自: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);


您可能感兴趣的与本文相关内容

内容概要:本文介绍了“快速LDP-MST”这一针对大型数据集的高效基于密度峰值的聚类方法,并提供了完整的Matlab代码实现。该方法通过构建最小生成树(MST)并融合密度峰值聚类思想,有效提升了传统算法在处理大规模、复杂分布数据时的聚类效率与准确性,尤其适用于高维与非球形簇结构的数据分析任务。文章不仅阐述了算法的核心原理与技术优势,还强调了科研过程中逻辑思维、创新意识与“借力”工具的重要性,倡导研究者善用现有资源加速科研进程。; 适合人群:具备一定编程基础,特别是熟悉Matlab语言,从事数据科学、机器学习、模式识别或相关领域的科研人员、工程师及研究生;尤其适合正在开展聚类算法研究或需要高效处理大规模数据的开发者。; 使用场景及目标:①在大规模数据集中实现高效、精确的聚类分析;②研究基于密度与图论结合的聚类算法设计原理与优化路径;③通过提供的Matlab代码快速搭建实验环境,验证算法性能,或在此基础上进行二次开发与算法改进。; 阅读建议:此资源以Matlab代码为核心支撑,建议读者结合算法理论与工程实践,按照文档结构循序渐进地学习,充分利用所提供的网盘代码与模型资源,动手运行、调试并可视化算法结果,从而深入理解快速LDP-MST算法的设计思想与实现细节,提升科研效率与创新能力。
内容概要:本文围绕考虑电动汽车灵活性的微网多时间尺度协调调度问题展开研究,提出了一种基于Matlab的代码实现方案。研究充分利用电动汽车作为移动储能单元所具有的时空灵活性,将其整合到微网能量管理系统中,构建了涵盖日前计划与实时调整两个时间尺度的协调优化调度模型。模型综合考虑了可再生能源(如光伏发电)的波动性、负荷需求变化、分时电价机制以及电动汽车用户的充放电行为等多重因素,通过建立以最小化系统综合运行成本为目标的优化问题,并结合适当的约束条件,采用优化算法求解,从而实现对微网内多种分布式资源的高效协同调度。该方法有效提升了微网对可再生能源的消纳能力和系统运行的经济性与稳定性。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事微网、智能电网相关工作的工程技术人员。; 使用场景及目标:①用于教学与科研中深入理解微网多时间尺度调度的机制与建模方法;②为实际微网工程项目中引入电动汽车参与需求响应与调度提供理论依据和可复用的仿真工具;③支撑在能源互联网背景下开展关于需求响应、分布式能源集成及灵活性资源优化利用的前沿研究。; 阅读建议:建议读者结合提供的Matlab代码,逐步理解从问题建模、目标函数设计、约束条件设定到最终优化求解的完整流程,重点关注电动汽车灵活性建模与多时间尺度协调策略的具体实现方式。同时,可通过修改电动汽车渗透率、改变充电策略或调整电价信号等参数进行扩展实验,以深化对系统灵活性资源调度效果与影响因素的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值