Android11编译第二弹:USB连接MTP模式+USB调试+USB信任

这篇具有很好参考价值的文章主要介绍了Android11编译第二弹:USB连接MTP模式+USB调试+USB信任。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、为什么需要开启USB信任和ADB调试

问题1:原始的AOSP,如果通过USB连接设备以后,会弹窗提示用户选择连接模式:MTP,大容量磁盘,照片等模式;

问题2:USB连接设备以后,需要开启USB调试模式,才方便操作adb调试;

问题3:USB设备连接以后,电脑会弹窗是否信任设备,需要点击信任当前设备,否则设备连接不成功。

使用场景:我们是自己的系统,需要支持设备USB连接,以及adb远程调试(USB调试和TCP调回),因此,系统需要默认支持USB连接,支持USB调试,默认信任连接的设备。

二、集成步骤

2.1 关闭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。

2.2 授权ADB调试5555端口

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=====

2.3 接收到USB连接默认开启USB调试

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调试。

2.4 USB授权默认信息

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连接。

 2.5 USB连接默认为MTP模式

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 =================

2.6 Release默认开启ADB调试

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调试

2.7 post_process_props.py开启adb调试

build/make/tools/post_process_props.py文章来源地址https://www.toymoban.com/news/detail-691250.html

  # 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)

到了这里,关于Android11编译第二弹:USB连接MTP模式+USB调试+USB信任的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Studio用usb数据线,连接自己的手机进行调试

    USB调试是一种开发工具,用于在Android设备和计算机之间建立调试连接,以便在开发和测试应用程序时进行调试。 注:在第一次开启USB调试,USB下载时会可能出现让你选 CSI CMS ARM64 GSI ARM64 简单说一下,如果您想支持 Google 移动服务(如Play 商店等),请选择GSI ARM64+GMS,否则G

    2024年02月02日
    浏览(42)
  • STP和MTP(第二十二课)

    2、如何实现 1)在MSTP网络种,引入了域的概念,称为MST域 2)每一个MST域中包含一个或多个“生成树”称为“实例” 3)每个“实例生成树”都可以绑定vlan,实现vlan数据流的负载分担/负载均衡 4)默认情况下,所有的vlan都属于“实例树0:即:instance 0” 5)不同的“实例树”、

    2024年02月15日
    浏览(41)
  • android adb wifi和usb 调试设备

    一.usb连接设备 一般情况下,我们通过usb连接(手机,平板或者车载设备),调试的时候,只需要用usb线连接电脑,然后在Settings关于phone中,点击Build Number 7次,开启开发者模式,再在开发者模式中打开usb调试即可。 二.wifi连接设备 可以用wifi通过标准的TCP/IP连接android设备,

    2024年02月12日
    浏览(43)
  • 华为荣耀系列uniapp无法USB连接手机调试问题解决方案汇总

    华为荣耀系列是一个异常奇葩的手机,经常出现无法调试的问题。 目前我整理出一套完整的切实多次测试可行的解决方案。 一、打开手机的 关于手机 设置里面-一直快速点击版本号,连续点10几下。 此时处于开发者模式。 二、打开 开发者选项 1、打开开发者人员选项 2、打

    2024年02月08日
    浏览(100)
  • Flutter:如何在Android中实现USB转串口通信调试

            本文介绍如何通过flutter_usb_serial插件在Flutter中实现USB转串口通信调试。 1、引入依赖         在flutter工程的pubspec.yaml文件中引入flutter_usb_serial依赖: 2、导入import依赖包         在dart代码中import导入usb_serial/usb_serial.dart就可以使用了。 3、读取所有USB口设备    

    2024年02月14日
    浏览(31)
  • Vue学习——【第二弹】

    上一篇文章 Vue学习——【第一弹】 中我们学习了Vue的相关特点及语法,这篇文章接着通过浏览器中的 Vue开发者工具扩展 来进一步了解Vue的相关工作机制。 我们打开Vue的官方文档,点击导航栏中的 生态系统 ,点击 Devtools 接着我们就进入了 github 中,点击右栏的链接: 之后

    2023年04月09日
    浏览(27)
  • Java 基础学习第二弹

    HashMap和Hashtable是两种常见的哈希表数据结构,它们在实现上有一些区别。 线程安全性:Hashtable是线程安全的,而HashMap不是。Hashtable的方法都是同步的,可以在多线程环境中使用,但这样会造成一定的性能开销。HashMap是非线程安全的,如果在多个线程中同时修改HashMap,可能

    2024年02月05日
    浏览(30)
  • PMP练习题 第二弹

    一个多阶段项目发起人离开公司,项目文件已获得批准并满足其目标。资源预算已到位。项目经理接下来应该怎么做? A:在离开组织的发起人的主管同意下,评估项目的持续需求 B:立即开始项目收尾过程 C:检查与商业论证的符合性 D:延迟重新评估,直至项目结束且资金

    2024年02月07日
    浏览(30)
  • Python 基础面试第二弹

    在Python中,面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将数据和操作数据的方法组织在一起,形成对象。面向对象的编程主要围绕着类(Class) 和对象(Object)展开,通过封装、继承和多态等概念,实现代码的重用性、可维护性和可扩展性。 Python中的

    2024年02月11日
    浏览(34)
  • 数据库基础面试第二弹

    乐观锁和悲观锁是在并发编程中使用的两种并发控制机制,用于解决多线程或多进程环境下的数据一致性问题。 1. 悲观锁 (Pessimistic Locking): 悲观锁的思想是假设并发访问会导致冲突,因此在访问共享资源之前,悲观锁会将资源锁定,确保其他线程无法修改资源。悲观锁的

    2024年02月10日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包