赞
踩
问题1:原始的AOSP,如果通过USB连接设备以后,会弹窗提示用户选择连接模式:MTP,大容量磁盘,照片等模式;
问题2:USB连接设备以后,需要开启USB调试模式,才方便操作adb调试;
问题3:USB设备连接以后,电脑会弹窗是否信任设备,需要点击信任当前设备,否则设备连接不成功。
使用场景:我们是自己的系统,需要支持设备USB连接,以及adb远程调试(USB调试和TCP调回),因此,系统需要默认支持USB连接,支持USB调试,默认信任连接的设备。
frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java
- @Override
- public void onCreate(Bundle icicle) {
- ...(省略)
- /**
- final AlertController.AlertParams ap = mAlertParams;
- ap.mTitle = getString(R.string.usb_debugging_title);
- ap.mMessage = getString(R.string.usb_debugging_message, fingerprints);
- ap.mPositiveButtonText = getString(R.string.usb_debugging_allow);
- ap.mNegativeButtonText = getString(android.R.string.cancel);
- ap.mPositiveButtonListener = this;
- ap.mNegativeButtonListener = this;
- // add "always allow" checkbox
- LayoutInflater inflater = LayoutInflater.from(ap.mContext);
- View checkbox = inflater.inflate(com.android.internal.R.layout.always_use_checkbox, null);
- mAlwaysAllow = (CheckBox)checkbox.findViewById(com.android.internal.R.id.alwaysUse);
- mAlwaysAllow.setText(getString(R.string.usb_debugging_always));
- ap.mView = checkbox;
- window.setCloseOnTouchOutside(false);
- setupAlert();
- **/
- notifyService(true,true);
- finish();
- }
默认只要USB连接设备,默认就开启USB调试。关键方法是notifyService
- /**
- * Notifies the ADB service as to whether the current ADB request should be allowed, and if
- * subsequent requests from this key should be allowed without user consent.
- *
- * @param allow whether the connection should be allowed
- * @param alwaysAllow whether subsequent requests from this key should be allowed without user
- * consent
- */
- private void notifyService(boolean allow, boolean alwaysAllow) {
- try {
- IBinder b = ServiceManager.getService(ADB_SERVICE);
- IAdbManager service = IAdbManager.Stub.asInterface(b);
- if (allow) {
- service.allowDebugging(alwaysAllow, mKey);
- } else {
- service.denyDebugging();
- }
- mServiceNotified = true;
- } catch (Exception e) {
- Log.e(TAG, "Unable to notify Usb service", e);
- }
- }
这个方法很简单,通过ADB服务,设置允许调试。
mKey是什么呢?就是设备指纹,即我们常说的设备SN。
device/qcom/lahaina/init.target.rc
- #Allow access to memory hotplug device attributes
- chown system system /sys/kernel/mem-offline/anon_migrate
- # ==== modify start===== zhouronghua open adb debug port 5555
- setprop service.adb.tcp.port 5555
- # ==== modify end=====
frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java
在其中有监听USB连接和断开的广播接收器UsbDisconnectedReceiver,
- private class UsbDisconnectedReceiver extends BroadcastReceiver {
- ...(省略)
- @Override
- public void onReceive(Context content, Intent intent) {
- String action = intent.getAction();
- if (!UsbManager.ACTION_USB_STATE.equals(action)) {
- return;
- }
- // ====== modify begin ==========
- // fix: zhouronghua usb debug default auth
- // boolean connected = intent.getBooleanExtra(UsbManager.USB_CONNECTED, false);
- boolean connected = false;
- if (!connected) {
- Log.d(TAG, "USB disconnected, notifying service");
- // notifyService(false);
- mActivity.finish();
- }
- // open adb debugging
- notifyService(true, true);
-
- // =========== modify end ==========
- }
- }
开启USB调试,直接开启ADB调试即可,不需要单独开启USB调试,TCP调试。
frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java
- @Override
- public void onCreate(Bundle icicle) {
- ...(省略)
-
- setupAlert();
- // ======= modify begin =========
- // fix: zhouronghua usb default trust devices
- Log.d(TAG, "grant usb permission automatically");
- mPermissionGranted = true;
- finish();
- // ======= modify end =======
-
- }
默认同意授权USB连接。
USB管理器接收到USB连接监听
frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java
USB连接默认采用MTP模式,且开启ADB调试。
- @Override
- public void handleMessage(Message msg) {
- ...(省略)
- if (mBootCompleted) {
- if (!mConnected && !hasMessages(MSG_ACCESSORY_MODE_ENTER_TIMEOUT)
- && !hasMessages(MSG_FUNCTION_SWITCH_TIMEOUT)) {
- // restore defaults when USB is disconnected
- // fix: zhouronghua usb debug mode
- //if (!mScreenLocked
- // && mScreenUnlockedFunctions != UsbManager.FUNCTION_NONE) {
- // setScreenUnlockedFunctions();
- //} else {
- //setEnabledFunctions(UsbManager.FUNCTION_NONE, false);
- // USB connect enable
- setEnabledFunctions(UsbManager.USB_FUNCTION_MTP, false);
- // adb enable
- setAdbEnabled(true)
- //}
- }
- updateUsbFunctions();
-
- }
-
- protected void finishBoot() {
- if (mBootCompleted && mCurrentUsbFunctionsReceived && mSystemReady) {
- if (mPendingBootBroadcast) {
- updateUsbStateBroadcastIfNeeded(getAppliedFunctions(mCurrentFunctions));
- mPendingBootBroadcast = false;
- }
- // ========== modify start ===========
- //if (!mScreenLocked
- // && mScreenUnlockedFunctions != UsbManager.FUNCTION_NONE) {
- // setScreenUnlockedFunctions();
- //} else {
- // setEnabledFunctions(UsbManager.FUNCTION_NONE, false);
- //}
- // fix: zhouronghua USB enable
- setEnabledFunctions(UsbManager.USB_FUNCTION_MTP, false);
- // adb enable
- setAdbEnabled(true);
- // ======== modify end =================
build/make/core/main.mk
- build/make/core/main.mk
-
- ifeq (true,$(strip $(enable_target_debugging)))
- # Target is more debuggable and adbd is on by default
- ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1
- # Enable Dalvik lock contention logging.
- ADDITIONAL_BUILD_PROPERTIES += dalvik.vm.lockprof.threshold=500
- else # !enable_target_debugging
- # Target is less debuggable and adbd is off by default
- # ==== mofify begin ===== zhouronghua fix: adb debug mode
- ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1
- # ==== modify end ====
- endif # !enable_target_debugging
在Release版本也允许进行ADB调试
build/make/tools/post_process_props.py
- # 1. 注释掉if prop.get("ro.debuggable") == "1"判断,Release也允许调试
- # ==== modify begin fix: zhoronghua open adb debug mode
- # if prop.get("ro.debuggable") == "1":
- # ==== modify end ====
-
- # 因为注释掉判断,判断体重的内容整体往前缩进
- val = prop.get("persist.sys.usb.config")
- if "adb" not in val:
- if val == "":
- val = "adb"
- else:
- val = val + ",adb"
- prop.put("persist.sys.usb.config", val)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。